【问题标题】:Best way to filter datetime2 with a date用日期过滤 datetime2 的最佳方法
【发布时间】: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吗?

【问题讨论】:

  • 为什么CASTMyDatetimeCol 在这里?如果是因为您不想要与@MyDateVariable 在同一日期的值?是这样,为什么不直接将@MyDateVariable 的天数增加1 并使用>=
  • DATE conversions are indeed sometimes SARGable 作为优化器中的特例。 IN 是微不足道的 SARGable,因为它在内部被重写为与 OR 子句 (mystringCol = 'x' OR myStringCol = 'y' ...) 的一系列相等比较,当然,这本身并不能保证有效的计划。
  • @Larnu 这是casted,因为我想 100% 确定它有效,而且是在我了解 SARGABLE 之前...我将移除演员...谢谢

标签: sql-server tsql query-performance


【解决方案1】:

如果您似乎在这里过于复杂化了事情。我能看出你为什么要在表达式 MyDatetimeCol > @MyDateVariable 中转换 MyDatetimeCol 日期的唯一原因是,当 @MyDateVariable 的值是 20201103 时,像 '2020T-11-03T11:00:00 这样的值会返回 false。

如果这种情况,不要使用>,而是使用>=并将@MyDateVariable的值加一,那么它在语义上是相同的:

DECLARE @MyDateVariable date = '20201104'; --was 20201103 before

SELECT ...
FROM ...
WHERE ...
  AND MyDatetimeCol >= @MyDateVariable;

CAST(MyDatetimeCol AS date) > @MyDateVariableMyDatetimeCol >= DATEADD(DAY,1,@MyDateVariable) 是有效的同义词,除此之外,后者的性能更高。

【讨论】:

  • 谢谢,必须是> @MyDateVariable@MyDateVariable 是我在脚本中计算出来的 30 天...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
相关资源
最近更新 更多