sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL dočasné tabulky

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ím ON COMMIT DROP syntaxe vytvoření), nebo podle potřeby (před každým CREATE TEMPORARY TABLE příkaz s odpovídajícím DROP 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 v postgresql.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ů.



  1. Sloupec podobný identitě, ale založený na kritériích Seskupit podle

  2. Zachování ORDER BY v SELECT INTO

  3. Zahrnout záhlaví při použití SELECT INTO OUTFILE?

  4. Oracle SQL:časová razítka v klauzuli where