【问题标题】:How to estimate the size of one column in a Postgres table?如何估计 Postgres 表中一列的大小?
【发布时间】:2013-08-21 10:22:42
【问题描述】:

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

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

我有许多具有相同架构的数据库。我转储了一个较小的列,并用 grep 和剪切并比较了纯文本转储的大小。但这不一定是实时数据库中空间需求的良好指标,而且对于大型数据库也更难做到这一点。

【问题讨论】:

    标签: postgresql


    【解决方案1】:
    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;
    

    【讨论】:

    • pg_relation_size 返回基表的大小,不包括 toast 表。当有人关心每列的磁盘使用情况时,很可能涉及到 toast 表,因此您可能希望使用 pg_table_size 来代替。
    • 如果要计算toast表加上索引的大小,也可以使用pg_total_relation_size。
    • 这似乎在桌子上做了一个完整的Seq Scan,所以当桌子很大时要小心。
    【解决方案2】:

    对已接受的答案略有改进:漂亮地打印大小并使用 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;
    

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2020-12-24
        • 2023-03-21
        • 2020-02-29
        • 2017-04-02
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多