最近在分析PostgreSQL-14版本性能提升的时候,关注到了Snapshots的这一部分。发现在PostgreSQL-14版本,连续合入了好几个和Snapshots相关的patch。

并且,Andres Freund也通过这些改进显著减少了已确定的快照可扩展性瓶颈,从而改进了Postgres处理大量连接的问题,因为在连接数很高时计算一个快照的代价是很昂贵的。(对于分析连接可扩展性的局限性可以参考Andres Freund的这篇文章 https://techcommunity.microsoft.com/t5/azure-database-for-postgresql/analyzing-the-limits-of-connection-scalability-in-postgres/ba-p/1757266)

本篇文章,我会结合Andres Freund的几个patch进行一些分析,看看在PostgreSQL-14版本里对于Snapshots做的这部分优化。
在PostgreSQL里是使用SnapshotData结构体的xip来记录哪些事务正在运行中,正常情况下,对于普通的MVCC快照,xip记录了所有运行中的事务ID。(除了快照是处于recovery状态产生的,这个时候它为空)
typedef struct SnapshotData
{
TransactionId xmin; /* all XID < xmin are visible to me */