请考虑SQL Server 2008中的下表:
LanguageCode varchar(10)
Language nvarchar(50)
LanguageCode参与关系,因此我无法创建包含两列(LanguageCode,Language)的主键索引。
如果我在LanguageCode上放置一个主群集密钥,当然我不能在索引中包含语言(覆盖索引)。这意味着我将不得不为语言创建第二个索引,或冒着在其中包含重复项的风险(加上强制执行表扫描以检索其值)。
此外,MS的文档(以及该主题的专家)表明,理想情况的表格应具有聚集索引。
在这种情况下,非聚集覆盖索引(LanguageCode,Language)不仅可以确保语言是唯一的,还可以避免表扫描。但是,没有“理想的”聚集索引。
这种情况下,没有聚集索引的情况实际上是理想的吗?
根据反馈进行修改:
我希望运行的唯一查询是:
SELECT Language, LanguageCode FROM Languages where Language="EN"
答案 0 :(得分:7)
根据定义,聚簇索引涵盖所有列。
如果您在PRIMARY KEY CLUSTERED
上创建LanguageCode
,在UNIQUE INDEX
上创建Language
,则可以使用单个代码及其名称搜索一种语言查找,此外,使Language
唯一。
答案 1 :(得分:5)
无需在聚簇索引上包含列。由于聚集索引是“数据”,因此会自动包含所有列。
如果您需要按语言搜索和/或确保其唯一性,那么一定要在其上创建一个额外的索引。
答案 2 :(得分:0)
根据主题的性质(我猜测它是人类使用的语言),索引的性能将无关紧要。如果您有100种语言,并且每行占用120个字节(在varchar标头,空位掩码和诸如此类的伪造因子中),您将拥有12,000个字节的数据,这适合于两个8k页。 SQL不会在任何小的东西上使用索引,它只会扫描整个事物(2页)并强制它,需要的时间少于容易测量的时间。
索引以确保唯一性,当然,我一直这样做。但是为了表现,直到你打3页(或者是4页),这没关系。 (如果你正在跟踪编程语言会发生这种情况,因为每周都会有十几种新的语言。)