【问题标题】:Getting Around Parameter Sniffing in SQL Server 2005绕过 SQL Server 2005 中的参数嗅探
【发布时间】:2011-09-01 03:03:00
【问题描述】:

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

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 做出任何假设,那么为什么它不会缓存最有可能是全表扫描的计划(因为它没有做出任何假设,它怎么会生成其他任何东西呢? )?

这种技术基本上就像“没有输入会运行良好,但也没有输入会运行得非常糟糕”吗?

【问题讨论】:

    标签: sql-server sql-server-2005 parameter-sniffing


    【解决方案1】:

    实际上,您需要为您声明的 @fromdate_copy 字段分配一个默认变量,这样当查询引擎查看查询本身时,它会根据“硬编码”的值制定计划 - 但取而代之的是,当查询实际执行时,它会使用传入和切换的值执行..

    Ken Henderson(Guru 本人)对此进行了详细解释: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

    我不确定他是否为较新的版本写过任何东西,但一些基本原理并没有太大变化...

    【讨论】:

    • 不幸的是,肯于 2008 年去世。
    • 仅供参考,这是“参数屏蔽”
    • rellly...我不知道 :(
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2010-09-17
    • 2019-01-18
    • 1970-01-01
    • 2012-10-10
    • 2016-05-30
    • 2011-03-22
    • 2014-09-28
    相关资源
    最近更新 更多