Перейти к основному содержимому

Хранение метаданных временных объектов в памяти

Новая функциональность СУБД Pangolin позволяет не записывать метаданные о временных таблицах и индексах в pg_catalog. Для приложений, которые активно создают временные объекты, функциональность помогает избежать:

  • раздувания системных каталогов;
  • избыточной генерации WAL;
  • нагрузки на синхронную репликацию;
  • удержания длительных транзакций.

Вместо записи в каталог, вся информация о временных объектах хранится в памяти текущего бэкенд-процесса, без обращения к системным таблицам.

Настройка

Конфигурационные параметры

Для включения данной функциональности используются следующие параметры конфигурации:

Параметр

Описание

Значение по умолчанию

Контекст

enable_temp_memory_catalog

При включении метаданные для временных таблиц и индексов сохраняются в памяти бэкенда, а не в pg_catalog

off

PGC_USERSET

show_temp_catalog_entries

При включении временные объекты, метаданные которых находятся в памяти, искусственно подставляются в результаты запросов к системным каталогам (например, SELECT * FROM pg_class), хотя физически в pg_class они не записаны

off

PGC_USERSET

Внимание!

Оба параметра должны быть включены вручную, и функция работает только при включенном optimize_for_1c.

Внутренние детали и ограничения

Отслеживание зависимостей через общую память

Так как метаданные не попадают в pg_depend, необходимо отдельно обеспечивать целостность зависимостей:

  • информация о зависимостях временных объектов сохраняется в общей памяти;
  • это предотвращает ситуацию, когда перманентный объект (например, функция, используемая во временном функциональном индексе) удаляется другим бэкендом, не видящим этой зависимости.

Защита от переполнения OID (OID wraparound)

СУБД Pangolin определяет свободные OID при помощи сканирования pg_class. При отсутствии информации о временных объектах в pg_class может произойти повторное использование OID, что приведет к ошибкам.

log2_temp_objects_hash_partitions определяет число разделов в хеш-таблице для отслеживания OID временных объектов. Значение по умолчанию: 4 (16 разделов). Минимальное значение: 0 (1 раздел). Максимальное значение: 16 (65536 раздела).

Для предотвращения конфликтов OID:

  • все OID, используемые временными объектами в бэкендах, отслеживаются в общей памяти;
  • логика выделения новых OID учитывает эти значения и пропускает занятые OID.

Ограничения

Так как метаданные временных объектов хранятся в общей памяти, существуют ограничения на количество объектов и количество зависимостей:

Параметр

Описание

Значение по умолчанию

Минимальное значение

Максимальное значение

temp_permanent_depend_count

Определяет максимальное количество зависимостей временных объектов от постоянных объектов

2

2

INT_MAX

temp_objects_global_count

Определяет максимальное количество временных объектов в системе

1024

256

INT_MAX