绕过 SQL Server 2005 中的参数嗅探

发布于 2024-11-09 21:46:27 字数 580 浏览 1 评论 0原文

我看到人们建议将参数复制到局部变量,以避免在存储过程中进行参数嗅探。假设你有

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

め七分饶幸 2024-11-16 21:46:28

实际上,您需要为您声明的 @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...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文