查看执行计划,我在输出列表中看到“A 列”。该操作是对非聚集索引的索引扫描:“IX_name”
当我看到这个索引的定义时。我在索引键列或包含列中都没有看到“A 列”。
如何使用非聚集索引来输出索引中不存在的列。难道它不应该对表或其中存在“A 列”的其他索引使用表扫描吗?
最佳答案
如果表本身是 clustered 1,那么所有二级索引都包含聚簇键2(决定聚簇表中行的物理顺序的键)的副本。
原因:聚集表中的行物理存储在 B 树(而不是表堆)中,因此当 B 树节点 split 或合并时可以移动,因此二级索引不能只包含行“指针”(因为行移动后它会面临“悬空”的危险)。
这通常会对性能产生不利影响3 - 通过二级索引查询可能需要双重查找:
- 首先,搜索二级索引并获取聚类键。
- 其次,根据上面检索到的聚类键,搜索聚类表本身(即 B 树)。
但是,如果您想要的只是聚类键的字段,则只需要第一次查找。
1 MS SQL Server 下的又名“聚集索引”。
2 通常,但不一定是 MS SQL Server 下的主键。
3 不幸的是,在 MS SQL Server 下集群默认处于启用状态 - 人们通常只是保留默认设置,而没有充分考虑其影响。当聚类不合适时,您应该显式指定 NONCLUSTERED 关键字将其关闭。
关于sql - 非聚集索引如何输出不包含在索引中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23056790/