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

pgtt. Глобальные временные таблицы (Global Temporary Tables)

Версия: 1.0.

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: pgtt_schema

Расширение pgtt реализует механизм глобальных временных таблиц (GTT), при котором таблица является постоянным объектом базы данных, а ее данные изолируются в пределах текущего сеанса или транзакции.

Описание

В базовой конфигурации Pangolin отсутствует возможность создания таблиц с подобным поведением.

Глобальная временная таблица создается оператором CREATE TEMPORARY TABLE ... при наличии ключевого слова GLOBAL или комментария /*GLOBAL*/.

Доработка

Доработка не проводилась.

Ограничения

  1. Партиционирование глобальных временных таблиц не поддерживается. Создание GTT с использованием механизма PARTITION BY запрещено.

  2. Ограничения внешнего ключа (FOREIGN KEY) для GTT не поддерживаются. Попытка создания внешнего ключа завершится ошибкой:

    ERROR: attempt to create referential integrity constraint on global temporary table
  3. Создание таблицы-каталога pg_global_temp_tables не отражается в аудите. При включенном pgaudit.log = 'all' фиксируется создание самой глобальной временной таблицы, однако автоматическое создание служебной таблицы-каталога в аудит не попадает.

  4. Переименование глобальной временной таблицы возможно только до ее первого использования в текущем сеансе. Если в сеансе уже создана временная копия таблицы в схеме pg_temp_*, операция ALTER TABLE ... RENAME будет заблокирована.

  5. Удаление глобальной временной таблицы невозможно, если она используется в текущем сеансе. Если временная таблица уже создана, выполнение DROP TABLE приведет к ошибке:

    ERROR: can not drop a GTT that is in use.

    Удаление становится возможным после завершения сеанса.

  6. Поведение ON COMMIT зависит от выбранного режима:

    • в режиме ON COMMIT PRESERVE ROWS данные сохраняются после COMMIT;
    • в режиме ON COMMIT DELETE ROWS данные удаляются после COMMIT, если для таблицы не открыты удерживаемые курсоры.

Настройка

Для настройки расширения выполните шаги:

  1. Добавьте библиотеку в параметр session_preload_libraries:

    session_preload_libraries = 'pgtt'
  2. Выполните reload или перезапуск сервера.

  3. Создайте расширение:

    CREATE EXTENSION pgtt;

После установки автоматически создастся таблица-каталог:

pgtt_schema.pg_global_temp_tables

Расширение управляется параметрами:

Параметр

По умолчанию

Значения

Уровень

Назначение

pgtt.enabled

true

true/false

USERSET

Глобальное включение или отключение механизма глобальных временных таблиц

Использование

Принцип работы

При создании глобальной временной таблицы расширение перехватывает выполнение оператора CREATE TEMPORARY TABLE и проверяет наличие ключевого слова GLOBAL или комментария /*GLOBAL*/.

Если используется ключевое слово GLOBAL, дополнительно выводится предупреждение:

WARNING: GLOBAL is deprecated in temporary table creation

Использование комментария /*GLOBAL*/ является рекомендуемым способом создания глобальной временной таблицы.

После создания GTT расширение выполняет действия:

  1. Создает нежурналируемую таблицу-шаблон в схеме pgtt_schema.
  2. Регистрирует таблицу в каталоге pgtt_schema.pg_global_temp_tables.

Таблица-шаблон является постоянным объектом базы данных и хранит структуру таблицы.

При первом обращении к таблице (операции SELECT, INSERT, UPDATE, DELETE и другие) автоматически создается временная таблица в схеме вида pg_temp_*, полностью повторяющая структуру шаблона.

Дальнейшие операции выполняются над временной таблицей текущего сеанса.

Ниже приведен пример создания глобальной временной таблицы с использованием рекомендуемого комментария /*GLOBAL*/:

CREATE /*GLOBAL*/ TEMPORARY TABLE gtt_test (
id integer,
name text
);

После создания таблица регистрируется в служебном каталоге расширения. Проверить регистрацию можно следующим запросом:

SELECT * FROM pgtt_schema.pg_global_temp_tables;

Изоляция данных

Глобальная временная таблица имеет общую структуру, но данные изолированы по сеансам.

В одном сеансе можно выполнить:

INSERT INTO gtt_test VALUES (1,'one'),(2,'two');
SELECT * FROM gtt_test;

В другом сеансе выполнение запроса вернет пустой результат, так как данные не разделяются между сеансами:

SELECT * FROM gtt_test;

Режимы ON COMMIT

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

По умолчанию используется режим:

ON COMMIT PRESERVE ROWS

В этом режиме данные сохраняются после выполнения COMMIT.

При использовании режима данные удаляются после выполнения COMMIT, если для таблицы не открыты удерживаемые курсоры:

ON COMMIT DELETE ROWS

Поддерживаемые объекты

Для глобальных временных таблиц допускается создание дополнительных объектов:

  • индексов;
  • ограничений (кроме внешних ключей);
  • триггеров.

Попытка создания внешнего ключа завершится ошибкой, указанной в разделе «Ограничения».

Управление

Переименование

Переименование глобальной временной таблицы выполняется стандартной командой ALTER TABLE ... RENAME.

Расширение перехватывает выполнение этой команды и проверяет, зарегистрирована ли таблица в каталоге pg_global_temp_tables.

Пример команды:

ALTER TABLE gtt_test RENAME TO gtt_test_new;

Если в текущем сеансе уже создана временная копия таблицы в схеме pg_temp_*, операция запрещается.

В этом случае необходимо завершить текущий сеанс и повторить переименование.

Удаление

Удаление глобальной временной таблицы выполняется стандартной командой DROP TABLE.

При выполнении команды расширение удаляет таблицу-шаблон из схемы pgtt_schema и удаляет запись из каталога pg_global_temp_tables.

Пример команды:

DROP TABLE gtt_test;

Если таблица используется в текущем сеансе (создана временная копия в pg_temp_*), операция завершается ошибкой:

ERROR: can not drop a GTT that is in use.

Удаление возможно после завершения сеанса.

Диагностика

Проверка включения расширения

Для проверки глобального включения механизма GTT используйте параметр pgtt.enabled.

Выполните следующий запрос:

SHOW pgtt.enabled;

Значение true означает, что механизм глобальных временных таблиц включен.

Проверка регистрации глобальных временных таблиц

Для проверки списка зарегистрированных глобальных временных таблиц выполните запрос к служебному каталогу расширения:

SELECT * FROM pgtt_schema.pg_global_temp_tables;

В результате будет отображена информация о таблицах-шаблонах, включая имя схемы, имя таблицы и режим сохранения данных.

Проверка создания временной копии в сеансе

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

SELECT n.nspname, c.relname
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = 'gtt_test';

Если таблица использовалась в сеансе, в результате будут отображены:

  • запись в схеме pgtt_schema — таблица-шаблон;
  • запись в схеме вида pg_temp_* — временная таблица текущего сеанса.

Отсутствие записи в pg_temp_* означает, что временная таблица еще не создавалась в данном сеансе.

Отключение

Для отключения функциональности выполните:

DROP EXTENSION IF EXISTS pgtt;

Удалите pgtt из параметра session_preload_libraries и выполните reload или перезапуск сервера.