集群与覆盖指数

Iam*_*mIC 5 sql-server indexing database-design

请考虑SQL Server 2008中的下表:

LanguageCode  varchar(10)
Language      nvarchar(50)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

根据反馈进行修改:

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

SELECT Language, LanguageCode FROM Languages where Language="EN"
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 7

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

如果您创建一个PRIMARY KEY CLUSTEREDon LanguageCodeUNIQUE INDEXon Language,它将允许您通过单个查找通过其代码和名称搜索语言,此外,使其成为Language唯一.


Joe*_*lli 5

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

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