TOAST 桌上的真空

Gun*_*jan 3 postgresql

是否可以像普通表一样获得 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)

a1e*_*x07 5

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_tablespg_stat_sys_tables视图包含相同的信息,但过滤分别仅显示用户和系统表。