postgrespro / pg_pathman

Partitioning tool for PostgreSQL
Other
584 stars 68 forks source link

Вопрос по количеству секций #59

Closed ohmycto closed 7 years ago

ohmycto commented 7 years ago

Привет! Вопрос по количеству секций: в readme сказано: "Large amount of partitions may result in significant planning overhead". Можно ли как-то определить, что такое "large amount"?

В своем докладе на Highload вы упоминали про количество 500 и 1000 секций. В частности, у нас есть скажем 2000-3000 клиентов (аккаунтов) - нормально ли будет завести такое же количество секций по account_id, или же это перебор? Что вообще считается приемлемым числом и от чего это зависит?

zilder commented 7 years ago

Привет!

Вопрос по количеству секций: в readme сказано: "Large amount of partitions may result in significant planning overhead". Можно ли как-то определить, что такое "large amount"?

От наших инженеров я слышал утверждение, что уже при 300 партиций становится проблематично использовать стандартное партиционирование postgres. Я думаю, что все зависит от конкретной системы и нагрузки. Мы как-то замеряли время планирования с pg_pathman и стандартным планировщиком:

planning time chart

Тест проводился на запросах вида select ... from ... where key = 123, т.е. таких, где в условии запроса учавствует ключ и константа. Из графика видно, что время планирования с pg_pathman слабо зависит от количества секций, в то время как в оригинальном постгресе это время растет пропорционально количеству секций.

Если вы будете использовать условия вида where key between ... and ..., то здесь время планирования будет зависеть от того, сколько реально партиций попадают под условия запроса: если только одна, то результат будет аналогичен графику; если же все партиции, то выигрыша по производительности не будет.

В частности, у нас есть скажем 2000-3000 клиентов (аккаунтов) - нормально ли будет завести такое же количество секций по account_id, или же это перебор?

Если вы будете использовать запросы с константами, как описано выше, то на 2000-3000 тысячах партиций проблем быть не должно.

zilder commented 7 years ago

Другой возможный случай -- когда ключ вычисляется в процессе выполнения. Например, при nested loop-е или prepared statement. В этом случае время планирования уменьшить не получится, но можно существенно снизить время работы executor-а. pg_pathman будет вычислять ключ во время выполнения и сканировать только ту партицию/те партиции, которой этот ключ соответствует.

ohmycto commented 7 years ago

Большое спасибо за подробный ответ!