У меня есть такая таблица:
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, моя цель состоит в том, чтобы свести (в json) для каждого first_id, всех связанных строк, в другую таблицу.
Я делаю так:
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)
Есть идеи, как его оптимизировать?