Оптимизация работы с временными таблицами
Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.
В данном разделе описаны механизмы оптимизации работы с временными таблицами, которые снижают нагрузку на файловую систему и системные каталоги, а также повышают эффективность обработки «краткоживущих» данных.
Отложенное размещение временных таблиц
Для временных таблиц используется механизм отложенного создания файлов на диске, при котором данные первоначально размещаются в оперативной памяти и сбрасываются на диск только при исчерпании temp_buffers. Это позволяет снизить нагрузку на подсистему ввода-вывода при интенсивном использовании временных объектов.
Настройка
Для активации функциональности необходимо установить GUC-параметр конфигурации:
SET deferred_temp_table_placement = on;
Или указать значение в postgresql.conf:
deferred_temp_table_placement = on
Применение данного параметра доступно только при запуске сервера.
Поведение
При активной функциональности (включенном параметре deferred_temp_table_placement):
- временные таблицы изначально полностью хранятся в памяти, используя выделенные
temp_buffersбэкенд-процесса; - файлы на диске не создаются, пока в этом нет необходимости;
- только в случае, если
temp_buffersзаполнены, СУБД начинает сбрасывать страницы временных таблиц на диск, чтобы освободить место для новых данных; - уменьшается количество операций ввода-вывода при кратковременном использовании временных таблиц.
Оптимизация при создании relfilenode
Параметр check_temp_relfile_on_create управляет проверкой наличия файлов на диске при создании временных объектов.
В стандартной реализации используется системный вызов access() для проверки уникальности имени файла, что приводит к накоплению отрицательных записей кеша каталогов (dentries) в ОС. При большом числе операций это может вызвать длинные цепочки dentries и ухудшение производительности.
При отключении проверки для временных объектов (с префиксом t_backendid и уникальным OID) запись файла выполняется напрямую. В результате сокращается количество системных вызовов и устраняется деградация производительности при массовом создании и удалении временных таблиц.
Мониторинг
Для просмотра содержимого временного буфера текущего бэкенд-процесса можно использовать представление:
SELECT * FROM pg_buffercache_local;
Представление формируется расширением pg_buffercache и отражает страницы временных данных, находящиеся в локальном буфере текущего бэкенд-процесса.
Пример использования
- приложения, активно создающие и удаляющие множество временных таблиц, например при выполнении аналитических запросов или ETL-процессов;
- сценарии, при которых отложенное размещение временных таблиц уменьшает общее количество операций записи и повышает скорость выполнения при работе с небольшими объемами данных.
Хранение метаданных временных объектов в памяти
Функциональность позволяет не записывать метаданные о временных таблицах и индексах в pg_catalog. Это особенно полезно для приложений, активно создающих временные объекты, и позволяет избежать:
- раздувания системных каталогов;
- избыточной генерации WAL;
- нагрузки на синхронную репликацию;
- удержания длительных транзакций.
Вместо записи в системные каталоги вся информация о временных объектах хранится в памяти текущего бэкенд-процесса, полностью обходя системные таблицы.
Настройка
Для включения функциональности используются параметры конфигурации:
-
enable_temp_memory_catalog(по умолчанию:off)При включении метаданные временных таблиц и индексов сохраняются в памяти бэкенд-процесса, а не в системных каталогах
pg_catalog. -
show_temp_catalog_entries(по умолчанию:off)При включении временные объекты, метаданные которых находятся в памяти, виртуально подставляются в результаты запросов к системным каталогам (например,
SELECT * FROM pg_class), несмотря на отсутствие физических записей.
Методы изменения этих параметров:
-
изменение параметров конфигурации:
- для одиночного экземпляра – в файле
postgresql.confс последующим перезапуском СУБД; - для кластерной конфигурации – в файле
postgres.ymlс последующим перезапуском СУБД;
- для одиночного экземпляра – в файле
-
установка в текущей сессии командой
SET.
Пример:
SET enable_temp_memory_catalog = on;
SET show_temp_catalog_entries = on;
Функциональность работает только при включенном optimize_for_1c.
При включении optimize_for_1c оба параметра включаются автоматически.
Сброс параметра enable_temp_memory_catalog недоступен, пока включен параметр optimize_for_1c.
Внутренние детали и ограничения
Отслеживание зависимостей через общую память
Так как метаданные временных объектов не попадают в pg_depend, целостность зависимостей реализована отдельным механизмом:
- информация о зависимостях временных объектов сохраняется в общей памяти;
- это предотвращает удаление постоянных объектов (например, функций, используемых во временных функциональных индексах) другими бэкенд-процессами, не видящими этих зависимостей.
Защита от переполнения OID (OID wraparound)
СУБД определяет свободные OID путем сканирования pg_class. При отсутствии информации о временных объектах в pg_class возможно повторное использование OID, что может привести к ошибкам.
Для предотвращения конфликтов OID:
- все OID, используемые временными объектами в бэкенд-процессах, отслеживаются в общей памяти;
- логика выделения новых OID учитывает занятые значения и пропускает их.