Параметр autoprepare_threshold — это механизм автоматической подготовки операторов (auto-prepare) в СУБД Postgres Pro Enterprise. Простыми словами, он позволяет серверу самостоятельно, без явных команд от приложения, находить и кешировать план выполнения для часто повторяющихся однотипных запросов с разными значениями, что может значительно ускорить их обработку.
Подготовленный оператор — это заранее разобранный и оптимизированный SQL-запрос, план выполнения которого сохранен на сервере. Повторное выполнение такого запроса происходит быстрее, так как этапы анализа (парсинга) и планирования пропускаются. В стандартном PostgreSQL для этого используются явные команды PREPARE и EXECUTE. autoprepare_threshold автоматизирует этот процесс.
Зачем это нужно
Основная цель — снизить накладные расходы на разбор и планирование часто выполняемых запросов. Автоматическая подготовка особенно полезна в сценариях, где использование явных подготовленных операторов затруднено или невозможно:
- При использовании пулера соединений PgBouncer в режимах, отличных от session.
- При работе с распределенными секционированными таблицами.
- Когда приложение не использует или не может использовать подготовленные операторы на своей стороне.
Как это работает
Алгоритм работы параметра можно описать следующим образом:
- Включение: По умолчанию режим автоподготовки выключен (autoprepare_threshold = 0). Чтобы активировать его, параметру нужно присвоить ненулевое значение.
- Отслеживание: Сервер отслеживает выполнение запросов. Если один и тот же текстовый шаблон запроса (но с разными литералами-константами) выполняется снова и снова, сервер начинает подсчет.
- Срабатывание порога: Как только счетчик выполнений для конкретного шаблона достигает значения 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), чтобы найти баланс между скоростью выполнения запросов и потреблением ресурсов сервера.