gpt4 book ai didi

sql - RID 查找 - 逻辑搜索

转载 作者:行者123 更新时间:2023-12-01 21:40:02 25 4
gpt4 key购买 nike

例如,我们有一个带有聚簇索引 table1 (col1 int , col2 int , col3 int) 的表,为 col1 定义了聚簇索引,为 col2 定义了非聚簇索引,我们编写查询 - select * from table1 where col2 = 'some value' - 优化器进行非聚集索引查找,获取特定行并转到聚集索引以获取未包含在非聚集索引内的其余数据(在这种情况下执行键查找以获取 col3)。键查找本质上是基于在叶级非聚集索引中找到的聚集索引值的聚集索引查找。

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

最佳答案

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

数据库不需要通过面向用户的索引来识别行的位置。它需要识别页面,然后是页面上的偏移量。 rid 包含有关页面和偏移量的信息。这样,页面管理系统就可以直接从rid中找到自己需要的页面。

无需扫描任何内容即可找到该行。

也就是说,有些事情是数据库必须做的,例如:

  • 数据页是否在页面缓存中?如果没有,那就去拿吧。
  • 内存中的页面是否被修改?如果不允许,是否允许脏读。
  • 行是否锁定?

在理解数据库如何运作时,存储层的管理常常被忽视。就日常编写查询而言,页面管理似乎很管用。然而,访问一行并不是一个简单的操作。数据库在 ACID 属性、可靠性和可伸缩性方面的许多强大功能都依赖于存储管理层。

关于sql - RID 查找 - 逻辑搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61513705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com