Обратите внимание, что в Postgres поведение по умолчанию для временных таблиц заключается в том, что они не удаляются автоматически, а данные сохраняются при фиксации. См. ON COMMIT
.
Временная таблица, однако, отбрасывается в конце сеанса базы данных :
Временные таблицы автоматически удаляются в конце сеанса или
по выбору в конце текущей транзакции.
Есть несколько соображений, которые вы должны принять во внимание:
- Если вы хотите явно
DROP
временную таблицу в конце транзакции, создайте ее с синтаксисом CREATE TEMPORARY TABLE ... ON COMMIT DROP
.
- При наличии пула соединений сеанс базы данных может охватывать несколько сеансов клиента; чтобы избежать конфликтов в
CREATE
, вы должны отбросить временные таблицы - либо перед возвратом соединения с пулом (например, сделав все внутри транзакции и используя синтаксис создания ON COMMIT DROP
), или по мере необходимости (предшествуя любому оператору CREATE TEMPORARY TABLE
с соответствующим DROP TABLE IF EXISTS
, что также дает преимущество работы вне транзакций, например, если соединение используется в режиме автоматической фиксации.)
- Пока временная таблица используется, какая ее часть уместится в памяти перед переполнением на диск? См. Параметр
temp_buffers
в postgresql.conf
- Что еще мне следует беспокоиться при частой работе с временными таблицами? После того, как у вас есть DROPped временные таблицы, рекомендуется очистить, чтобы убрать все мертвые кортежи из каталога. Postgres будет автоматически пылесосить каждые 3 минуты или около того при использовании настроек по умолчанию (
auto_vacuum
).
Кроме того, не имеет отношения к вашему вопросу (но, возможно, относится к вашему проекту): имейте в виду, что, если вам нужно выполнить запросы к временной таблице после , вы ее заполнили, то это хороший Идея создать соответствующие индексы и выдать ANALYZE
для рассматриваемой временной таблицы после того, как вы вставите в нее. По умолчанию оптимизатор на основе затрат будет предполагать, что вновь созданная временная таблица имеет ~ 1000 строк, и это может привести к снижению производительности, если временная таблица действительно содержит миллионы строк.