创建索引 SQL Server 2008

6

最近我参与了数据库的优化工作,对SQL Server有一些想法,决定创建一些索引。

参考了这篇文章:http://sqlserverplanet.com/ddl/create-index

但是我不明白其他类型的索引,比如INCLUDEWITH选项会如何帮助。我试图通过谷歌搜索,但未能找到一个简单的描述何时使用它们。

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber
ON dbo.Presidents (PresidentNumber)
INCLUDE (President,YearsInOffice,RatingPoints)
WHERE ElectoralVotes IS NOT NULL

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber
ON dbo.Presidents (PresidentNumber)
WITH ( DATA_COMPRESSION = ROW )

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber
ON dbo.Presidents (PresidentNumber)
WITH ( DATA_COMPRESSION = PAGE )

什么情况下应该使用上述内容?它们会提高性能吗?
2个回答

4
数据压缩也有助于查询性能,因为在压缩后运行查询时会加载更少的页面/范围,因为 I/O 减少,减少 I/O 总是一个不错的选择。

2

我无法对使用数据压缩选项进行讲解,但是包含选项肯定可以提高性能。如果您仅选择PresidentNumber和一个或多个列(President、YearsInOffice或RatingPoints),并且ElectoralVotes不为null,则查询将从索引本身获取值,而无需触及基础表。如果您的表具有其他列,并且在查询中包含其中一个列,则它还必须从表中检索值以及索引。


Select top 20 PresidentNumber, President, YearsInOffice, RatingPoints
From Presidents
where ElectoralVotes IS NOT NULL

以上查询仅从IX_NC_PresidentNumber中读取数据,而无需从Presidents表中提取数据,因为查询中的所有列都包含在索引中。

Select top 20 PresidentNumber, President, YearsInOffice, PoliticalParty
From Presidents
where ElectoralVotes IS NOT NULL

这个查询将使用索引IX_NC_PresidentNumber和Presidents表,因为查询中的PoliticalParty列没有包含在索引中。

Select PresidentNumber, President, YearsInOffice, RatingPoints
From Presidents
Where RatingPoints > 50

这个查询很可能会进行全表扫描,因为查询语句中的where子句与索引中使用的where子句不匹配,并且没有对行数进行限制。


请问能否在这里添加一个样例查询?这将有助于我更轻松地思考和理解 :) - Billa
看起来不错。所以我们需要在SELECT语句中给所有的列添加索引,以获得良好的性能?以避免对表进行扫描。 - Billa
不,你不需要将所有列添加到索引中以避免表扫描。 你需要在where子句中使用的列上创建索引以避免表扫描。将所有列添加到索引中所带来的性能提升相对较小,因为索引包含指向行的指针。真正大的收益在于在筛选列上创建索引。 - BlackICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接