构建你自己的 SQLite,第 2 部分:扫描大型表

主要观点

  • 之前实现的.tables命令有局限,假设所有数据都在文件第一页,此篇要解决表过大无法在单页显示的问题,为查询引擎打基础。
  • 当表过大时,SQLite将其分割为不同类型的页,如包含实际记录的叶页和存储表记录所在页信息的内部页。
  • 介绍了内部页的结构及相关数据结构的更新,包括页头结构、PageType枚举、Page结构体等。
  • 需更新扫描逻辑以处理内部页,引入PositionedPage结构体和Scanner结构体来跟踪遍历的页面。
  • 更改display_tables函数以适应next_record签名的变化,现在可以显示长列表的表。

关键信息

  • 数据库页通常为 4096 字节,1000 个表无法存储在一页。
  • 内部页结构:存储(key, child_page_number)元组,按key升序逻辑排序,头包含额外的“最右指针”字段。
  • 数据结构更新:在PageHeader中添加rightmost_pointer字段和byte_size方法,更新Page结构体和相关解析函数。
  • 扫描逻辑更新:通过PositionedPageScanner结构体实现深度优先算法遍历树,处理内部页。
  • display_tables函数更新以显示表名。

重要细节

  • 解析内部页的函数parse_table_interior_cell和叶页的函数parse_table_leaf_cell
  • PositionedPage结构体的next_cellnext_page方法的实现。
  • Scanner结构体的next_recordnext_elemcurrent_page方法的逻辑。
  • Cursor结构体的更改,使其拥有自身的有效载荷。
阅读 14
0 条评论