A seconda del numero di set di dati diversi, un'opzione sarebbe quella di partizionare le tabelle per set di dati.
Quando un set di dati viene aggiornato, BEGIN
una nuova transazione, TRUNCATE
la tabella, COPY
i nuovi dati in esso e COMMIT
. PostgreSQL ha un'ottimizzazione in cui COPY
l'inserimento in una tabella che è stata TRUNCATE
eseguita nella stessa transazione fa molto meno I / O se si sta utilizzando wal_level = minimal
(impostazione predefinita).
Se non puoi partizionare e troncare (diciamo, se hai a che fare con decine o centinaia di migliaia di set di dati, dove ci sarebbero troppe tabelle) vorrai invece avviare l'autovacuum per eseguire il più possibile , assicurati di avere buoni indici su tutto ciò che elimini in base a, ed essere pronto per prestazioni piuttosto ordinarie.
Se non hai bisogno di sicurezza in caso di crash - non ti dispiace che i tuoi tavoli siano vuoti dopo un crash del sistema - puoi anche creare i tuoi tavoli UNLOGGED
, il che ti farà risparmiare una grande quantità di costi I / O.
Se non ti dispiace dover ripristinare l'intera configurazione da un backup dopo un crash del sistema, puoi fare un ulteriore passo avanti e anche impostare fsync=off
, che in pratica dice a PostgreSQL "non preoccuparti della sicurezza degli arresti anomali, ho buoni backup e non mi preoccupo se i miei dati sono permanentemente e totalmente irrecuperabili dopo un arresto anomalo e sono felice di riutilizzarli initdb
prima di poter utilizzare nuovamente il mio database ".
Ho scritto qualcosa in più su questo argomento in un thread simile su Stack Overflow sull'ottimizzazione di PostgreSQL per test rapidi ; che menziona l'ottimizzazione del sistema operativo host, separando WAL su un altro disco se non si utilizzano unlogged
tabelle, regolazioni del checkpoint, ecc.
Ci sono anche alcune informazioni nei documenti Pg per un caricamento rapido dei dati e impostazioni non durevoli .