zheap 被设计为一种新的存储引擎,可以更有效地处理 PostgreSQL 中的 UPDATE。
zheap:自上次以来做了什么
让我们来看看自上次状态报告以来我们取得的最重要的成就:
- 逻辑解码
- 处理 UNDO
- UNDO的补丁评论
- 合并代码
- 无数的修复和改进
zheap:逻辑解码
清单上的第一件事绝对重要。大多数人可能熟悉 PostgreSQL 进行逻辑解码的能力。这意味着事务日志 (= WAL) 被转换回 SQL,以便它可以应用于其他机器,从而在第二台服务器上产生相同的结果。进行逻辑解码的能力不仅仅是给定的。必须编写可以解码 zheap 记录并将它们转换为可读输出的代码。到目前为止,这个实现看起来不错。我们目前不知道这方面的错误。
关于 UNDO 的工作
当涉及到新的存储引擎时,zheap 只是其中的一部分。您可能知道,PostgreSQL 中的标准堆表将在同一物理文件中保存行的所有必要版本。在 zheap 中,情况并非如此。它在很大程度上基于称为“UNDO”的功能,其工作方式类似于Oracle和其他一些数据库引擎的工作方式。这个想法是将行的旧版本移出表,然后在发生回滚的情况下将它们放回 .
已经取得的成果是,zheap 代码现在与社区建议的新 UNDO 基础设施兼容(我们希望在 15 版之前在核心中看到)。这里的一般想法是 UNDO 不仅应该专注于 zheap,而且还应该提供一个通用的基础设施,其他存储引擎将来也可以使用。这就是为什么为 PostgreSQL 的未来 UNDO 功能准备 zheap 代码对于成功至关重要。如果您想关注邮件列表上的讨论,您可以在此处找到有关 zheap 和 UNDO 的更多详细信息。
修复错误和合并
可以想象,像 zheap 这样的重大项目也会在质量管理方面引起一些严肃的工作。让我们看看代码的大小:
[hs@node1 zheap_postgres]$ cd src/backend/access/zheap/
[hs@node1 zheap]$ ls -l *c
-rw-rw-r--. 1 hs hs 14864 May 27 04:25 prunetpd.c
-rw-rw-r--. 1 hs hs 27935 May 27 04:25 prunezheap.c
-rw-rw-r--. 1 hs hs 11394 May 27 04:25 rewritezheap.c
-rw-rw-r--. 1 hs hs 96748 May 27 04:25 tpd.c
-rw-rw-r--. 1 hs hs 13997 May 27 04:25 tpdxlog.c
-rw-rw-r--. 1 hs hs 285703 May 27 04:25 zheapam.c
-rw-rw-r--. 1 hs hs 59175 May 27 04:25 zheapam_handler.c
-rw-rw-r--. 1 hs hs 62970 May 27 04:25 zheapam_visibility.c
-rw-rw-r--. 1 hs hs 61636 May 27 04:25 zheapamxlog.c
-rw-rw-r--. 1 hs hs 16608 May 27 04:25 zheaptoast.c
-rw-rw-r--. 1 hs hs 16218 May 27 04:25 zhio.c
-rw-rw-r--. 1 hs hs 21039 May 27 04:25 zmultilocker.c
-rw-rw-r--. 1 hs hs 16480 May 27 04:25 zpage.c
-rw-rw-r--. 1 hs hs 43128 May 27 04:25 zscan.c
-rw-rw-r--. 1 hs hs 27760 May 27 04:25 ztuple.c
-rw-rw-r--. 1 hs hs 55849 May 27 04:25 zundo.c
-rw-rw-r--. 1 hs hs 51613 May 27 04:25 zvacuumlazy.c
[hs@node1 zheap]$ cat *c | wc -l
29696
复制
对于那些焦急地等待 zheap 的生产版本的人,我必须指出,这确实是一项重要的任务,并非易事。您已经可以试用和测试 zheap。但是,请记住,我们还没有做到这一点。需要更多时间,尤其是来自社区的反馈,才能使该引擎做好生产准备,能够可靠且无错误地处理任何工作负载。
我不会详细介绍已修复的内容,但我们遇到了一些问题,包括错误、编译器警告等。
还做的是将 zheap 代码与当前版本的 PostgreSQL 合并,以确保我们与所有当前的开发保持同步。
下一步改进 zheap
就下一步而言,清单上有几件事。首先要做的事情之一是处理丢弃工人。那是什么?考虑以下清单:
test=# BEGIN
BEGIN
test=*# CREATE TABLE sample (x int) USING zheap;
CREATE TABLE
test=*# INSERT INTO sample SELECT * FROM generate_series(1, 1000000) AS x;
INSERT 0 1000000
test=*# SELECT * FROM pg_stat_undo_chunks;
logno | start | prev | size | discarded | type | type_header
--------+------------------+------+----------+-----------+------+-----------------------------------
000001 | 000001000021AC3D | | 57 | f | xact | (xid=745, dboid=16384, applied=f)
000001 | 000001000021AC76 | | 44134732 | f | xact | (xid=748, dboid=16384, applied=f)
(2 rows)
test=*# COMMIT;
COMMIT
test=# SELECT * FROM pg_stat_undo_chunks;
logno | start | prev | size | discarded | type | type_header
--------+------------------+------+----------+-----------+------+-----------------------------------
000001 | 000001000021AC3D | | 57 | f | xact | (xid=745, dboid=16384, applied=f)
000001 | 000001000021AC76 | | 44134732 | f | xact | (xid=748, dboid=16384, applied=f)
(2 rows)
复制
我们在这里看到的是 UNDO 块不会消失。他们不断地堆积。目前,可以手动清除它们:
test=# SELECT pg_advance_oldest_xid_having_undo();
pg_advance_oldest_xid_having_undo
-----------------------------------
750
(1 row)
test=# SELECT * FROM pg_stat_undo_chunks;
logno | start | prev | size | discarded | type | type_header
-------+------------------+------+----------+-----------+------+-----------------------------------
000001 | 000001000021AC3D | | 57 | t | xact | (xid=745, dboid=16384, applied=f)
000001 | 000001000021AC76 | | 44134732 | t | xact | (xid=748, dboid=16384, applied=f)
(2 rows)
test=# SELECT pg_discard_undo_record_set_chunks();
pg_discard_undo_record_set_chunks
-----------------------------------
(1 row)
test=# SELECT * FROM pg_stat_undo_chunks;
logno | start | prev | size | discarded | type | type_header
------+-------+------+------+-----------+------+-------------
(0 rows)
复制
如您所见,UNDO 消失了。这里的目标是清理应该自动发生 - 使用“丢弃工人”。实施此过程是列表中的下一件事情。
社区反馈是目前的瓶颈之一。我们邀请所有对 zheap 感兴趣的人联手推动这一进程。欢迎从负载测试到设计反馈的所有内容 - 并高度赞赏!zheap 对于 UPDATE 繁重的工作负载很重要,向前推进这一工作很重要。
全力以赴
如果您想参与其中,或者只是尝试 zheap,我们为您创建了一个 tarball,可以从我们的网站下载。它包含我们最新的 zheap 代码(截至 2021 年 5 月 27 日)。
只需正常编译 PostgreSQL:
./configure --prefix=/your_path/pg --enable-debug --with-cassert
进行安装
光盘贡献
进行安装
然后就可以创建数据库实例,正常启动服务器,开始播放。确保在创建新表时添加“USING zheap”,否则 PostgreSQL 将创建标准的“堆”表(所以不是 zheap )。