我试着从不到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
3mpgtkmj1#
编写这个 predicate 的一种可行的方法,即sql server可以在 e.received_date 列,将是:
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 列。
datediff(day, e.received_date, getdate())
received_date
9vw9lbht2#
这两个表达式不相等。第一个计算两个日期之间的午夜数,因此返回完整的天数。第二个是时间。如果您想在这么多天之前就有完整的天数,最好的方法是:
where e.received_date >= convert(date, dateadd(day, -14, getdate()))
这个 >= 包括午夜。这是更好的,因为只有操作是在 getdate() --实际上,这些可以在主执行阶段之前处理。这允许查询利用上的索引、分区和统计信息 e.received_date .
>=
getdate()
2条答案
按热度按时间3mpgtkmj1#
编写这个 predicate 的一种可行的方法,即sql server可以在
e.received_date
列,将是:通过这种构造,不需要对received\ u date列中的数据计算表达式,右侧的计算结果是常量表达式。
如果将列放入表达式中,例如
datediff(day, e.received_date, getdate())
然后SQLServer必须计算表中的每一行,然后才能判断它是否小于14。这就排除了索引的使用。因此,在你目前拥有的两种结构之间实际上应该没有什么显著的区别,因为这两种结构都比sargable predicate 慢得多,特别是如果这个 predicate 上有一个索引的话
received_date
列。9vw9lbht2#
这两个表达式不相等。
第一个计算两个日期之间的午夜数,因此返回完整的天数。
第二个是时间。
如果您想在这么多天之前就有完整的天数,最好的方法是:
这个
>=
包括午夜。这是更好的,因为只有操作是在
getdate()
--实际上,这些可以在主执行阶段之前处理。这允许查询利用上的索引、分区和统计信息e.received_date
.