本篇博文只测试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 --删除测试表