2011-05-24 54 views
2

我曾经看到有人建议将参数复制到本地变量以避免参数在存储过程中嗅探。假设你有在SQL Server 2005中解决参数嗅探

CREATE PROCEDURE List_orders_3 @fromdate datetime AS 
DECLARE @fromdate_copy datetime 
SELECT @fromdate_copy = @fromdate 
SELECT * FROM Orders WHERE OrderDate > @fromdate_copy 

(我得到这个从http://www.sommarskog.se/query-plan-mysteries.html但我需要更多的细节,充分理解它)。

但是,这对于查询计划缓存和查询计划优化器实际做了什么?如果优化器对@fromdate_copy没有任何假设是真的,那为什么它不会缓存最有可能成为全表扫描的计划(因为它不做任何假设,它怎么会产生其他东西)?

这种技术基本上就像一个“没有投入将运行良好,但没有投入将运行非常可怕”?

回答

2

实际上,您需要为您声明的@fromdate_copy字段指定一个默认变量,以便当查询引擎查看查询本身时,它将计划基于“硬编码”值 - 但传递相反,当实际查询被执行,它就会用值执行并切换..

根·亨德森(上师自己)很详细解释这一点:http://blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx

如果可以的话,他的阅读书 - 它们提供了关于sql server内部信息的大量信息:http://www.amazon.com/Gurus-Guide-Server-Architecture-Internals/dp/0201700476/ref=pd_bxgy_b_text_c

我不确定他是否有为新版本写的东西,但一些基本原理没有改变那么多......

+0

不幸的是肯在2008年去世了。 – 2011-05-24 17:24:15

+0

仅供参考这是“参数掩蔽” – gbn 2011-05-24 19:16:28

+0

rellly ... 我不知道 :( – 2011-05-24 23:31:35