Добавить в корзинуПозвонить
Найти в Дзене
Postgres DBA

autoprepare_threshold - описание параметра

Параметр autoprepare_threshold — это механизм автоматической подготовки операторов (auto-prepare) в СУБД Postgres Pro Enterprise. Простыми словами, он позволяет серверу самостоятельно, без явных команд от приложения, находить и кешировать план выполнения для часто повторяющихся однотипных запросов с разными значениями, что может значительно ускорить их обработку.
Подготовленный оператор — это
Оглавление

Параметр autoprepare_threshold — это механизм автоматической подготовки операторов (auto-prepare) в СУБД Postgres Pro Enterprise. Простыми словами, он позволяет серверу самостоятельно, без явных команд от приложения, находить и кешировать план выполнения для часто повторяющихся однотипных запросов с разными значениями, что может значительно ускорить их обработку.

Подготовленный оператор — это заранее разобранный и оптимизированный SQL-запрос, план выполнения которого сохранен на сервере. Повторное выполнение такого запроса происходит быстрее, так как этапы анализа (парсинга) и планирования пропускаются. В стандартном PostgreSQL для этого используются явные команды PREPARE и EXECUTE. autoprepare_threshold автоматизирует этот процесс.

Зачем это нужно

Основная цель — снизить накладные расходы на разбор и планирование часто выполняемых запросов. Автоматическая подготовка особенно полезна в сценариях, где использование явных подготовленных операторов затруднено или невозможно:

  • При использовании пулера соединений PgBouncer в режимах, отличных от session.
  • При работе с распределенными секционированными таблицами.
  • Когда приложение не использует или не может использовать подготовленные операторы на своей стороне.

Как это работает

Алгоритм работы параметра можно описать следующим образом:

  1. Включение: По умолчанию режим автоподготовки выключен (autoprepare_threshold = 0). Чтобы активировать его, параметру нужно присвоить ненулевое значение.
  2. Отслеживание: Сервер отслеживает выполнение запросов. Если один и тот же текстовый шаблон запроса (но с разными литералами-константами) выполняется снова и снова, сервер начинает подсчет.
  3. Срабатывание порога: Как только счетчик выполнений для конкретного шаблона достигает значения autoprepare_threshold, сервер автоматически выполняет подготовку. С этого момента для данного шаблона невидимо для клиента начинает использоваться сохраненный подготовленный план.

Пример: При autoprepare_threshold = 3 сервер начнет использовать подготовленный план только после третьего выполнения запросов вроде SELECT * FROM users WHERE city = 'Москва', SELECT * FROM users WHERE city = 'Питер' и т.д.

Важные нюансы и ограничения

У этого механизма есть ряд особенностей, которые важно учитывать:

  • Общие и специализированные планы: После подготовки сервер строит общий (generic) план, где все константы заменены на параметры (например, $1, $2). Этот план не учитывает конкретные значения. Сервер сравнивает стоимость выполнения этого общего плана с пользовательскими (custom) планами, которые строятся для каждого конкретного набора параметров. Общий план будет использоваться, только если он оценивается как более эффективный в среднем.
  • Потребление памяти: Кеш подготовленных операторов хранится в памяти каждого обслуживающего процесса (бэкенда). При большом количестве уникальных запросов и активных подключений это может привести к значительному расходу оперативной памяти. Для контроля над этим существуют дополнительные параметры:
  • autoprepare_limit: ограничивает количество планов в кеше одного процесса.
  • autoprepare_memory_limit: ограничивает объем памяти, занимаемый планами.
  • В обоих случаях для вытеснения старых планов используется алгоритм LRU (Least Recently Used).
  • Очистка кеша: Кеш автоматически подготовленных операторов полностью сбрасывается при определенных событиях: при выполнении команд DISCARD PLANS или DISCARD ALL, а также после команд ALTER SYSTEM или SET.
  • Область применения: Этот параметр — расширение, специфичное для Postgres Pro Enterprise, и отсутствует в стандартной версии PostgreSQL или других производных СУБД.

Заключение

autoprepare_threshold — это мощный инструмент для прозрачной оптимизации производительности в Postgres Pro Enterprise, который берет на себя рутинную задачу по выявлению и подготовке часто выполняемых запросов. Его внедрение требует аккуратного подбора порогового значения и настройки ограничений памяти (autoprepare_limit и autoprepare_memory_limit), чтобы найти баланс между скоростью выполнения запросов и потреблением ресурсов сервера.