Deep Copy
Una copia profunda recrea y vuelve a llenar una tabla mediante una inserción masiva, que ordena automáticamente la tabla. Si una tabla tiene una región grande sin clasificar, una copia profunda es mucho más rápida que una aspiradora. La compensación es que no debe realizar actualizaciones simultáneas durante una operación de copia profunda a menos que pueda rastrearla y mover las actualizaciones delta a la nueva tabla después de que se haya completado el proceso. Una operación de VACÍO admite actualizaciones simultáneas de forma automática.
Puede elegir uno de los siguientes métodos para crear una copia de la tabla original:
- Utilice la tabla DDL original.
Si el DDL CREATE TABLE está disponible, este es el método más rápido y preferido. Si crea una tabla nueva, puede especificar todos los atributos de tabla y columna, incluidas la clave principal y las claves externas.
- Utilice CREAR TABLA COMO.
Si el DDL original no está disponible, puede usar CREATE TABLE LIKE para recrear la tabla original. La nueva tabla hereda los atributos encoding, distkey, sortkey y notnull de la tabla principal. La nueva tabla no hereda los atributos de clave principal y clave externa de la tabla principal, pero puede agregarlos usando ALTER TABLE.
- Cree una tabla temporal y trunque la tabla original.
Si necesita conservar la clave principal y los atributos de clave externa de la tabla principal, o si la tabla principal tiene dependencias, puede usar CREATE TABLE … AS (CTAS) para crear una tabla temporal, luego truncar la tabla original y completar de la tabla temporal.
El uso de una tabla temporal mejora el rendimiento significativamente en comparación con el uso de una tabla permanente, pero existe el riesgo de perder datos. Una tabla temporal se elimina automáticamente al final de la sesión en la que se crea. TRUNCATE se compromete inmediatamente, incluso si está dentro de un bloque de transacción. Si TRUNCATE tiene éxito pero la sesión finaliza antes de que finalice el INSERT subsiguiente, los datos se pierden. Si la pérdida de datos es inaceptable, use una tabla permanente.
Para realizar una copia profunda utilizando la tabla original DDL
-
(Opcional) Vuelve a crear la tabla DDL ejecutando un script llamado v_generate_tbl_ddl.
-
Crea una copia de la tabla usando el CREATE TABLE DDL original.
-
Utilisa una instrucción INSERT INTO … SELECT para completar la copia con datos de la tabla original.
-
Suelta la mesa original.
-
Utilisa una instrucción ALTER TABLE para cambiar el nombre de la copia al nombre de la tabla original.
El siguiente ejemplo realiza una copia profunda en la tabla SALES usando un duplicado de SALES llamado SALESCOPY.
create table salescopy ( … );
insert into salescopy (select * from sales);
drop table sales;
alter table salescopy rename to sales;
Para realizar una copia profunda usando CREATE TABLE LIKE
-
Cree una nueva tabla usando CREATE TABLE LIKE.
-
Utilice una instrucción INSERT INTO … SELECT para copiar las filas de la tabla actual a la nueva tabla.
-
Suelta la tabla actual.
-
Utilice una instrucción ALTER TABLE para cambiar el nombre de la nueva tabla al nombre de la tabla original.
-
El siguiente ejemplo realiza una copia profunda en la tabla SALES usando CREATE TABLE LIKE.
create table likesales (like sales);
insert into likesales (select * from sales);
drop table sales;
alter table likesales rename to sales;
Para realizar una copia en profundidad creando una tabla temporal y truncando la tabla original
-
Utilice CREATE TABLE AS para crear una tabla temporal con las filas de la tabla original.
-
Truncar la tabla actual.
-
Utilice una instrucción INSERT INTO … SELECT para copiar las filas de la tabla temporal a la tabla original.
-
Suelta la mesa temporal.
El siguiente ejemplo realiza una copia profunda en la tabla SALES creando una tabla temporal y truncando la tabla original:
create temp table salestemp as select * from sales;
truncate sales;
insert into sales (select * from salestemp);
drop table salestemp;
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?