Come duplicare la grande tabella di Postgres?


29

Ho un'enorme tabella di Postgres (10 GB di dati - 160 milioni di record). La tabella è statica e non ci sono operazioni di scrittura eseguite. Voglio duplicarlo, eseguire scritture, reindicizzarlo e quindi con un'unica transazione veloce eliminare quello vecchio e rinominare quello nuovo con il nome originale.

Qual è il modo più veloce per duplicare una tabella così grande?

Risposte:


55

Generalmente il modo più veloce per duplicare una tabella è semplicemente:

CREATE TABLE table2 AS SELECT * FROM table1;

Gli INSERT paralleli possono essere più veloci, ma solo con un sottosistema di dischi molto veloce (quando i dati sono interlacciati su molte unità). Altrimenti questo sarà più lento.

Una volta terminata la modifica table2, può assumere il nuovo nome con:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

Il DROP TABLEcomando richiede un blocco esclusivo, che influisce sui lettori simultanei in un modo che potresti voler anticipare:

  • DROP attenderà il completamento di qualsiasi lettura in sospeso sul tavolo da altre transazioni.
  • Ogni nuova transazione che tenta di leggere quella tabella nel frattempo la metterà in attesa, quindi fallirà poiché l'originale table1non esiste più. L'errore sarebbe simile "potrebbe relazione non aperto con OID OID "

Per evitare il secondo problema, è possibile rinominare table1 a old_table1 invece di cadere, e poi rilasciarlo solo successivamente al di fuori della transazione, quando questi lettori sono fatto con esso. Quindi la sequenza sopra sarebbe diventata:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
Grazie uomo. Questo è esattamente il tipo di spiegazione che stavo cercando. Grazie ancora!
Milovan Zogovic,

Se ci sono indici definiti su table2, funzioneranno comunque dopo che la tabella è stata rinominata?
BamaPookie,

1
@BamaPookie controlla questo per uno schema completo che include indici, vincoli e valori predefiniti wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.