PostgreSQL学徒

聊聊PostgreSQL 14 internal这本书

1前言

各位公众号的读者们,好久不见,距离上一次发文还是上一次。今天我们不聊技术不聊故障,就聊聊《PostgreSQL 14 internal》这本书(不少读者和我反馈故障写多了是不是变相劝退🤨)。在今天,我也终于将初稿全部翻译完成了,统计了一下,初稿总计159513个字,工作量确实不小。

从最开始萌生翻译的想法,到说干就干,耗时总共约七个月,今天终于完成了初稿的翻译,特以此篇纪念一下。

这本书是PostgresPro团队的著作,也是市面上难得讲解系统内核的书籍,另外一本比较出名的是SUZUKI 的《The Internals of PostgreSQL》,已经由冯若航、升爷等人翻译成中文。既然涉及到内核原理,里面也难免会涉及到大量的源码,因此接下来还得花费大量时间去审核校稿,快的话预计年底就能正式与各位读者见面。那么这本书有哪些吸引我的地方呢?简单聊几句吧。

2推荐理由

从这本书中,你能学到很多实用的技巧,比如观察云里雾里的infomask:

Image

比如原理性的页剪枝与索引剪枝,什么时候会做索引剪枝?

Image

又比如鲜为人知的堆截断,其实也有一个超时时间:

Image

/*
 * Timing parameters for truncate locking heuristics.
 *
 * These were not exposed as user tunable GUC values because it didn't seem
 * that the potential for improvement was great enough to merit the cost of
 * supporting them.
 */

#define VACUUM_TRUNCATE_LOCK_CHECK_INTERVAL  20 /* ms */
#define VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL  50 /* ms */
#define VACUUM_TRUNCATE_LOCK_TIMEOUT    5000 /* ms */

/*
 * Space/time tradeoff parameters: do these need to be user-tunable?
 *
 * To consider truncating the relation, we want there to be at least
 * REL_TRUNCATE_MINIMUM or (relsize / REL_TRUNCATE_FRACTION) (whichever
 * is less) potentially-freeable pages.
 */

#define REL_TRUNCATE_MINIMUM 1000
#define REL_TRUNCATE_FRACTION 16

再之环形缓冲区ring buffer,用于预防缓冲区污染,并且 toast 的读取会绕过 ring buffer(作为下面第一种策略的特例)

Image

在 internal db里面也有所提及

Image

又比如在索引是一致完好的前提下,什么情况下索引扫描和顺序扫描会产生不一致?什么场景下普通的select会和update相互阻塞?以上种种,各位都可以从这本书中窥探一二。

对于内核开发童鞋,也能从中学到索引引擎接口、查询引擎接口等等。

3后续

以上我仅仅列出了部分,更多精彩内容就要各位读者自行挖掘了,英文不太好的同志可以等这本中文版的出版,因为书中涉及到了不少内核细节,加之我本人并非内核出身,所以后续我得找几位内核开发者一起交叉审核一下。

这本书搞完之后,准备再出一本类似《PostgreSQL DBA实战宝典》之类的原创书籍(书名暂定如此),受众主要是DBA与运维,囊括日常故障分析、原理解析和体系架构等,将我多年以来运维PostgreSQL的经验与心得浓缩于书中,拭目以待。