DateTimeOffset的执行计划行为

时间:2015-07-17 00:52:40

标签: sql-server sql-server-2008 tsql

我正在尝试确定在处理DateTimeoffset字段时在SQL Server中查询日期范围的最佳方法。

我的查询

enter image description here

我会想(如果有的话)第一个查询需要稍加努力,因为需要从String到DateTimeOffset的隐式转换。

实际查询计划显示了一些不同的故事

enter image description here

似乎问题在于估计的行数?

所以 - 在所有条件相同的情况下,为什么使用datetimeoffset参数而不是字符串错误地估计返回的行数,因此需要执行多个数量级的资源?显示查询成本占批量的96%?即使这是 实际 查询计划,查询的费用是否仅为估算值?

enter image description here

统计数据是准确且最新的,我在运行查询之前清理了proc缓存

enter image description here

1 个答案:

答案 0 :(得分:2)

使用文字,使用直方图统计数据,因为该值在编译时是已知的。使用局部变量在编译时未知该值,因此使用平均密度统计信息,从而产生不同的行计数估计值。

您可以将OPTION RECOMPILE查询提示添加到"嗅探"运行时变量值或使用参数化查询。这些方法将使用直方图进行行计数估算。后者还将缓存计划,以便只要计划保留在缓存中,后续执行将使用相同的计划,而不管值是什么。

这是一般行为,并非特定于datetimeoffset数据类型。