以不同顺序使用 DATEADD 和 CAST 时的性能差异

Performance difference when using DATEADD and CAST in different order

一位同事向我展示了一个问题,他在同时使用 DATEADD 和 CAST 时遇到了一些严重的性能问题。通过改变顺序,他获得了更好的表现。为什么顺序对性能如此重要?

这个 where 子句运行良好:

WHERE IHist.[DateTime] BETWEEN DATEADD(DD, -30,CAST(GETUTCDATE() AS Date)) AND DATEADD(DD, 1, CAST(GETUTCDATE() AS Date))

这个 where 子句永远有效:

WHERE IHist.[DateTime] BETWEEN CAST(DATEADD(DD, -30,GETUTCDATE()) AS DATE) AND CAST(DATEADD(DD, 1, GETUTCDATE()) AS DATE)

由于值是静态的,最好在开头定义它们

declare @d1 date, @d2 date
select
    @d1 = DATEADD(DD, -30, CAST(GETUTCDATE() AS Date)),
    @d2 = DATEADD(DD,   1, CAST(GETUTCDATE() AS Date))

然后在WHERE子句中使用