最近我被用于数据库微调。我有一些关于SQL Server的想法,并决定创建一些索引。
推荐此http://sqlserverplanet.com/ddl/create-index
但我不明白其他类型的索引如INCLUDE
,WITH
选项会有何帮助。我试过谷歌,但没有看到何时使用它们的简单描述。
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 )
我应该使用以上哪种情况?他们会提高绩效吗?
答案 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没有限制。