14.6. Автоподготовленные операторы

В Postgres Pro Enterprise реализован режим автоподготовки операторов, в котором часто используемые операторы могут неявно подготавливаться, что позволяет оптимизировать затраты на их компиляцию и разбор при каждом последующем выполнении.

По сравнению с применением явно подготовленных операторов, этот режим даёт чуть менее значительное ускорение, но позволяет получать подготовленные планы там, где явные команды PREPARE не поддерживаются. Например, он может быть полезен, когда применяется pgbouncer (в любом режиме, кроме session), когда используются распределённые секционированные таблицы или когда в применяемых приложениях баз данных не предусмотрено выполнение подготовленных операторов.

По умолчанию режим автоподготовки отключён. Чтобы включить его, присвойте ненулевое значение переменной конфигурации autoprepare_threshold, которая определяет, сколько раз должен выполниться оператор, чтобы он был автоматически подготовлен. После того как один запрос с различными буквальными значениями повторяется заданное количество раз, Postgres Pro строит общий план для этого запроса, заменяя все константы параметрами. Общий план для запроса будет выбираться, если ожидаемое время выполнения этого плана окажется меньше, чем среднее время выполнения специализированных планов. Так же, как и с явно подготавливаемыми операторами, при изменениях в каталоге общие планы аннулируются.

Если ваше приложение выполняет множество различных операторов, в результате автоподготовки они могут занимать много памяти, если не ограничить размер кеша. Это особенно важно при большом количестве активных клиентов, так как кеш автоподготовленных операторов существует в рамках обслуживающего процесса. Чтобы избежать раздувания кеша, вы можете сделать следующее:

  • Ограничить число автоподготавливаемых операторов в рамках одного процесса, воспользовавшись параметром autoprepare_limit. Это рекомендуется, когда нагрузку создаёт множество простых запросов.

  • Ограничить объём памяти, который могут занимать автоподготовленные операторы в обслуживающем процессе, воспользовавшись параметром autoprepare_memory_limit. Это может повлечь некоторые издержки, связанные с вычислением объёма кеша автоподготовленных операторов, поэтому данный вариант рекомендуется только для нагрузки со сложными запросами, когда ограничение количества автоподготовленных операторов может быть неэффективным.

В обоих случаях наиболее часто выполняемые запросы будут находиться в памяти под контролем LRU. Если устанавливаются оба параметра, фактически будет действовать ограничение, которое достигается первым.

Вы можете просмотреть все автоподготовленные операторы в текущем сеансе, обратившись к системному представлению pg_autoprepared_statements. В нём показывается текст исходного запроса, типы выделенных параметров, заменяющих буквальные значения, и счётчик выполнений запроса.