Ответ 1
Обратите внимание, что в 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
в соответствующей таблице temp после того, как вы закончите вставлять в нее. По умолчанию оптимизатор, основанный на затратах, предположит, что недавно созданная таблица temp имеет ~ 1000 строк, и это может привести к низкой производительности, если таблица temp действительно содержит миллионы строк.