Моля, имайте предвид, че в 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
- Нещо друго, за което трябва да се тревожа, когато работя често с временни таблици? Препоръчва се прахосмукачка, след като сте ИЗПУСКАли временни таблици, за да почистите всички мъртви кортежи от каталога. Postgres автоматично ще вакуумира на всеки 3 минути или така вместо вас, когато използвате настройките по подразбиране (
auto_vacuum
).
Освен това, несвързано с вашия въпрос (но вероятно свързано с вашия проект):имайте предвид, че ако трябва да изпълнявате заявки срещу временна таблица след сте го попълнили, тогава е добра идея да създадете подходящи индекси и да издадете ANALYZE
на въпросната временна таблица след приключихте с вмъкването в него. По подразбиране оптимизаторът, базиран на разходите, ще приеме, че новосъздадената временна таблица има ~1000 реда и това може да доведе до лоша производителност, ако временната таблица действително съдържа милиони редове.