sql-server - 非聚集索引和聚集索引在同一列上

标签 sql-server indexing b-tree clustered-index non-clustered-index

我遇到了this在 Stackoverflow 上发帖。第一个答案提到类似聚集索引拥有表的所有数据,而非聚集索引只有列+聚集索引的位置或行(如果它位于堆上)(没有聚集索引的表) 非聚集索引怎么能有聚集索引的位置呢?它只包含在 B 树中排序为节点的列值,每个节点都指向该列具有该节点值的行,对吗?

最佳答案

假设您正在谈论SQL Server,并且还假设您的表聚集索引(正如您应该的那样)。

然后,非聚集索引包含您在 CREATE INDEX 语句中定义的列,加上它具有构成聚集索引的列(如果存在) )。

该聚类键值是指向实际数据所在位置的“指针”。

如果查询执行器在非聚集索引中查找值并找到匹配项,则

  • 要么您只关心该值 - 然后您只需取回该值

  • 非聚集索引可能还包含一些包含列(在叶级页面中),并且通过这些列,查询可以满足(所有请求的列都存在),以便您返回您请求的值

  • 那么您想要的值并不全部在非聚集索引叶级页面中(如果您执行SELECT *<,则尤其如此 一直),然后查询执行器必须从非聚集索引中获取聚集键值,然后返回聚集索引,执行所谓的键查找,通过聚集进行查找索引,并找到存储完整行的关联数据页 -> 现在查询执行器可以返回您要求的值

有关非常好的解释 - 请参阅 this blog post here 。它说:

In NonClustered Index:
....
2.b. If the table has a Clustered index, or the index is on an Indexed view, the row locator is the Clustered index Key for the row. SQL Server retrieves the data row by searching the Clustered index using the Clustered index Key stored in the Leaf row of the NonClustered index.

或参见this blog post in a whole series on SQL Server indexes这也解释了存储在非聚集索引叶级页面中的“书签”。

关于sql-server - 非聚集索引和聚集索引在同一列上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212174/

相关文章:

clojure - 为什么 CouchDB 使用仅追加的 B+ 树而不是 HAMT

c++ - 从 B 树中删除一个节点

C# : how to set stored procedure execution with parallelism or improve execution time?

mysql - 如何在单个合并语句中执行多个更新

matlab - 矢量化和矢量索引

indexing - 如何从 Julia 的生成器中获取前 N 个元素

c# - sql——变量存储

sql - MS SQL Server 2008 "linked server"到 Oracle : schema not showing

Azure 搜索索引器经常失败

algorithm - 范围最小查询、动态数组、区间树、treap