从 GROUP BY 创建表会使用大量临时磁盘空间 - 可以避免吗?

Mic*_*mza 2 postgresql disk-space group-by postgresql-10 aws-aurora

我有一个包含约 20 亿行数据的表,我想创建另一个包含一些聚合的表。看起来 PostgreSQL 使用临时磁盘空间来执行这些查询。我可以创建表...

CREATE TABLE my_new_table ...
Run Code Online (Sandbox Code Playgroud)

但是当我插入数据时:

INSERT INTO my_new_table SELECT
   col_1,
   col_2,
   col_3,
   col_4,
   col_5,
   col_6,
   col_7,
   col_8,
   col_9,
   sum(col_10),
   sum(col_11)
FROM
   my_table
GROUP BY
   1,2,3,4,5,6,7,8,9
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 似乎使用临时文件来存储结果,并且空间不足,例如出现如下错误:

无法写入文件“base/pgsql_tmp/pgsql_tmp31757.25”:设备上没有剩余空间

从 EXPLAIN 的结果来看,我怀疑这是来自某种排序。有办法避免这种情况吗?不会有那么多的输出行,所以不知何故,我觉得好像应该有一种方法可以在输出处做得更到位......但这是一个非常模糊的直觉。

Lau*_*lbe 5

对 20 亿行进行排序总是需要大量空间。

如果您知道只有几个组,您可以尝试获取哈希聚合并避免排序。您可以尝试以下两件事:

  1. 使用扩展统计信息,以便优化器知道只会有几个组:

    CREATE STATISTICS groupcount (ndistinct)
       ON col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
       FROM my_table;
    ANALYZE my_table;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过劝阻来迫使计划者采取行动:

    SET enable_sort = off;
    
    Run Code Online (Sandbox Code Playgroud)

    这将使 PostgreSQL 更喜欢在当前会话中不进行排序的计划。