【发布时间】:2010-02-08 22:21:29
【问题描述】:
我正在维护 SQL Server 2005 的存储过程,我希望我可以在 2008 年使用允许查询提示的新功能:“OPTIMIZE FOR UNKNOWN”
似乎以下查询(为 SQL Server 2005 编写)估计的行数(即选择性)与指定了 OPTION (OPTIMIZE FOR UNKNOWN) 一样:
CREATE PROCEDURE SwartTest(@productid INT)
AS
DECLARE @newproductid INT
SET @newproductid = @productid
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE ProductID = @newproductid
此查询通过声明和设置新变量来避免参数嗅探。这真的是针对 OPTIMIZE-FOR-UNKNOWN 功能的 SQL Server 2005 解决方法吗?还是我错过了什么? (感谢权威链接、答案或测试结果)。
更多信息: 对 SQL Server 2008 的快速测试告诉我,此查询中估计的行数实际上与指定 OPTIMIZE FOR UNKNOWN 相同。这与 SQL Server 2005 上的行为相同吗?我想我记得曾经听说过没有更多信息,SQL Server 优化引擎必须猜测参数的选择性(对于不等式谓词,通常为 10%)。不过,我仍在寻找有关 SQL 2005 行为的明确信息。我不太确定信息是否存在......
更多信息 2: 需要明确的是,这个问题要求比较 UNKNOWN 查询提示和我描述的参数屏蔽技术。
这是一个技术问题,而不是解决问题的问题。我考虑了很多其他选择并最终决定了这一点。所以这个问题的唯一目的是帮助我获得一些信心,这两种方法是等效的。
【问题讨论】:
-
查看 Kimberly Tripp 的文章 sqlskills.com/blogs/kimberly/post/ProcsPSPandDNR.aspx 并搜索“与 OPTIMIZE FOR UNKNOWN 完全相同”。我愿意相信她:-)
标签: sql-server sql-server-2005