【发布时间】:2020-11-03 11:44:34
【问题描述】:
我有一列是datetime2,我想使用date 变量进行过滤。目前我使用:
where mystringCol in ('x', 'y', 'z') and cast(MyDatetimeCol as date) > @MyDateVariable.
在执行计划中,它在(mystringCol, MyDatetimeCol) 上的覆盖非聚集索引上使用搜索,该索引在include 部分中有多个列。
关于谓词是SARGABLE。所以它似乎是 SARGABLE 即使它做错了一切,即使用函数 (cast) 并使用 in?
我还需要cast吗?
【问题讨论】:
-
为什么
CAST列MyDatetimeCol在这里?如果是因为您不想要与@MyDateVariable在同一日期的值?是这样,为什么不直接将@MyDateVariable的天数增加1 并使用>=? -
DATEconversions are indeed sometimes SARGable 作为优化器中的特例。IN是微不足道的 SARGable,因为它在内部被重写为与OR子句 (mystringCol = 'x' OR myStringCol = 'y' ...) 的一系列相等比较,当然,这本身并不能保证有效的计划。 -
@Larnu 这是
casted,因为我想 100% 确定它有效,而且是在我了解 SARGABLE 之前...我将移除演员...谢谢
标签: sql-server tsql query-performance