Beta-релиз расширения для секционирования pg_pathman
Секционирование (или партиционирование от английского partitioning) — это процесс физического разделения таблицы на множество мелких управляемых частей. В PostgreSQL традиционно секционирование реализуется через механизм наследования. Каждому наследнику задается CHECK CONSTRAINT, который определяет какие данные должны находиться в каждой секции. При запросе данных из родительской таблицы, в итоговую выборку включаются данные непосредственно родительской таблицы, а также данные дочерних таблиц, чьи CHECK CONSTRAINTs совместимы с условиями запроса.
При ближайшем рассмотрении, использования механизма наследования для секционирования в PostgreSQL обладает рядом недостатков. Основным из них является линейное снижение эффективности планировщика с увеличением количества секций. Выбор секций для включения в план запроса осуществляется полным перебором, что при большом числе секций может вносить существенные накладные расходы, которые могут превосходить расходы на само выполнение запроса.
Расширение pg_pathman призвано оптимизировать время планирования за счет использования метода бинарного поиска для RANGE-секционированных таблиц и хеш-таблиц для HASH-секционирования.
На графике ниже показана зависимость времени планирования от общего количества секций при условии, что в финальный план попадает одна секция. Сравнивается время планирования при использовании механизма наследования (original) и при использовании расширения pg_pathman (pathman).
Не следующем графике представлена зависимость времени планирования от количества секций, попадающих в план (общее число секций – 1096).
Как видно, при малом числе используемых секций и большом общем числе секций, разница во времени планирования может составлять несколько порядков.
pg_pathman распространяется в виде расширения для PostgreSQL 9.5 и доступен на github. В ближайшее время pg_pathman войдёт в сборку PostgresPro. Детальную информацию об использовании pg_pathman можно найти в README.