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 TABLE
comando 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
table1
ya 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;