Я запускаю Postgres 9.4.4 на экземпляре Amazon RDS db.r3.4xlarge — 16 ЦП, 122 ГБ памяти. Недавно я столкнулся с одним из запросов, который требовал довольно простой агрегации для большой таблицы (~ 270 миллионов записей). Выполнение запроса занимает более 5 часов.
Столбец соединения и столбец группировки в большой таблице имеют определенные индексы. Я попытался поэкспериментировать с work_mem и temp_buffers, установив для каждого 1 ГБ, но это не помогло.
Вот запрос и план выполнения. Любые выводы будут высоко оценены.
explain SELECT
largetable.column_group,
MAX(largetable.event_captured_dt) AS last_open_date,
.....
FROM largetable
LEFT JOIN smalltable
ON smalltable.column_b = largetable.column_a
WHERE largetable.column_group IS NOT NULL
GROUP BY largetable.column_group
Вот план выполнения -
GroupAggregate (cost=699299968.28..954348399.96 rows=685311 width=38)
Group Key: largetable.column_group
-> Sort (cost=699299968.28..707801354.23 rows=3400554381 width=38)
Sort Key: largetable.column_group
-> Merge Left Join (cost=25512.78..67955201.22 rows=3400554381 width=38)
Merge Cond: (largetable.column_a = smalltable.column_b)
-> Index Scan using xcrmstg_largetable_launch_id on largetable (cost=0.57..16241746.24 rows=271850823 width=34)
Filter: (column_a IS NOT NULL)
-> Sort (cost=25512.21..26127.21 rows=246000 width=4)
Sort Key: smalltable.column_b
-> Seq Scan on smalltable (cost=0.00..3485.00 rows=246000 width=4)