PostgreSQL如何统计表中每一列的总大小?
获取PostgreSQL表中各列的总存储大小
你之前的语句select sum(pg_column_size(bks.*)) from books bks;是把整行数据的大小累加,所以只会返回一个整体总和,而非每列单独的统计结果。要实现按列统计总大小,有两种实用方法:
方法一:手动指定列(适合列数少的表)
直接对每个列单独调用pg_column_size()并求和,给结果列设置对应别名:
SELECT SUM(pg_column_size(id)) AS id_size, SUM(pg_column_size(book_title)) AS book_title_size, SUM(pg_column_size(author)) AS author_size, -- 替换为你表中实际的列名 SUM(pg_column_size(publish_date)) AS publish_date_size FROM books;
这种方式简单直接,结果清晰,但如果表结构新增或删除列,需要手动修改SQL语句。
方法二:动态生成SQL(适合列数多或结构易变的表)
利用系统表information_schema.columns自动获取表的所有列名,拼接成统计SQL,避免手动编写每一列:
-- 生成统计用的SQL语句 SELECT 'SELECT ' || string_agg( 'SUM(pg_column_size(' || quote_ident(column_name) || ')) AS ' || quote_ident(column_name || '_size'), ', ' ) || ' FROM books;' AS query FROM information_schema.columns WHERE table_name = 'books' AND table_schema = 'public'; -- 替换为你的表所在schema,默认是public
执行这条语句后,会输出一条完整的统计SQL,复制该SQL再次执行即可得到所有列的总大小。
如果需要直接执行,也可以用PL/pgSQL块:
DO $$ DECLARE sql_query TEXT; BEGIN SELECT string_agg( 'SUM(pg_column_size(' || quote_ident(column_name) || ')) AS ' || quote_ident(column_name || '_size'), ', ' ) INTO sql_query FROM information_schema.columns WHERE table_name = 'books' AND table_schema = 'public'; EXECUTE sql_query; END $$;
注意点
pg_column_size()返回单个值的实际存储字节数(包括变长类型的长度前缀等开销),求和后即为该列所有行的总存储大小。- 若列中有NULL值,
pg_column_size(NULL)返回0,不会影响总和统计。
内容的提问来源于stack exchange,提问作者Qwerty Qazaq
相关产品推荐
相关产品推荐

