与字符串文字值相比,在 WHERE 子句中使用日期表达式时,查询会出现明显的速度下降,从而导致查询性能陷入困境。让我们更深入地研究这个问题并寻求解决方案。
性能差距的产生是由于 SQL Server 2008 中的一个错误,该错误会影响在日期表达式中使用日期表达式时的基数估计。 WHERE 子句。该错误会导致匹配行数的估计不正确。
为了规避此错误,建议使用以下优化查询:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
此表达式返回当前月份的开始时间,这可能是此场景中所需的选择标准。
或者,可以启用跟踪标志 4199 以强制进行准确的基数估计。打开跟踪标志 4199 时,以下查询还将生成所需的计划:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE) OPTION (QUERYTRACEON 4199)
例如,名为 FK 的表包含名为 DT 的列,其值表示开始每个月的以下两个查询展示了性能差异:
-- Slow due to incorrect cardinality estimates SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) -- Fast due to accurate cardinality estimates with trace flag 4199 SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) OPTION (QUERYTRACEON 4199)
启用跟踪标志 4199,由于优化的查询计划,第二个查询将显着加快执行时间。
以上是为什么在 WHERE 子句中使用日期时间表达式时 My SQL Server 2008 查询速度很慢?的详细内容。更多信息请关注PHP中文网其他相关文章!