RID查找-逻辑搜索

问题描述 投票:2回答:2

例如,我们的表具有聚集索引table1(col1 int,col2 int,col3 int),为col1定义的聚集索引,为col2定义的非聚集索引,我们编写查询-从table1中选择* * col2 ='some value '-优化程序进入非聚集索引查找,获取特定行并转到聚集索引以获取未包含在非聚集索引内部的其余数据(在这种情况下,执行键查找以获取col3)。关键查找本质上是基于在叶子级别的非聚集索引中找到的聚集索引值的聚集索引查找。

当我们在表上没有聚簇索引但有非聚簇索引时会发生什么?我知道它将执行RID查找,但是这在逻辑上是如何工作的?聚簇索引值将使用b树搜索来查找,因为我们所有行都以特定顺序排列,但是如何在堆表中找到这些索引值却没有特定顺序?根据我的理解,当我们在非聚集索引(具有非聚集索引键+ rowid)中找到行时,我们需要扫描整个堆表以在其中找到该rowid,因为那里没有任何顺序,并且无法使用b树,对吗?

sql sql-server indexing sql-execution-plan b-tree
2个回答
3
投票

这是一个概念上的解释。数据库将行存储在数据页上,而数据页又存储行。 rid根据“物理”位置直接标识行的位置。实际上,数据页在某种意义上是“逻辑的”,因为它可以在内存中或在磁盘上。


0
投票

一个示例可能会有所帮助。下面创建了一个堆并向其插入几行

© www.soinside.com 2019 - 2024. All rights reserved.