pgtt. Глобальные временные таблицы (Global Temporary Tables)
Версия: 1.0.
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
pgtt_schema
Расширение pgtt реализует механизм глобальных временных таблиц (GTT), при котором таблица является постоянным объектом базы данных, а ее данные изолируются в пределах текущего сеанса или транзакции.
Описание
В базовой конфигурации Pangolin отсутствует возможность создания таблиц с подобным поведением.
Глобальная временная таблица создается оператором CREATE TEMPORARY TABLE ... при наличии ключевого слова GLOBAL или комментария /*GLOBAL*/.
Доработка
Доработка не проводилась.
Ограничения
-
Партиционирование глобальных временных таблиц не поддерживается. Создание GTT с использованием механизма
PARTITION BYзапрещено. -
Ограничения внешнего ключа (FOREIGN KEY) для GTT не поддерживаются. Попытка создания внешнего ключа завершится ошибкой:
ERROR: attempt to create referential integrity constraint on global temporary table -
Создание таблицы-каталога
pg_global_temp_tablesне отражается в аудите. При включенномpgaudit.log = 'all'фиксируется создание самой глобальной временной таблицы, однако автоматическое создание служебной таблицы-каталога в аудит не попадает. -
Переименование глобальной временной таблицы возможно только до ее первого использования в текущем сеансе. Если в сеансе уже создана временная копия таблицы в схеме
pg_temp_*, операцияALTER TABLE ... RENAMEбудет заблокирована. -
Удаление глобальной временной таблицы невозможно, если она используется в текущем сеансе. Если временная таблица уже создана, выполнение
DROP TABLEприведет к ошибке:ERROR: can not drop a GTT that is in use.Удаление становится возможным после завершения сеанса.
-
Поведение ON COMMIT зависит от выбранного режима:
- в режиме
ON COMMIT PRESERVE ROWSданные сохраняются послеCOMMIT; - в режиме
ON COMMIT DELETE ROWSданные удаляются послеCOMMIT, если для таблицы не открыты удерживаемые курсоры.
- в режиме
Настройка
Для настройки расширения выполните шаги:
-
Добавьте библиотеку в параметр
session_preload_libraries:session_preload_libraries = 'pgtt' -
Выполните
reloadили перезапуск сервера. -
Создайте расширение:
CREATE EXTENSION pgtt;
После установки автоматически создастся таблица-каталог:
pgtt_schema.pg_global_temp_tables
Расширение управляется параметрами:
Параметр | По умолчанию | Значения | Уровень | Назначение |
|---|---|---|---|---|
|
|
| USERSET | Глобальное включение или отключение механизма глобальных временных таблиц |
Использование
Принцип работы
При создании глобальной временной таблицы расширение перехватывает выполнение оператора CREATE TEMPORARY TABLE и проверяет наличие ключевого слова GLOBAL или комментария /*GLOBAL*/.
Если используется ключевое слово GLOBAL, дополнительно выводится предупреждение:
WARNING: GLOBAL is deprecated in temporary table creation
Использование комментария /*GLOBAL*/ является рекомендуемым способом создания глобальной временной таблицы.
После создания GTT расширение выполняет действия:
- Создает нежурналируемую таблицу-шаблон в схеме
pgtt_schema. - Регистрирует таблицу в каталоге
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 или перезапуск сервера.