要比较的不同sql查询日期

dfuffjeb  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(192)

我试着从不到14天的邮件表中抓取记录。只是想知道以下两个查询是否有性能差异?

select * 
  from email e
  where  DATEDIFF(day, e.recevied_date, cast(GETDATE() as date)) < 14

  select * 
  from email e
  where (GETDATE() - e.recevied_date) < 14
3mpgtkmj

3mpgtkmj1#

编写这个 predicate 的一种可行的方法,即sql server可以在 e.received_date 列,将是:

where e.received_date > dateadd(day, -14, getdate())

通过这种构造,不需要对received\ u date列中的数据计算表达式,右侧的计算结果是常量表达式。
如果将列放入表达式中,例如 datediff(day, e.received_date, getdate()) 然后SQLServer必须计算表中的每一行,然后才能判断它是否小于14。这就排除了索引的使用。
因此,在你目前拥有的两种结构之间实际上应该没有什么显著的区别,因为这两种结构都比sargable predicate 慢得多,特别是如果这个 predicate 上有一个索引的话 received_date 列。

9vw9lbht

9vw9lbht2#

这两个表达式不相等。
第一个计算两个日期之间的午夜数,因此返回完整的天数。
第二个是时间。
如果您想在这么多天之前就有完整的天数,最好的方法是:

where e.received_date >= convert(date, dateadd(day, -14, getdate()))

这个 >= 包括午夜。
这是更好的,因为只有操作是在 getdate() --实际上,这些可以在主执行阶段之前处理。这允许查询利用上的索引、分区和统计信息 e.received_date .

相关问题