集群与覆盖指数

时间:2010-11-12 20:07:36

标签: sql-server database-design indexing

请考虑SQL Server 2008中的下表:

LanguageCode  varchar(10)
Language      nvarchar(50)

LanguageCode参与关系,因此我无法创建包含两列(LanguageCode,Language)的主键索引。

如果我在LanguageCode上放置一个主群集密钥,当然我不能在索引中包含语言(覆盖索引)。这意味着我将不得不为语言创建第二个索引,或冒着在其中包含重复项的风险(加上强制执行表扫描以检索其值)。

此外,MS的文档(以及该主题的专家)表明,理想情况的表格应具有聚集索引。

在这种情况下,非聚集覆盖索引(LanguageCode,Language)不仅可以确保语言是唯一的,还可以避免表扫描。但是,没有“理想的”聚集索引。

这种情况下,没有聚集索引的情况实际上是理想的吗?

根据反馈进行修改:

我希望运行的唯一查询是:

SELECT Language, LanguageCode FROM Languages where Language="EN"

3 个答案:

答案 0 :(得分:7)

根据定义,聚簇索引涵盖所有列。

如果您在PRIMARY KEY CLUSTERED上创建LanguageCode,在UNIQUE INDEX上创建Language,则可以使用单个代码及其名称搜索一种语言查找,此外,使Language唯一。

答案 1 :(得分:5)

  1. 无需在聚簇索引上包含列。由于聚集索引是“数据”,因此会自动包含所有列。

  2. 如果您需要按语言搜索和/或确保其唯一性,那么一定要在其上创建一个额外的索引。

答案 2 :(得分:0)

根据主题的性质(我猜测它是人类使用的语言),索引的性能将无关紧要。如果您有100种语言,并且每行占用120个字节(在varchar标头,空位掩码和诸如此类的伪造因子中),您将拥有12,000个字节的数据,这适合于两个8k页。 SQL不会在任何小的东西上使用索引,它只会扫描整个事物(2页)并强制它,需要的时间少于容易测量的时间。

索引以确保唯一性,当然,我一直这样做。但是为了表现,直到你打3页(或者是4页),这没关系。 (如果你正在跟踪编程语言会发生这种情况,因为每周都会有十几种新的语言。)