如何估计Postgres表中一列的大小?

Tho*_*ler 27 postgresql

textPostgres 9.1中的表格中有一列类型.我想知道该列对所需磁盘空间的影响.它不需要精确,但我想知道该列是否负责数据库消耗的磁盘空间的20%/ 30%/ ....

我知道pg_relation_size,但它只在表级运行.

我有许多具有相同模式的数据库.我倾倒了一个较小的一个并用grep切割了列并切割并比较了纯文本转储的大小.但这并不一定是实时数据库中空间需求的良好指标,对于大型数据库来说,这也很难做到.

Clo*_*eto 50

select
    sum(pg_column_size(the_text_column)) as total_size,
    avg(pg_column_size(the_text_column)) as average_size,
    sum(pg_column_size(the_text_column)) * 100.0 / pg_relation_size('t') as percentage
from t;
Run Code Online (Sandbox Code Playgroud)

  • pg_relation_size返回基表的大小,不包括toast表.当有人关心每列的磁盘使用情况时,很可能涉及toast表,因此您可能希望使用pg_table_size. (8认同)
  • 如果要计算toast表加上索引的大小,也可以使用pg_total_relation_size. (6认同)
  • 这似乎对表进行了完整的“Seq Scan”,因此当表非常大时要小心。 (3认同)

小智 10

可接受的答案略有改进:漂亮地打印尺寸并使用pg_total_relation_size更加准确。

select
    pg_size_pretty(sum(pg_column_size(column_name))) as total_size,
    pg_size_pretty(avg(pg_column_size(column_name))) as average_size,
    sum(pg_column_size(column_name)) * 100.0 / pg_total_relation_size('table_name') as percentage
from table_name;
Run Code Online (Sandbox Code Playgroud)


Sta*_*lov 7

如果您想要按大小排序的数据库中所有列的报告,那么这里是方法

BEGIN;
CREATE FUNCTION tc_column_size(table_name text, column_name text)
    RETURNS BIGINT AS
$$
    declare response BIGINT;
BEGIN
    EXECUTE 'select sum(pg_column_size(t."' || column_name || '")) from ' || table_name || ' t ' into response;
    return response;
END;
$$
    LANGUAGE plpgsql;

SELECT
    z.table_name,
    z.column_name,
    pg_size_pretty(z.size)
FROM (
    SELECT
        table_name,
        column_name,
        tc_column_size(table_name, column_name) size
    FROM
        information_schema.columns
    WHERE
        table_schema = 'public') AS z
WHERE
    size IS NOT NULL
    -- and z.table_name = 'my_table' -- <--- uncomment to filter a table
ORDER BY
    z.size DESC;

ROLLBACK; -- <--- You may not want to keep that function
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

  • 还应该在第 7 行引用 `table_name`: `EXECUTE 'select sum(pg_column_size(t."' || column_name || '")) from "' || table_name || '" t ' into response;` (2认同)