您的位置:首页 > 其它

WHERE谓词对索引使用的影响

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

--利用AdventureWorks.Sales.SalesOrderDetail 创建临时表
SELECT * INTO dbo.SalesOrderDetail
FROM Sales.SalesOrderDetail
--运行下面语句查看执行计划
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail --table scan
--创建复合索引
CREATE INDEX multi_column ON dbo.SalesOrderDetail(ProductID,SalesOrderID)
--分别运行在索引第一列、第二列的 where条件查询
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ProductID=771 --index seek
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE SalesOrderID=45233 --index scan
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ABS(ProductID)=771 --talbe scan




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




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

DROP TABLE dbo.SalesOrderDetail --删除测试表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: