pg_class中无法找到已创建的临时表,如何查看该表及获取其大小?
临时表的元数据查询与大小获取方案
为什么pg_class查不到临时表?
PostgreSQL的临时表元数据存储在会话专属的临时模式(名称以pg_temp_开头,会话内可简写为pg_temp)中,默认查询pg_class时不会包含临时模式的对象,且临时表仅对创建它的会话可见,跨会话无法访问其元数据。
查找临时表的元数据
方法1:关联pg_namespace筛选临时模式
通过关联系统表pg_namespace,筛选出临时模式下的临时表:
SELECT c.relname AS table_name, n.nspname AS schema_name, c.relpersistence AS persistence_type FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relpersistence = 't';
方法2:直接查询临时模式的pg_class
临时会话内可直接指定临时模式查询:
SELECT relname, oid FROM pg_temp.pg_class WHERE relpersistence = 't';
注意:必须在创建临时表的会话中执行以上查询,其他会话无法看到该临时表的元数据。
获取临时表的大小
单个临时表大小查询
使用pg_total_relation_size(包含数据、索引、FSM等所有关联文件)或pg_relation_size(仅数据文件),需指定临时表的完整模式名:
-- 显示总大小(含索引、FSM等) SELECT pg_size_pretty(pg_total_relation_size('pg_temp.t3')) AS total_size; -- 仅显示数据文件大小 SELECT pg_size_pretty(pg_relation_size('pg_temp.t3')) AS data_size;
批量查询所有临时表大小
结合元数据查询,一次性获取所有临时表的大小:
SELECT c.relname AS table_name, pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size, pg_size_pretty(pg_relation_size(c.oid)) AS data_size FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relpersistence = 't';
补充说明
你在目录中看到的t3_xxxx文件是临时表的物理存储文件,PostgreSQL会在会话结束后自动清理这些文件(除非临时表创建时指定了ON COMMIT PRESERVE ROWS且会话未结束)。
内容的提问来源于stack exchange,提问作者RomanShan
相关产品推荐
相关产品推荐

