Группировка слишком медленная в Amazon RDS Postgres

Я запускаю 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)

person Vaidhyanathan Srikumar Subrama    schedule 29.11.2015    source источник


Ответы (1)


Вы говорите, что ключ соединения и ключ группировки в большой таблице индексируются, но не упоминаете ключ соединения в маленькой таблице.

Слияния и сортировки являются большим источником медлительности. Однако меня также беспокоит, что вы возвращаете примерно 700 000 строк данных. Это действительно полезно для вас? Какова ситуация, когда вам нужно вернуть столько данных, но 5-часовое ожидание слишком долго? Если вам не нужны все эти данные, то фильтрация как можно раньше — это, безусловно, самый большой прирост скорости, который вы можете себе представить.

person Nathaniel Waisbrot    schedule 30.11.2015
comment
Спасибо за ваш вклад. Я также пытался индексировать меньшую таблицу, но опять же, это не очень помогло. Также о ранней фильтрации строк, к сожалению, нам нужно генерировать весь этот набор данных каждый день. Казалось, все работает нормально (менее 10 минут), когда мы использовали Redshift для выполнения той же задачи. Однако из-за некоторых технических требований нам пришлось перейти на RDS. - person Vaidhyanathan Srikumar Subrama; 30.11.2015
comment
В этом есть смысл. Redshift разделил бы ваши данные, и вы бы выполняли несколько небольших объединений параллельно. Возможно, вам следует попытаться изменить эти технические требования. После того, как вы потратите 10 минут на выполнение запроса в RS, у вас будет еще 290 минут для работы, прежде чем вы станете таким же медленным, как ваше текущее решение. - person Nathaniel Waisbrot; 01.12.2015