暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译文] PostgreSQL 中惊人的缓冲区标签

原创 David Zhang 2021-09-08
682

1. 概述

最近在研究PostgreSQL存储相关的特性,发现PostgreSQL设计了一个非常棒的存储寻址机制,即Buffer Tag。在这篇博客中,我想与您分享我对 Buffer Tag 的理解以及它的一些潜在用途。

2. 缓冲标签

当我第一次开始在物联网项目中使用 PostgreSQL 时,我一直很想知道 PostgreSQl 如何如此快速地找到元组数据块,但我从来没有机会仔细研究它,尽管我知道 PostgreSQL 是一个非常组织良好的开源项目。直到我最近接到一个任务,需要解决 PostgreSQL 中一些与存储相关的问题。在面向开发人员的在线 PostgreSQL 书籍The Internals of PostgreSQL 中,对 Buffer Manger 如何工作有非常详细的解释,这是我推荐给 PostgreSQL 开发初学者阅读的最好的 PostgreSQL 书籍之一。

Buffer Tag,简单来说就是五个数字。为什么是五个数字?首先,包括存储文件在内的所有对象都由对象标识符(OID)管理。例如,当用户创建一个表时,表名被映射到一个OID;当用户创建数据库时,名称被映射到一个 OID;当相应的数据需要在磁盘上持久化时,文件也使用 OID 命名。其次,当一张表需要更多页来存储更多元组时,那么同一张表的每一页都由页码依次管理。例如,当 PostgreSQL 在决定应该使用什么样的扫描来更快地找出元组之前需要估计表大小时,它需要知道块的数量信息。第三,很容易理解,数据元组是需要存储的主要用户数据,但是为了更好地管理这些数据元组,PostgreSQL 需要其他信息,例如管理这些数据元组的状态的可见性,以及优化文件使用的可用空间。所以这最终有五个数字,即 Tablespace、Database、Table、ForkNumber、BlockNumber。

给定这五个数字,PostgreSQL 总能找出数据元组的存储位置、使用的文件以及表的大小等。

3.如何使用Buffer Tag

现在,我们有缓冲区标签,五个数字,但它是如何在 PosggreSQL 中使用的。缓冲区标记的一个典型用例是帮助缓冲区管理器管理缓冲池/阵列中内存块的位置。在这种情况下,引入了一个哈希表来解决缓冲区标签和缓冲池/数组中内存块位置之间的映射。这张图展示了缓冲区标签、哈希表、缓冲区描述符和缓冲池/数组之间的关系。

image.png

image.png

例如,第一个绿色缓冲区标记 {(1663, 13589, 16387), 0, 0} 表示表空间 1663,数据库 12709,以及存储在文件块0。缓冲区标签有一个哈希值1536704684,此时已分配给缓冲区管理器管理的内存块0。由于缓冲区描述符使用与缓冲池/数组中的内存块相同的槽号进行寻址,因此在这种情况下,它们共享相同的槽号 0。

通过上述关系,PostgreSQL 可以找出内存块位置或为特定缓冲区标签的新内存块分配缓冲区槽。

缓冲区标签的另一个典型用例是帮助存储管理器管理相应的文件。在这种情况下,blockNumber 始终为 0,因为它不需要多个块来存储更多数据。在这里,您可以创建缓冲区标记的用例。例如,使用 buf_id 作为每个数据库关系的块数,而不是使用它来指示内存块位置。此外,您还可以使用缓冲区标记和哈希表来管理多个信息,例如同时具有用于内存块位置的 buf_id 和添加新属性 total 来管理块数。您可以通过定义不同的缓冲区查找条目来实现这一点。例如,

原始缓冲区查找条目使用缓冲区标记来查找内存块的位置。

/* entry for buffer lookup hashtable */ typedef struct { BufferTag key; /* Tag of a disk page */ int id; /* Associated buffer ID */ } BufferLookupEnt;

下面是一个缓冲区查找条目的例子,它可以查找内存块的位置和这个特定缓冲区标签使用的块数。

typedef struct { BufferTag key; /* Tag of a disk page */ int id; /* Associated buffer ID */ int total; /* the total number of X */ } RelLookupEnt;

4. 总结

在这篇博客中,我们讨论了什么是缓冲区标签,它是如何在 PostgreSQL 中使用的,以及缓冲区标签的一些潜在用途,以解决表到存储文件之间的映射问题以及查找问题。

参考
PostgreSQL 的内部结构

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论