У меня есть следующие таблицы tbl
:Как принудительно использовать GroupAggregates?
id user_id amount
PK integer integer
Я также создал индекс по user_id
в
CREATE INDEX idx_fk_user_id
ON tbl
USING btree
(user_id);
Теперь объяснить план выполнения
EXPLAIN ANALYZE SELECT SUM(amount) s
FROM tbl
GROUP BY user_id
который вернул мне
"HashAggregate (cost=117903.97..117905.14 rows=118 width=9) (actual time=1869.591..1869.623 rows=207 loops=1)"
" -> Seq Scan on tbl (cost=0.00..101439.31 rows=3292931 width=9) (actual time=0.017..501.316 rows=3292931 loops=1)"
Насколько я понимаю, HashAggregates использует большой объем памяти. Таким образом, я полагаю, что вместо этого было бы полезно использовать GroupAggregates. Таблица используется в основном для чтения (все данные записываются заданием планировщика один раз в день).
Как подать заявку GroupAggregates
здесь, а не HashAggregates
?
Вопрос заключается в том, почему вы хотите, чтобы «применить» 'GroupAggregate"? Если планировщик решил использовать 'HashAggregate' то, видимо, имеется достаточно памяти и потому что он считает, что это самая эффективная вещь. Объем памяти, который можно использовать для такой операции, определяется настройкой «work_mem». Если вы уменьшите это, вы можете увидеть «GroupAggregate», но я сомневаюсь, что ваш запрос будет быстрее. –