SQL Server中的非聚簇索引 - 选择性 - 以及叶节点页面中的内容?

时间:2015-12-10 15:34:00

标签: sql-server indexing

我有两个关于SQL Server中非聚集索引的问题,我似乎无法找到答案:

  1. 他们说你应该只在列上放置一个非聚集索引 具有高(例如95%)选择性(值的唯一性)。说,为 例如,我的MailingAddress表有一个StateID列,它是一个 外键列,其值是主键值 州表(我们在美国)。会有很多 MailingAddress表中具有重复值的记录 对于此StateID列。例如,会有很多地址 加州,纽约州,德克萨斯州等等。因此, StateID列的选择性将远低于95%。 是否应将非聚集索引放在此StateID列上?
  2. 据我所知,聚簇索引的最后一个叶节点页面实际上包含了数据记录本身。
  3. 但是,非聚集索引的叶节点页面究竟是什么?是吗:

    1. 实际记录所在的聚集索引值? (然后SQL Server必须查看聚集索引以获取您要查找的实际记录)?
    2. 非聚集索引所在列的实际值 - 和 - 实际记录所在的聚簇索引值的值(因此SQL Server可以查找其他列的值)这条记录不属于非聚集索引的一部分)?
    3. 别的。
    4. 提前感谢您的回答。

1 个答案:

答案 0 :(得分:5)

  

是否应在此StateID列上放置非聚集索引?

没有。但是,包含列的非聚集索引为目标查询创建覆盖索引非常有意义。

  

但是,非聚集索引的叶节点页面究竟是什么?

数据记录。这是一个普通记录,类似于聚集索引数据记录。它包含以下列(顺序无关紧要):

  • 非聚集索引键列
  • 聚集索引键列
  • 包含所有列。

如果列在非聚集索引(键或包含)和聚簇索引键中都重复,则只包含一次(即不重复)。有些人将此解释为“非聚集索引中缺少聚簇索引的所有关键列”,但我发现更难理解。

如果表没有聚集索引(即。是),则记录包含:

  • 非聚集索引的所有关键列
  • 所有包含的列
  • 堆记录的记录定位器(row id =(fileid:pageid:slotid))。

此解释省略了不同的columnstore和Hekaton索引和表。