我有这两个相同的表:
Table "public.region"
Column | Type | Collation | Nullable | Default
-------------+----------+-----------+----------+---------
r_regionkey | integer | | not null |
r_name | char(25) | | |
r_comment | char(152) | | |
Indexes:
"region_pkey" PRIMARY KEY, btree (r_regionkey)
和
Table "public.region2"
Column | Type | Collation | Nullable | Default
-------------+----------+-----------+----------+---------
r_regionkey | smallint | | not null |
r_name | text | | |
r_comment | text | | |
Indexes:
"region_pkey" PRIMARY KEY, btree (r_regionkey)
我正在使用smallint
andtext
为了节省空间,但奇怪的是结果如下:
select pg_size_pretty(pg_table_size('region'))
返回8192 bytes
时
select pg_size_pretty(pg_table_size('region2'))
返回48 kB
。
为什么要region2
占用更多空间,即使我使用的是smallint
代替integer
和text
代替char(n)
?
运行
VACUUM FULL public.region;
and后VACUUM FULL public.region2;
,再次测试:三个可能的问题:
显而易见的原因:更新或删除导致表膨胀。被 删除
VACUUM FULL
。模式限定名称('public.region' 而不仅仅是 'region')确保您不会在不同的模式中意外测量错误的表。可能不是这样。
pg_table_size()
包括辅助关系叉(文件),可以为一个表填充,但不能为另一个表填充。出于您的目的,更准确的测试是pg_relation_size()
.手册:
和:
由于您的示例没有TOAST 表,因此只有
fsm
并vm
有所作为。对于较大的桌子,这些尺寸通常可以忽略不计,但与您的最小测试相关。之后两者都可能下降到“0字节”VACUUM FULL
。测试更多行(数千行)。
有关的: