代码之家  ›  专栏  ›  技术社区  ›  IamIC

聚类与覆盖指数

  •  5
  • IamIC  · 技术社区  · 14 年前

    请考虑SQL Server 2008中的下表:

    LanguageCode  varchar(10)
    Language      nvarchar(50)
    

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

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

    此外,MS的文档(以及相关专家)表明,一个表应该 理想的 有一个聚集索引。

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

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

    根据反馈编辑:

    我要运行的唯一查询是:

    SELECT Language, LanguageCode FROM Languages where Language="EN"
    
    3 回复  |  直到 14 年前
        1
  •  7
  •   Quassnoi    14 年前

    根据定义,聚集索引覆盖所有列。

    如果您创建 PRIMARY KEY CLUSTERED LanguageCode 以及 UNIQUE INDEX Language ,它将允许您通过一次查找按代码和名称搜索语言,此外,还可以使 语言 独一无二。

        2
  •  5
  •   Joe Stefanelli    14 年前
    1. 不需要在聚集索引中包含列。因为聚集索引是“数据”,所以所有列都会自动包括在内。

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

        3
  •  0
  •   Philip Kelley    14 年前

    基于主题的性质(我猜是人类所说的语言),索引 为了表演 会变得无关紧要。如果您有100种语言,每行占用120字节(psuedo将varchar头、空位掩码和其他因素考虑在内),那么您将拥有12000字节的数据,可以容纳两个8k页面。SQL不会费心在这么小的东西上使用索引,它只需要对整个东西(2页)进行表扫描并强制执行,所需的时间比容易测量的要短。

    索引,以确保唯一性,当然,我一直这样做。但对于性能来说,在你达到3页(或者是4页)之前,这并不重要。(如果你在跟踪编程语言,就会出现这种情况,因为每周都会有十几种新的编程语言。)