是否可以像普通表一样获得 TOAST 表的死/活元组数?
CREATE TABLE messages1 (message text);
INSERT INTO messages1
SELECT (SELECT
string_agg(chr(floor(random() * 26)::int + 65), '')
FROM generate_series(1,10000))
FROM generate_series(1,10);
SELECT reltoastrelid::regclass
FROM pg_class
WHERE relname = 'messages1';
DELETE FROM messages1
WHERE ctid IN (
SELECT ctid
FROM messages1
ORDER BY 1
LIMIT 6
);
postgres=# SELECT reltoastrelid::regclass
postgres-# FROM pg_class
postgres-# WHERE relname = 'messages1';
reltoastrelid
--------------------------
pg_toast.pg_toast_147777
(1 row)
postgres=# select relname, vacuum_count, n_tup_del, n_live_tup, n_dead_tup from pg_stat_user_tables where relname='pg_toast.pg_toast_147777';
relname | vacuum_count | n_tup_del | n_live_tup | n_dead_tup
---------+--------------+-----------+------------+------------
(0 rows)
Run Code Online (Sandbox Code Playgroud)
TOAST 表被视为系统表,因此您需要查询pg_stat_sys_tables,而不是pg_stat_user_tables:
select relname, vacuum_count, n_tup_del, n_live_tup, n_dead_tup
from pg_stat_sys_tables
where relname='pg_toast_147777'
Run Code Online (Sandbox Code Playgroud)
或者你可以把它们放在一起,
select cl.relname ,vacuum_count, n_tup_del, n_live_tup, n_dead_tup
FROM pg_class cl
inner join pg_stat_sys_tables st on st.relid = cl.reltoastrelid
WHERE cl.relname = 'messages1';
Run Code Online (Sandbox Code Playgroud)
该
pg_stat_all_tables视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,显示有关对该特定表的访问的统计信息。的pg_stat_user_tables和pg_stat_sys_tables视图包含相同的信息,但过滤分别仅显示用户和系统表。