关于SQL Server中的非聚集索引,我有两个问题,似乎找不到答案:
- 他们说你应该只在列上放一个非聚集索引具有高(例如95%)选择性(值的唯一性)。说,for例如,我的MailingAddress表有一个列StateID,它是外键列,其值是州表(我们在美国)MailingAddress表中将具有重复值的记录用于此StateID列。例如,将有许多地址存在于加利福尼亚州、纽约州、得克萨斯州等。因此,StateID柱的选择性将远低于95%。是否应在此StateID列上放置非聚集索引
- 我知道聚集索引的最后一个叶节点页实际上包含数据记录本身
但是,非聚集索引的叶节点页中究竟是什么?是吗
- 实际记录所在的聚集索引值?(然后SQL Server将不得不查看聚集索引以获得您要查找的实际记录)
- 非聚集索引所在列的实际值-AND-实际记录所在的聚集索引值(因此SQL Server可以查找该记录中不属于非聚集索引的其他列的值)
- 还有别的
提前感谢您的回答。
是否应在此StateID列上放置非聚集索引?
没有。但是,包含列的非聚集索引为目标查询创建覆盖索引非常有意义。
但是,非聚集索引的叶节点页中究竟是什么?
数据记录。这是一个普通记录,类似于聚集索引数据记录。它包含以下列(顺序无关):
- 非聚集索引键列
- 聚集索引键列
- 所有包含的列
如果一列在非聚集索引(键或包含)和聚集索引键中都重复,则只包含一次(即不重复)。有些人将其解释为"非聚集索引中缺少聚集索引中的所有键列",但我发现这很难理解。
如果表没有聚集索引(即是堆),则记录包含:
- 非聚集索引的所有键列
- 所有包含的列
- 堆记录的记录定位器(行id=(fileid:pageid:slotid))
此解释省略了columnstore和Hekaton索引和表,它们是不同的。