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



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

  1. 他们说你应该只在列上放一个非聚集索引具有高(例如95%)选择性(值的唯一性)。说,for例如,我的MailingAddress表有一个列StateID,它是外键列,其值是州表(我们在美国)MailingAddress表中将具有重复值的记录用于此StateID列。例如,将有许多地址存在于加利福尼亚州、纽约州、得克萨斯州等。因此,StateID柱的选择性将远低于95%。是否应在此StateID列上放置非聚集索引
  2. 我知道聚集索引的最后一个叶节点页实际上包含数据记录本身

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

  1. 实际记录所在的聚集索引值?(然后SQL Server将不得不查看聚集索引以获得您要查找的实际记录)
  2. 非聚集索引所在列的实际值-AND-实际记录所在的聚集索引值(因此SQL Server可以查找该记录中不属于非聚集索引的其他列的值)
  3. 还有别的

提前感谢您的回答。

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

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

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

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

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

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

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

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

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

最新更新