绕过 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 做出任何假设,那么为什么它不会缓存最有可能进行全表扫描的计划(因为它没有做出任何假设,它怎么可能生成其他任何内容) )?
这种技术基本上就像“没有输入会运行良好,但没有输入也会运行得很糟糕”?
I have seen people suggest copying the parameters to a local variable to avoid parameter sniffing in a stored proc. Say you have
CREATE PROCEDURE List_orders_3 @fromdate datetime AS
DECLARE @fromdate_copy datetime
SELECT @fromdate_copy = @fromdate
SELECT * FROM Orders WHERE OrderDate > @fromdate_copy
(I got this from http://www.sommarskog.se/query-plan-mysteries.html but I need more details to understand it fully).
But what does this actually do to the query plan cache and query plan optimizer? If it is true that the optimizer makes no assumptions about @fromdate_copy, then why is it that it won't cache a plan that is most likely going to be a full table scan (since it makes no assumptions, how could it generate anything else)?
Is this technique basically like a "no inputs will run well, but no input will run terribly either" ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
实际上,您需要为您声明的 @fromdate_copy 字段分配一个默认变量,以便当查询引擎查看查询本身时,它会基于“硬编码”的值制定计划 - 但相反,当查询实际上被执行,它是通过传入和切换的值来执行的。Ken
Henderson(大师本人)对此进行了非常详细的解释: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
我不确定他是否为新版本编写了任何内容,但一些基础知识还没有'变化这么大...
Actually, you need to assign a default variable to the @fromdate_copy field that you declare, so that when the query engine looks at the query itself, it bases a plan on the value that is 'hard-coded' - but instead, when the query actually gets executed, it gets executed with the value being passed in and switched..
Ken Henderson (the Guru himself) explained this in great detail: http://blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx
If you can, read his books - they offer a plethora of information about sql server internals: http://www.amazon.com/Gurus-Guide-Server-Architecture-Internals/dp/0201700476/ref=pd_bxgy_b_text_c
I'm not sure if he has anything written for the newer versions, but some of the fundamentals haven't changed that much...