PostgreSQL中查询包含TOAST值的列总大小方法
如何查询PostgreSQL列的完整大小(包含TOAST存储)
精确计算法(推荐)
如果需要准确得到目标列的总磁盘占用(包括TOAST压缩后的存储),可以通过创建仅包含该列的临时表,再查询临时表的总大小:
-- 替换your_table_name和your_column_name为实际表名和列名 CREATE TEMP TABLE temp_single_col AS SELECT your_column_name FROM your_table_name; -- 获取临时表的总大小(含TOAST) SELECT pg_total_relation_size('temp_single_col') AS total_column_size_bytes; -- 可选:删除临时表 DROP TABLE temp_single_col;
pg_total_relation_size会返回表本身加上其关联TOAST表的总字节数,刚好对应目标列的完整存储大小(包含所有TOAST数据)。
近似估算方法(快速)
如果不需要绝对精确,只是快速估算,可以利用系统统计信息:
- 先获取表的总大小(含TOAST):
SELECT pg_total_relation_size('your_table_name') AS total_table_size_bytes; - 再获取目标列的平均行内宽度和表所有列的平均总宽度:
SELECT (SELECT avg_width FROM pg_stats WHERE tablename='your_table_name' AND attname='your_column_name') AS col_avg_width, (SELECT sum(avg_width) FROM pg_stats WHERE tablename='your_table_name') AS total_avg_width; - 估算列总大小 = 表总大小 * (col_avg_width / total_avg_width)
这种方法的误差来自统计信息的近似性,但优点是无需创建临时表,执行速度快。
关键说明
pg_column_size()仅返回字段在行内的存储大小,对于TOAST化的字段,它返回的是指向TOAST数据的指针大小(通常是28字节),而非实际TOAST数据的大小,所以不能直接用它累加得到总大小。- TOAST表的
chunk_id指向原表的行(ctid),但一个行可能有多个TOAST字段,因此无法通过TOAST表直接按列分组统计大小。
内容的提问来源于stack exchange,提问作者Gabe Braden
相关产品推荐
相关产品推荐

