2

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

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

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

4

1 回答 1

2

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

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

于 2011-05-24T17:17:32.753 回答