为什么 PostgreSQL 索引不包含可见性信息?

Why PostgreSQL indexes do not contain visibility information?

我知道 PostgreSQL 中的物理存储是这样的:

heap table:
<old_tuple, t_xmin, t_xmax>
<new_tuple, t_xmin, t_xmax>
index:
<old_index_value, old_RID>
<new_index_value, new_RID>

所以Index-Only Scan需要Visibility Map的帮助。

我的问题是:为什么我们不将 t_xmint_xmax 也存储在索引中?

喜欢:

index:
<old_index_value, old_RID, t_xmin, t_xmax>
<new_index_value, new_RID, t_xmin, t_xmax>

开销比较大- t_xmin, t_xmax 总共有8个字节,将来可能会有16个字节。因此,如果 Postgres 将这些值存储到索引中,那么几乎所有数字索引都会大 2 (bigint) 倍或 2/3 倍 (int)。

今天这不是问题(可能),但 Postgres 开始是在 80 年的一半,而且磁盘容量是个大问题。

第二个动机可能是代码的复杂性和确保数据一致性(没有硬锁定)。 Postgres 中的索引是数据访问加速器,而不是数据源。那么实现就更简单了。 Ingres 是由非常聪明的教授和学生设计的,更强大、更简单(但可能更慢)的设计是首选。