65.9K
CodeProject 正在变化。 阅读更多。
Home

查询优化——删除书签查找——删除 RID 查找——删除键查找

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2009年10月13日

CPOL

1分钟阅读

viewsIcon

23484

查询优化——删除书签查找——删除 RID 查找——删除键查找

引言

此前,我撰写了两篇关于移除书签查找主题的不同文章。本文是原始文章的第三部分。请在继续阅读本文之前阅读以下两篇文章:

  1. SQL SERVER – 查询优化 – 移除书签查找 – 移除 RID 查找 – 移除键查找
  2. SQL SERVER – 查询优化 – 移除书签查找 – 移除 RID 查找 – 移除键查找 – 第 2 部分

我们在上述文章中了解到,可以使用覆盖索引来移除书签查找。覆盖索引是指包含 SELECT 以及 JOINWHERE 条件中使用的所有列的索引。在我们的示例中,我们首先创建了一个聚集索引。

-- 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

让我们检查执行计划,比较查询成本,并验证这两种索引用法是否强制索引查找而不是索引扫描。

如示例中所讨论的,任何非聚集索引都不需要包含包含在聚集索引中的列。

参考

历史

  • 2009 年 10 月 13 日:初始发布
© . All rights reserved.