首页 > 解决方案 > SQL:在sql server中的where条件下使用year函数和查询两个日期之间的性能有什么区别

问题描述

如果我们有一个“订单”表和这样的列

+------------+-----------------------+
|   Orders   |                       |
+------------+-----------------------+
| OrderId    | => clustered index    |
| CustomerId |                       |
| OrderDate  | => nonclustered index |
+------------+-----------------------+

所以我的问题是,这些查询之间的核心区别是什么,主要从性能角度来看哪一个更好

select * from Orders 
where OrderDate >= '2000-01-01' and OrderDate <= '2000-12-31' 

select * from Orders 
where YEAR(OrderDate) = 2000

标签: sqlsql-server

解决方案


这个查询:

select *
from Orders 
where OrderDate >= '2000-01-01' and OrderDate <= '2000-12-31' 

可以利用有助于优化查询的三件事:

  • 上的索引OrderDate
  • 上的分区OrderDate
  • 保持统计OrderDate以优化计划。

这个版本:

where YEAR(OrderDate) = '2000'

有一个大问题。类型不同——为什么要将字符串与返回数字的函数进行比较。它不能在OrderDate. 并且统计信息对于优化查询计划的用处不大。


推荐阅读