sql - 非聚集索引如何输出不包含在索引中的列

标签 sql sql-server sql-server-2012

查看执行计划,我在输出列表中看到“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/

相关文章:

mysql - SQL 分区表 - 如何将不需要分区的数据插入到分区表中?

sql-server-2012 - BCP 导入错误 "Invalid character value for cast specification"

sql - 运行 SQL Server 2012 Import Export 64 时, 'DbProviderFactories' 部分只能在每个配置文件中出现一次

java - hibernate - 日期之间不起作用

mysql - 根据两个条件选择最近的记录

c# - SQL CPU 高 - SqlConnection 未关闭 - 相关?

SQL Server 2012 - 左连接与Where 与内连接

sql - 在 Cursor 中选择查询花费的时间太长

sql - Access 2016 - SQL 求和查询不提供求和,没有错误

sql - 以两种不同的方式汇总数据