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

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

Новая функциональность СУБД 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