日期表达式查询:使用字符串文字更快
在条件内使用日期表达式的查询(如以下示例所示)通常表现缓慢SQL Server 2008 中的性能:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
但是,据观察,替换带有字符串文字的日期表达式(例如“2013-05-01”)会显着加快查询执行速度。这种差异让许多开发人员感到困惑。
性能差异是由 SQL Server 2008 中的一个内部错误引起的,该错误影响了使用日期表达式时估计结果基数的方式。当出现像问题中那样的日期表达式时,SQL Server 错误地认为它表示与指定月份的第一个日期相对应的常量值。这会导致基数估计不准确,从而导致查询计划效率低下。
另一方面,使用字符串文字作为日期值会迫使 SQL Server 在运行时面对实际值并得出更精确的基数估计。这允许优化器生成更优化的查询计划,从而加快执行速度。
要绕过此错误,可以使用以下替代表达式:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
此表达式返回一个常量表示当月第一天的日期值,这与查询的预期行为一致。通过这种替换,优化器可以准确估计基数并生成更高效的查询计划,解决与日期表达式相关的性能瓶颈。
以上是为什么 SQL Server 2008 日期表达式查询比字符串文字查询慢?的详细内容。更多信息请关注PHP中文网其他相关文章!