日期:2014-05-16 浏览次数:20403 次
本文为本系列最后一篇,介绍键值查找的相关知识。
键值查找是具有聚集索引的表上的一个书签查找,键值查找用于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、 对上面的查询语句进行少许的改动,多查询几列: