【发布时间】:2020-09-06 10:19:04
【问题描述】:
我在数据库中有一个很大的表。表的大小及其索引如下表所示:
table_size
----------------
22 GB
schemaname | scan_count | tablename | indexname | index_size
------------+------------+-----------+-----------------------------------------------------------------+------------
public | 1352665306 | t1 | ind1 | 6686 MB
public | 1492127808 | t1 | ind2 | 6587 MB
public | 3492322 | t1 | ind3 | 4747 MB
public | 71810172 | t1 | ind4 | 4237 MB
public | 80547954 | t1 | cluster_ind | 4035 MB
public | 3628773 | t1 | ind6 | 3700 MB
如您所见,表大小为 22GB。它有 6 个不同的索引,总共占用 30GB 的空间。
CLUSTER 可以使用指定索引上的索引扫描或(如果索引是 b 树)顺序扫描然后排序来重新排序表。它将尝试根据规划器成本参数和可用统计信息选择更快的方法。
使用索引扫描时,会创建一个表的临时副本,其中包含按索引顺序排列的表数据。还会创建表上每个索引的临时副本。因此,您需要磁盘上的可用空间至少等于表大小和索引大小的总和。
但是,df -h 显示我在包含我的 postgresql 数据的分区上有 75GB 的可用空间,当我尝试使用以下命令将表聚集在 cluster_ind 索引上时,我仍然用完了磁盘空间:
cluster table using cluster_ind;
我遇到了这个错误:
ERROR: could not extend file "base/16385/2165933.3": wrote only 4096 of 8192 bytes at block 394731
HINT: Check free disk space.
问题:除了表大小和索引大小总和之外,在集群期间还有什么使用磁盘空间?我如何估计在使用索引的表上运行 CLUSTER 命令所需的空间?
【问题讨论】:
标签: postgresql diskspace clustered-index