创建索引SQL Server 2008

时间:2013-03-27 05:41:40

标签: sql sql-server sql-server-2008 sql-server-2012

最近我被用于数据库微调。我有一些关于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 个答案:

答案 0 :(得分:4)

数据压缩也有助于您的查询性能,因为在压缩之后,当您运行查询时,将加载较少的页面/范围,因为I / O减少了,减少I / O始终是一个不错的选择。

答案 1 :(得分:2)

我无法使用with datacompression选项,但Include选项肯定可以提高性能。如果仅选择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子句不匹配,并且rowcount没有限制。