sql - 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
解决方案
这个查询:
select *
from Orders
where OrderDate >= '2000-01-01' and OrderDate <= '2000-12-31'
可以利用有助于优化查询的三件事:
- 上的索引
OrderDate
。 - 上的分区
OrderDate
。 - 保持统计
OrderDate
以优化计划。
这个版本:
where YEAR(OrderDate) = '2000'
有一个大问题。类型不同——为什么要将字符串与返回数字的函数进行比较。它不能在OrderDate
. 并且统计信息对于优化查询计划的用处不大。
推荐阅读
- c# - 为什么此 C# 代码将数据插入 SQLite 表的错误列?
- javascript - 我尝试将左侧菜单折叠为有角度的手风琴但不起作用?
- javascript - 如何在代码中再次调用高阶函数?
- java - 递归java函数重复单词“计算”的开头和结尾
- html - CSS:在移动设备上查看元素时,边框颜色命令会导致奇怪的阴影
- vba - VBA - 寻找我的简单动态循环总和计算的解决方案
- python - 用包含相同文本的子标签替换beautifulsoup标签的标记文本的优雅方法是什么
- java - 为什么在 Android 中从命令行启动服务需要 root 访问权限(su)?
- c# - 生成 HMAC 签名
- reactjs - 在应用程序和私有库中包含 React 的正确方法是什么?(来自重复 React 的 React Invalid Hook Call 警告)