13
Порядок соединений
Количество вариантов соединений растет экспоненциально
с ростом количества таблиц в запросе
Соединение JOIN
полный перебор при числе соединений не более join_collapse_limit = 8
дальше — группами по join_collapse_limit таблиц
Соединение через запятую
полный перебор при числе соединений не более geqo_threshold = 12
дальше — генетический алгоритм
Материализация — подсказка планировщику
С ростом количества таблиц в запросе число вариантов соединений
и, как следствие, затраты на выбор плана растут экспоненциально.
Если число соединений (записанных в виде JOIN) превышает значение
join_collapse_limit (по умолчанию 8), планировщик рассматривает
возможные соединения в группах по join_collapse_limit таблиц, а затем
соединяет эти группы между собой.
(Для подзапросов в предложении FROM есть похожий параметр —
from_collapse_limit.)
Если таблицы соединены запятой (без ключевого слова JOIN),
планировщик рассматривает все варианты соединений, но
переключается на генетический алгоритм оптимизации, когда
количество соединений превышает geqo_threshold (12 по умолчанию).
Все это может приводить к неоптимальным планам. Подробности
можно прочитать в статье Павла Толмачева:
Вручную управляя материализацией — либо с помощью CTE, либо
разбивая запрос на части и задействуя временные таблицы, —
разработчик может разделить таблицы на группы, каждую из которых
оптимизатор будет планировать отдельно. Обычно CTE — более
простой и эффективный способ, но второй вариант позволяет
проанализировать временную таблицу и сообщить таким образом
планировщику больше информации о данных.