需要重做一个查询(许多内连接,大约有20个表),它使用当前日期(getdate()
)来选择项目。
请求是允许用户指定某个日期而不是getdate()
。
声明变量@mydate
为datetime = getdate()
,并使用getdate()
替换查询中的所有@mydate
。
查询执行时间从10秒跳到6分钟!并且执行计划完全改变了。
花了很长时间调查发生这种情况的原因,最后一次
option (optimize for (`@mydate = '2000-01-01'`))
做了这个伎俩 - 尽管它看起来像是一些不必要的东西,因为我的变量定义看起来像
declare @mydate as datetime = getdate()
并且不应该为变体解释提供空间?
我的问题:
在T-SQL中一般建议在所有查询中指定变量示例值,或者仅datetime
a(可能,这不是我的经验中的一般问题)问题吗?
答案 0 :(得分:2)
这实际上与变量恰好是日期时变量这一事实无关,它是查询优化器逻辑的工件。
当您使用常量(或getdate())时,优化器会在确定可用于进行最佳查询的索引等时理解它如何使用该表达式。
正如您所发现的那样,选项优化基本上可以恢复已知的"常数"查询版本,因此它会再次快速运行。
多年来,我多次反对这个问题,解决方案并不总是很明显 - 也就是说,你不能自动使用选项优化来修复它。它以多种方式显示,如this article中有问题的执行计划所示。ADDED
我做了一些搜索,发现Constant Folding and Expression Evaluation During Cardinality Estimation与您的具体问题有关。