我有一个非常大的表,带有 blob 字段,名为data
. 我试图弄清楚为什么它没有很好地缓存并且重复SELECT
的 s 很慢:
=> SELECT pg_size_pretty(pg_total_relation_size('data'));
157 GB
这似乎有点大,所以我试图总结数据:
=> SELECT pg_size_pretty(pg_relation_size('data'));
19 GB
使用索引:
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
数据和索引大小的总和约为 26 GB,但总关系大小接近 160 GB。该表不久前从转储中恢复,此后没有进行任何写入。
- 这种差异的解释是什么?
- 有什么方法可以减少浪费的磁盘空间?聚类会有帮助吗?
表格是否有任何可变宽度的列?如果答案是肯定的,您可能会错过吐司表 (pg_toast_xxx)。你需要找到他们的名字(不知道怎么做,需要谷歌)并计算他们的大小。
为了减少空间(例如在删除一堆行之后)执行 VACUUM FULL 并在它之后重新索引表(以防止索引碎片)。
此查询还包括
toast
表和索引: