CREATE TEMP TABLE test1 (a int, b int);
INSERT INTO test1 VALUES (16777217, 131584);
VACUUM (DISABLE_PAGE_SKIPPING) test1; -- set up FSM
SELECT t_ctid, t_infomask, t_infomask2, raw_flags, combined_flags
FROM heap_page_items(get_raw_page('test1', 0)),
LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2);
返回:
t_ctid | t_infomask | t_infomask2 | raw_flags | combined_flags
--------+------------+-------------+-----------------------------------------------------------+--------------------
(0,1) | 2816 | 2 | {HEAP_XMIN_COMMITTED,HEAP_XMIN_INVALID,HEAP_XMAX_INVALID} | {HEAP_XMIN_FROZEN}
(0,2) | 2304 | 2 | {HEAP_XMIN_COMMITTED,HEAP_XMAX_INVALID} | {}
(2 rows)
从 test1 中选择 ctid、xmin、xmax;
返回:
ctid | xmin | xmax
-------+-------+------
(0,1) | 25626 | 0
(0,2) | 25642 | 0
(2 rows)
参考:
File: /home/jian/Desktop/pg_sources/main/postgres/src/include/access/htup_details.h
204: #define HEAP_XMIN_COMMITTED 0x0100 /* t_xmin committed */
205: #define HEAP_XMIN_INVALID 0x0200 /* t_xmin invalid/aborted */
206: #define HEAP_XMIN_FROZEN (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)
尝试将这个组合标志 HEAP_XMIN_FROZEN 理解为简单的英语:
对于这个特定的表,此时,任何元组 txid >= 25626 对每个会话都是可见的。我的理解正确吗?
也不确定 HEAP_XMIN_COMMITTED、HEAP_XMIN_INVALID 在这种情况下意味着什么。源代码注释非常有限。
您的示例仅插入一行,但您的查询显示两个元组,因此两者不匹配。
不管怎样,
HEAP_XMIN_FROZEN
意味着元组无条件可见,并且它的xmin
和xmax
应该被忽略。为了避免需要额外的标志,HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID
使用了原本不可能的组合来对该状态进行编码。