日期:2014-05-16  浏览次数:20367 次

第六章——根据执行计划优化性能(3)——键值查找

前言:

        本文为本系列最后一篇,介绍键值查找的相关知识。

        键值查找是具有聚集索引的表上的一个书签查找,键值查找用于SQLServer查询一些非键值列的数据。使用非聚集索引的查询不会有键值查找,但是所有键值查找会伴随非聚集索引出现。这里特别提醒的是键值查找总是伴有嵌套循环关联。

 

准备工作:

 

下面将创建一个表,通过执行计划看看键值查找的不同效果。为了产生键值查找,需要两件事情:

1、  聚集索引

2、  非聚集索引

 

当你在非聚集索引键值上有谓词时,查询的字段又不全部包含在非聚集索引上,需要通过聚集索引去查找,此时会产生键值查找。执行下面操作产生测试表:

 

USE AdventureWorks
GO


IF OBJECT_ID('SalesOrdDetailDemo') IS NOT NULL 
    BEGIN
        DROP TABLE SalesOrdDetailDemo
    END
GO



SELECT  *
INTO    SalesOrdDetailDemo
FROM    Sales.SalesOrderDetail
GO


 

 

步骤:

1、  在测试表SalesOrdDetailDemo上创建一个聚集索引和一个非聚集索引:

 

CREATE UNIQUE CLUSTERED INDEX idx_SalesDetail_SalesOrderID ON SalesOrdDetailDemo(SalesOrderID,SalesOrderDetailID)
GO

CREATE NONCLUSTERED INDEX idx_non_clust_SalesOrdDetailDemo_ModifiedDate ON SalesOrdDetailDemo(ModifiedDate)
GO


 

 

2、  执行下面的查询,并开启实际执行计划:

 

SELECT  ModifiedDate
FROM    SalesOrdDetailDemo
WHERE   ModifiedDate = '2004-07-31 00:00:00.000'
GO


 

 

3、  从执行计划的截图中看到,使用了一个非聚集索引(执行计划中叫做索引)查找:

如果你使用了文本化的执行计划,会看到:

StmtText

-------------------------------------------------------------------------------------------

  |--Index Seek(OBJECT:([AdventureWorks].[dbo].[SalesOrdDetailDemo].[idx_non_clust_SalesOrdDetailDemo_ModifiedDate]), SEEK:([AdventureWorks].[dbo].[SalesOrdDetailDemo].[ModifiedDate]=CONVERT_IMPLICIT(datetime,[@1],0)) ORDERED FORWARD)

 

 

4、  对上面的查询语句进行少许的改动,多查询几列: