WHERE谓词对索引使用的影响

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

WHERE谓词对索引使用的影响
 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
WHERE谓词对索引使用的影响

WHERE谓词对索引使用的影响

WHERE谓词对索引使用的影响
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
WHERE谓词对索引使用的影响

WHERE谓词对索引使用的影响

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

1 DROP TABLE dbo.SalesOrderDetail --删除测试表

WHERE谓词对索引使用的影响

上一篇:android开发基础!该如何高效实用Kotlin?实战解析


下一篇:Number one:单例模式5种JAVA实现及其比较