6

最近我被投入到数据库微调中。我对 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 )

我应该使用上述什么场景?他们会提高性能吗?

4

2 回答 2

4

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

于 2013-03-27T06:02:51.050 回答
2

我不能说 with datacompression 选项,但 Include 选项绝对可以提高性能。如果您仅选择 PresidentNumber 和一个或多个 President、YearsInOffice 或 RatingPoints 列,并且 ElectoralVotes 不为空,那么您的查询将从索引本身获取值,而不必触及基础表。如果您的表有其他列并且您在查询中包含其中之一,那么它将必须从表和索引中检索值。


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 表,因为查询中的政治党列不包含在索引中。

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

此查询很可能最终会执行表扫描,因为查询中的 where 子句与索引中使用的 where 子句不匹配,并且对行数没有限制。

于 2013-03-27T05:45:43.173 回答