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 的结果来看,我怀疑这是来自某种排序。有办法避免这种情况吗?不会有那么多的输出行,所以不知何故,我觉得好像应该有一种方法可以在输出处做得更到位......但这是一个非常模糊的直觉。
对 20 亿行进行排序总是需要大量空间。
如果您知道只有几个组,您可以尝试获取哈希聚合并避免排序。您可以尝试以下两件事:
使用扩展统计信息,以便优化器知道只会有几个组:
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)
通过劝阻来迫使计划者采取行动:
SET enable_sort = off;
Run Code Online (Sandbox Code Playgroud)
这将使 PostgreSQL 更喜欢在当前会话中不进行排序的计划。