Vezměte prosím na vědomí, že v Postgresu je výchozí chování pro dočasné tabulky takové, že nejsou automaticky zrušeny a data jsou zachována při odevzdání. Viz ON COMMIT
.
Dočasné tabulky jsou však na konci relace databáze zrušeny:
Dočasné tabulky jsou automaticky zrušeny na konci relace nebo volitelně na konci aktuální transakce.
Existuje několik aspektů, které musíte vzít v úvahu:
- Pokud chcete explicitně
DROP
dočasnou tabulku na konci transakce, vytvořte ji pomocíCREATE TEMPORARY TABLE ... ON COMMIT DROP
syntaxe. - V případě sdružování připojení , relace databáze může zahrnovat více relací klienta; abyste se vyhnuli kolizím v
CREATE
, měli byste zrušit své dočasné tabulky – buď před vrácením připojení k fondu (např. provedením všeho v rámci transakce a použitímON COMMIT DROP
syntaxe vytvoření), nebo podle potřeby (před každýmCREATE TEMPORARY TABLE
příkaz s odpovídajícímDROP TABLE IF EXISTS
, což má tu výhodu, že funguje i mimo transakce, např. pokud je připojení použito v režimu automatického potvrzení.) - Jaká část se vejde do paměti, dokud se dočasná tabulka používá, než přeteče na disk? Viz
temp_buffers
možnost vpostgresql.conf
- Ještě něco, čeho bych se měl obávat, když často pracuji s dočasnými tabulkami? Po odstranění dočasných tabulek se doporučuje vysát, aby se odstranily všechny mrtvé n-tice z katalogu. Postgres bude automaticky vysávat každé 3 minuty při použití výchozího nastavení (
auto_vacuum
).
Také nesouvisející s vaší otázkou (ale možná související s vaším projektem):mějte na paměti, že pokud musíte spouštět dotazy na dočasnou tabulku po pokud jste jej zaplnili, je dobré vytvořit vhodné indexy a vydat ANALYZE
v příslušné dočasné tabulce po jste do něj vložili. Ve výchozím nastavení bude optimalizátor na základě nákladů předpokládat, že nově vytvořená dočasná tabulka má ~1000 řádků, což může mít za následek špatný výkon, pokud dočasná tabulka ve skutečnosti obsahuje miliony řádků.