【问题标题】:Postgresql "CLUSTER tablename USING indexname;" takes more disk space than table size plus all indexes combinedPostgresql“使用索引名的集群表名;”占用的磁盘空间超过表大小加上所有索引的总和
【发布时间】: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 的空间。

根据postgresql docs

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


    【解决方案1】:

    这可能是TOAST 表。

    使用pg_total_relation_size('table_name') 获取表格的完整大小。

    【讨论】:

    • 这条命令的结果是61GB!!是表的总大小还是表及其索引?
    • 根据文档,它是“指定表使用的总磁盘空间,包括所有索引和 TOAST 数据”。所以我应该仍然能够运行 CLUSTER
    • 它包括索引。可能会使用一些临时空间来构建索引。
    • 我应该如何知道这些临时文件将占用多少空间?
    • 我什至不确定临时文件。这是反复试验。只需增加磁盘空间即可。
    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 2016-05-05
    • 2011-02-05
    • 2015-03-14
    • 2020-05-15
    • 2019-08-22
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多