WHERE 子句中的优化日期比较,转换还是 datediff=0?

Kaz*_*kit 5 performance sql-server execution-plan query-performance

在我的查询中,我比较了WHERE子句中的两个日期

一旦使用CONVERT

CONVERT(day,InsertedOn) = CONVERT(day,GETDATE())
Run Code Online (Sandbox Code Playgroud)

另一个使用DATEDIFF

DATEDIFF(day,InsertedOn,GETDATE()) = 0
Run Code Online (Sandbox Code Playgroud)

这是执行计划

对于第一个使用 CONVERT 在此处输入图片说明

对于第二个使用 DATEDIFF 在此处输入图片说明

的数据类型InsertedOndatetime

哪个更优化?

Dan*_*her 7

相反,尝试

WHERE InsertedOn>=CAST(GETDATE() AS date) AND
      InsertedOn<DATEADD(day, 1, CAST(GETDATE() AS date))
Run Code Online (Sandbox Code Playgroud)

这个表达式是sargable,这是您想要的最佳性能。就像@Mikael 指出的那样,您最好设计一个索引,使其InsertedOn成为第一列,并且查询中使用的所有其他列都包含在索引中。如果查询中有很多列,最好使用表的聚集索引。阅读覆盖索引

  • Martin Smith 在一个相关问题上有一个很好的答案:[Cast to date is sargable but it is a good idea?](http://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-但这是个好主意/34052#34052) (4认同)