更新时间:2025-05-29 GMT+08:00

如何评估当前表/库空间膨胀比

  • 方法一:如果条件允许,可以通过 INSERT INTO SELECT 将表的数据全量导入到新表,根据新旧表的大小估算空间膨胀比。示例如下:
    gaussdb=# create table t4(like t3);
    CREATE TABLE
    gaussdb=# insert into t4 select * from t3;
    INSERT 0 85376
    gaussdb=# select pg_table_size('t3'::regclass) / pg_table_size('t4'::regclass);
         ?column?
    ------------------
     7.87027797576622
    (1 row)
  • 方法二:使用 \d 查看表结构,估算元组的平均长度,再乘以活元组数来估算表的占用空间。膨胀比 ≈ 表大小 / (活跃行数 * 单行平均长度)。单行平均长度 ≈ 各列长度之和 + 行指针长度(4B) + 元组头长度(24B)。活跃行数可以使用 COUNT(*) 或函数 pg_stat_get_live_tuples 获取。

    示例如下:

    gaussdb=# select pg_table_size('t3'::regclass);
     pg_table_size
    ---------------
          90456064
    (1 row)
    gaussdb=# \d t3;
              Table "public.t3"
     Column |      Type      | Modifiers
    --------+----------------+-----------
     a      | integer        |
     b      | character(100) |
    
    gaussdb=# select count(1) from t3;
     count
    -------
     85376
    (1 row)

    以上示例中,各列长度之和为104B(100B + 4B),有效行数为85376条,有效空间 ≈ 85376 * (104 + 4 + 24) = 11269632。膨胀比 ≈ 90456064 / 11269632 = 8,即空间膨胀了8倍,与方法一的结果近似相等。