查询优化——删除书签查找——删除 RID 查找——删除键查找
查询优化——删除书签查找——删除 RID 查找——删除键查找
引言
此前,我撰写了两篇关于移除书签查找主题的不同文章。本文是原始文章的第三部分。请在继续阅读本文之前阅读以下两篇文章:
- SQL SERVER – 查询优化 – 移除书签查找 – 移除 RID 查找 – 移除键查找
- SQL SERVER – 查询优化 – 移除书签查找 – 移除 RID 查找 – 移除键查找 – 第 2 部分
我们在上述文章中了解到,可以使用覆盖索引来移除书签查找。覆盖索引是指包含 SELECT
以及 JOIN
和 WHERE
条件中使用的所有列的索引。在我们的示例中,我们首先创建了一个聚集索引。
-- Create Clustered Index
CREATE CLUSTERED INDEX [IX_OneIndex_ID] ON [dbo].[OneIndex]
(
[ID] ASC
) ON [PRIMARY]
GO
基于聚集索引,我们创建了以下非聚集索引。请注意,我们不必同时创建这两个索引。我们可以创建覆盖索引或包含列索引以及它。请注意,我建议创建其中之一,而不是两者都创建。
在之前的文章中,我建议包含所有列,但实际上,在任何非聚集索引中,没有必要包含聚集索引中包含的列。所有非聚集索引自动包含指向聚集索引的指针。
我们应该按照以下方式创建先前文章中描述的索引
方法 1:创建覆盖非聚集索引
CREATE NONCLUSTERED INDEX [IX_OneIndex_Cover] ON [dbo].[OneIndex]
(
City, FirstName
) ON [PRIMARY]
GO
方法 2:创建包含列非聚集索引
CREATE NONCLUSTERED INDEX [IX_OneIndex_Include] ON [dbo].[OneIndex]
(
City
) INCLUDE (FirstName) ON [PRIMARY]
GO
让我们检查执行计划,比较查询成本,并验证这两种索引用法是否强制索引查找而不是索引扫描。

如示例中所讨论的,任何非聚集索引都不需要包含包含在聚集索引中的列。
参考
- Pinal Dave (http://blog.sqlauthority.com)
历史
- 2009 年 10 月 13 日:初始发布