【发布时间】:2019-06-05 09:59:35
【问题描述】:
我有这样一张桌子:
CREATE TABLE values (first_id varchar(26), sec_id int, mode varchar(6), external1_id varchar(23), external2_id varchar(26), x int, y int);
可能有多个值具有相同的 first_id,我的目标是将每个 first_id 的所有相关行展平(转换为 json)到另一个表中。
我是这样做的:
INSERT INTO othervalues(first_id, results)
SELECT first_id, json_agg(values) AS results FROM values GROUP BY first_id;
在结果列中,我有一个包含所有行的 json 数组,以后可以照原样使用。
我的问题是这非常慢,有一个巨大的表:值大约 100 000 000 行,这会减慢我的计算机(我实际上是在本地测试)直到它死掉(这是一个 Ubuntu)。
使用 EXPLAIN 我注意到使用了 GroupPartitioner,我补充说:
SET work_mem = '1GB';
现在它使用 HashPartitioner,但这仍然会杀死我的计算机。一个解释给了我:
Insert on othervalues (cost=2537311.89..2537316.89 rows=200 width=64)
-> Subquery Scan on "*SELECT*" (cost=2537311.89..2537316.89 rows=200 width=64)
-> HashAggregate (cost=2537311.89..2537314.39 rows=200 width=206)
-> Seq Scan on values (cost=0.00..2251654.26 rows=57131526 width=206)
知道如何优化它吗?
【问题讨论】:
-
等等...
values既是列的名称又是表的?您的插入查询中有错字吗? -
你有
first_id的索引吗? -
@stickybit 索引可能对
json_agg的调用没有多大帮助,这可能必须触及组中的每个值(阅读:扫描)。 -
@TimBiegeleisen:啊错过了,
values不是专栏。 -
@TimBiegeleisen 这是一个整行参考。
标签: postgresql optimization query-optimization aggregation