Sql 非聚集索引如何输出未包含在索引中的列

Sql 非聚集索引如何输出未包含在索引中的列,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,查看执行计划时,我在输出列表中看到“A列”。该操作是对非聚集索引的索引扫描:“IX_name” 当我看到这个索引的定义时。我在索引键列或包含列中都没有看到“列A” 如何使用非聚集索引输出索引中不存在的列。它不应该对表或其他包含“列a”的索引使用表扫描。在内部,非聚集索引包含聚集键的所有键列。这是为了支持键查找操作,并确保每个索引行内部都有一个唯一的键。对于堆,出于相同的原因,每个NCI都包含行书签。如果表本身为1,则所有二级索引都包含群集键2(一个确定群集表中行的物理顺序的键)的副本 原因是:聚

查看执行计划时,我在输出列表中看到“A列”。该操作是对非聚集索引的索引扫描:“IX_name”

当我看到这个索引的定义时。我在索引键列或包含列中都没有看到“列A”


如何使用非聚集索引输出索引中不存在的列。它不应该对表或其他包含“列a”的索引使用表扫描。

在内部,非聚集索引包含聚集键的所有键列。这是为了支持键查找操作,并确保每个索引行内部都有一个唯一的键。对于堆,出于相同的原因,每个NCI都包含行书签。

如果表本身为1,则所有二级索引都包含群集键2(一个确定群集表中行的物理顺序的键)的副本

原因是:聚集表中的行物理上存储在B树(而不是表堆)中,因此当B树节点被拆分或合并时,可以移动,因此二级索引不能只包含行“指针”(因为行移动后会有“挂起”的危险)

通常,这会对性能产生不利影响3-通过二级索引进行查询可能需要双重查找:

  • 首先,搜索二级索引并获得聚类键
  • 其次,基于上面检索到的集群键,搜索集群表本身(即B-树)
但是,如果您只需要集群键的字段,则只需要第一次查找


1又名MS SQL Server下的“聚集索引”

2通常,但不一定是MS SQL Server下的主键


3不幸的是,在MS SQL Server下,默认情况下群集是打开的-人们通常在没有充分考虑其影响的情况下离开默认设置。当群集不合适时,您应该显式指定非群集关键字以将其关闭。

您可以包括整个执行计划吗?@Tomalak,由于某些限制,我无法这样做。真的很抱歉。我可以提供您可能需要的所有信息。我特别想知道计划中是否出现书签查找操作。感谢@usr的回复。你能告诉我一些文章或教程,我可以得到更好的理解。这将非常有用。例如。搜索“SQL Server索引内部”。这是否意味着永远不需要在“包含的列”中显式添加群集键(如果我们需要群集键列)?@suyash是,如您的查询所示。