¿Cómo duplicar una enorme tabla de postgres?

29

Tengo una gran tabla de postgres (10 GB de datos - 160 millones de registros). La tabla es estática y no se realizan operaciones de escritura. Quiero duplicarlo, realizar escrituras, reindexarlo y luego, con una sola transacción rápida, eliminar el antiguo y cambiar el nombre del nuevo al nombre original.

¿Cuál es la forma más rápida de duplicar una tabla tan grande?

Milovan Zogovic
fuente

Respuestas:

55

En general, la forma más rápida de duplicar una tabla es simplemente:

CREATE TABLE table2 AS SELECT * FROM table1;

Los INSERT paralelos pueden ser más rápidos, pero solo con un subsistema de disco muy rápido (cuando los datos se entrelazan en muchas unidades). De lo contrario, esto será más lento.

Una vez que haya terminado con la modificación table2, puede tomar el nuevo nombre con:

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

El DROP TABLEcomando necesita un bloqueo exclusivo, que afecta a los lectores concurrentes de una manera que tal vez desee anticipar:

  • DROP esperará a que finalice cualquier lectura pendiente en la tabla de otras transacciones.
  • Mientras tanto, cualquier nueva transacción que intente leer esa tabla se pondrá en espera y luego fallará ya que el original table1ya no existe. El error se vería como "no se pudo abrir la relación con el OID oid "

Para evitar el segundo problema, puede cambiarle el nombre table1 a en old_table1 lugar de soltarlo y luego soltarlo más tarde fuera de la transacción, cuando estos lectores hayan terminado. Entonces la secuencia anterior se convertiría en:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;
Daniel Vérité
fuente
2
Gracias hombre. Este es exactamente el tipo de explicación que estaba buscando. ¡Gracias de nuevo!
Milovan Zogovic
Si hay índices definidos en la tabla 2, ¿seguirán funcionando una vez que se cambie el nombre de la tabla?
BamaPookie
1
@BamaPookie mira esto para ver el esquema completo incluyendo índices, restricciones y valores predeterminados wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel