为什么 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_xmin
、t_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 是由非常聪明的教授和学生设计的,更强大、更简单(但可能更慢)的设计是首选。
我知道 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_xmin
、t_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 是由非常聪明的教授和学生设计的,更强大、更简单(但可能更慢)的设计是首选。