Observera att, i Postgres, är standardbeteendet för temporära tabeller att de inte automatiskt tas bort och data kvarstår vid commit. Se ON COMMIT
.
Temporära tabeller tas dock bort i slutet av en databassession:
Tillfälliga tabeller tas bort automatiskt i slutet av en session, eller valfritt i slutet av den aktuella transaktionen.
Det finns flera överväganden du måste ta hänsyn till:
- Om du uttryckligen vill
DROP
en temporär tabell i slutet av en transaktion, skapa den medCREATE TEMPORARY TABLE ... ON COMMIT DROP
syntax. - I närvaro av anslutningspoolning , kan en databassession sträcka sig över flera klientsessioner; för att undvika sammandrabbningar i
CREATE
, bör du släppa dina tillfälliga tabeller -- antingen innan du returnerar en anslutning till poolen (t.ex. genom att göra allt i en transaktion och användaON COMMIT DROP
skapande syntax), eller vid behov (genom att föregå valfriCREATE TEMPORARY TABLE
sats med en motsvarandeDROP TABLE IF EXISTS
, vilket har fördelen att även arbeta utanför transaktioner t.ex. om anslutningen används i auto-commit-läge.) - Medan den temporära tabellen används, hur mycket av den får plats i minnet innan den flödar över till disken? Se
temp_buffers
alternativet ipostgresql.conf
- Något mer jag bör oroa mig för när jag ofta arbetar med tillfälliga tabeller? En dammsugare rekommenderas efter att du har släppt tillfälliga bord, för att rensa upp eventuella döda tuplar från katalogen. Postgres kommer automatiskt att dammsuga var tredje minut eller så för dig när du använder standardinställningarna (
auto_vacuum
).
Inte heller relaterat till din fråga (men möjligen relaterat till ditt projekt):kom ihåg att om du måste köra frågor mot en tillfällig tabell efter du har fyllt i det, då är det en bra idé att skapa lämpliga index och utfärda en ANALYZE
på temptabellen i fråga efter du är klar med att infoga den. Som standard kommer den kostnadsbaserade optimeraren att anta att en nyskapad temptabell har ~1000 rader och detta kan resultera i dålig prestanda om temptabellen faktiskt innehåller miljontals rader.