PostgreSQL 关系大小不总结

Ada*_*tan 5 postgresql database-size size

我有一个非常大的表,带有 blob 字段,称为data. 我试图弄清楚为什么它没有被很好地缓存并且重复的SELECTs 很慢:

=> SELECT pg_size_pretty(pg_total_relation_size('data'));
157 GB
Run Code Online (Sandbox Code Playgroud)

这看起来有点大,所以我试着总结一下数据:

=> SELECT pg_size_pretty(pg_relation_size('data'));
19 GB
Run Code Online (Sandbox Code Playgroud)

随着指数:

SELECT pg_size_pretty(pg_relation_size('data_pkey'));
757 MB   
SELECT pg_size_pretty(pg_relation_size('data_file_end_date_idx'));
766 MB   
SELECT pg_size_pretty(pg_relation_size('data_file_end_date_idx'));
766 MB
SELECT pg_size_pretty(pg_relation_size('data_merged_idx'));
854 MB
SELECT pg_size_pretty(pg_relation_size('data_owner_idx'));
794 MB
SELECT pg_size_pretty(pg_relation_size('data_session_format_idx'));
779 MB
Run Code Online (Sandbox Code Playgroud)

数据和索引大小的总和约为 26 GB,但总关系大小接近 160 GB。该表刚刚从转储中恢复,此后没有进行任何写入。

  • 这种差异的解释是什么?
  • 有什么办法可以减少浪费的磁盘空间?聚类会有帮助吗?

小智 4

表格是否有可变宽度的列?如果答案是肯定的,那么您可能错过了 toast 表 (pg_toast_xxx)。你需要找到它们的名字(不知道如何做,需要谷歌搜索)并计算它们的大小。

要减少空间(例如删除一堆行后),请执行 VACUUM FULL 并在其后重新索引表(以防止索引碎片)。