WHERE谓词对索引使用的影响

本篇博文只测试WHERE谓词对multi-column index使用的影响,主要篇幅是SQL代码+截图。详细内容请参考《Inside the SQL Server Query Optimizer 》--Benjamin Nevarez,Chapter 4:Index Selection-->The Mechanics of Index Selection(Page124).

复制代码
 1 --利用AdventureWorks.Sales.SalesOrderDetail 创建临时表
 2 SELECT * INTO dbo.SalesOrderDetail
 3 FROM Sales.SalesOrderDetail
 4 --运行下面语句查看执行计划
 5 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail --table scan
 6 --创建复合索引
 7 CREATE INDEX multi_column ON dbo.SalesOrderDetail(ProductID,SalesOrderID)
 8 --分别运行在索引第一列、第二列的 where条件查询
 9 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
10 WHERE ProductID=771 --index seek
11 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
12 WHERE SalesOrderID=45233 --index scan
13 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
14 WHERE ABS(ProductID)=771 --talbe scan
复制代码

1 --分别运行在索引第一列、第二列的 where条件查询
2 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
3 WHERE ProductID=771 AND SalesOrderID> 45233 --seek ProductID,seek SalesOrderID
4 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
5 WHERE ProductID=771 AND ABS(SalesOrderID)=45233 --seek ProductID,scan SalesOrderID
6 SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
7 WHERE ProductID<771 AND SalesOrderID=45233 --seek ProductID,scan SalesOrderID


索引第一列为‘=’,第二列没含操作表达式,则两列都可以用 seek,与where 后面的顺序无关
索引第一列为‘=’,第二列有操作表达式 (abs,upper,convert...),则第一列seek,第二列 scan,与where 后面的顺序无关
索引第一列不是‘=’,则第一列 seek,第二列scan ,与where后面的顺序无关

1 DROP TABLE dbo.SalesOrderDetail --删除测试表
posted @   Uest  阅读(1038)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示