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