我有一个适用于WHERE
子句的查询。
WHERE DATEDIFF(day, [EventStartDateTime], GETDATE()) <= 60
或
WHERE EventStartDateTime < DATEADD(DY, -60, GETDATE())
我的问题是,哪个更有效率?怎么样?有没有办法在未来衡量这一点来测试自己?
答案 0 :(得分:2)
使用第二个,它是sargable并且可以使用索引(如果存在)
EventStartDateTime < DATEADD(DY, -60, GETDATE())
同样WHERE
条款不是Sargabilty重要的唯一地方。它也可以对ORDER BY,GROUP BY和HAVING子句产生影响。
有没有办法在将来衡量这一点来测试自己?
您可以查看execution plan,查看它是在进行搜索还是扫描。 这并不意味着搜索是好的或扫描是坏的。当你有索引并且它是Sargable时,它会尝试*寻找值,而不是扫描整个表
请参阅以下链接,其中包含@AdatheDev在评论中所指出的更多详细信息。
答案 1 :(得分:0)
=IF(LEN(AF443)-LEN(INT(AF443)) = 0, 0, LEN(AF443)-LEN(INT(AF443))-1)
这种方式有效的原因是它使查询更加优化,因为索引将放在 SELECT <column list>
FROM schemaname.tablename -- please always specify schema
WHERE EventStartDateTime < DATEADD(DY, -60, GETDATE())
上。如果今天你没有放索引,你可能希望将来使用它。因此将EventStartDateTime
等函数应用于列将始终使表达式更复杂,因此它将始终使用效率较低的扫描(如果使用单个搜索谓词(。)。