14
Частные и общие планы
Частные планы
может быть полезен при неравномерном распределении,
но запрос планируется заново при каждом вызове
Общий план
оптимален для равномерного распределения
кешируется в случае подготовленных операторов
Seq Scan on tasks
Filter: status = 'done'
Index Scan on tasks
Index Cond: status = 'todo'
Index Scan on tasks
Index Cond: id = $1
строится
с учетом значений
параметров
строится
без учета значений
параметров
При простом протоколе запросов (вспомните тему «Планирование
и выполнение») каждый запрос планируется заново с учетом значений
параметров.
Расширенный протокол позволяет подготавливать операторы, причем
операторы могут иметь параметры. Подготовка всегда включает разбор
и переписывание запроса, и дерево разбора сохраняется в локальной
памяти обслуживающего процесса.
При выполнении подготовленного оператора есть варианты. Запрос
может, как обычно, планироваться каждый раз заново с учетом
значений параметров. Такие планы называются частными (custom).
Это имеет смысл при неравномерном распределении, ведь для разных
значений оптимальные планы могут отличаться. Например, для
высокоселективных условий может лучше работать индексный доступ,
а если значение встречается часто — последовательный.
Но запрос можно спланировать и без учета параметров. Это позволяет
сохранить не только дерево разбора, но и сам план, и не тратить время
на повторное планирование. Такой план называется общим (generic).
Общий план отлично работает в случае равномерного распределения,
когда селективность условия не зависит от конкретного значения.
Но в случае неравномерного распределения общий план может хорошо
работать для одних значений и плохо — для других.
Разберемся, как планировщик решает, какой вариант использовать.