Realización de una copia profunda - Amazon Redshift

Realización de una copia profunda

Una copia profunda recrea y vuelve a completar una tabla mediante una operación de inserción masiva, que ordena la tabla de manera automática. Si una tabla tiene una gran región no ordenada, una copia profunda es mucho más rápida que una limpieza. Le recomendamos que solo realice actualizaciones simultáneas durante una operación de copia profunda si puede realizar un seguimiento de ellas. Una vez finalizado el proceso, mueva las actualizaciones delta a la nueva tabla. La operación VACUUM admite de forma automática las actualizaciones simultáneas.

Para crear una copia de una tabla original, puede elegir uno de los siguientes métodos:

  • Usar el DDL de la tabla original.

    Si el CREATE TABLE DDL se encuentra 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, entre ellos la clave principal y las claves externas. Para buscar el DDL original, use la función SHOW TABLE.

  • Use CREATE TABLE LIKE.

    Si el DDL original no se encuentra disponible, puede usar CREATE TABLE LIKE para recrear la tabla original. La tabla nueva hereda los atributos ENCODING, DISTKEY, SORTKEY y NOT NULL de la tabla principal. La tabla nueva no hereda los atributos de clave principal y clave externa de la tabla principal, pero puede agregarlos con ALTER TABLE.

  • Crear una tabla temporal y truncar la tabla original.

    Si debe retener los atributos de clave principal y clave externa de la tabla principal. Si la tabla principal tiene dependencias, puede usar CREATE TABLE... AS (CTAS) para crear una tabla temporal. A continuación, trunque la tabla original y rellénela desde 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 confirma inmediatamente, incluso si se encuentra dentro de un bloque de transacciones. Si TRUNCATE tiene éxito pero la sesión se cierra antes de que se complete la acción INSERT siguiente, los datos se pierden. Si la pérdida de los datos es inaceptable, use una tabla permanente.

Después de crear una copia de una tabla, es posible que deba conceder acceso a la nueva tabla. Puede usar GRANT para definir privilegios de acceso. Para ver y adjudicar todos los privilegios de acceso de una tabla, debe ser uno de los siguientes:

  • Un superusuario.

  • El propietario de la tabla que desea copiar.

  • Un usuario con el privilegio ACCESS SYSTEM TABLE para ver los privilegios de la tabla y con el privilegio de conceder todos los permisos pertinentes.

Además, es posible que tenga que conceder permisos de uso para el esquema en el que se encuentra la copia profunda. Es necesario conceder el permiso de uso si el esquema de la copia profunda es diferente del esquema de la tabla original y también lo es del esquema public. Para ver y adjudicar privilegios de uso, debe ser uno de los siguientes:

  • Un superusuario.

  • Un usuario que puede adjudicar el permiso USAGE para el esquema de la copia profunda.

Pasos para realizar una copia profunda al usar el DDL de la tabla original
  1. (Opcional) Recree el DDL de la tabla al ejecutar un script denominado v_generate_tbl_ddl.

  2. Cree una copia de la tabla al usar el CREATE TABLE DDL original.

  3. Use una instrucción INSERT INTO … SELECT para completar la copia con datos desde la tabla original.

  4. Compruebe los permisos adjudicados en la tabla anterior. Puede ver estos permisos en la vista de sistema SVV_RELATION_PRIVILEGES.

  5. Si es necesario, adjudique los permisos de la tabla antigua a la nueva.

  6. Adjudique permisos de uso a todos los grupos y usuarios que tengan privilegios en la tabla original. Este paso no es necesario si la tabla de copia profunda está en el esquema public o está en el mismo esquema que la tabla original.

  7. Elimine la tabla original.

  8. Use una instrucción ALTER TABLE para renombrar la copia con el nombre de la tabla original.

El ejemplo siguiente realiza una copia profunda en la tabla SAMPLE con un duplicado de SAMPLE denominado sample_copy.

--Create a copy of the original table in the sample_namespace namespace using the original CREATE TABLE DDL. create table sample_namespace.sample_copy ( … ); --Populate the copy with data from the original table in the public namespace. insert into sample_namespace.sample_copy (select * from public.sample); --Check SVV_RELATION_PRIVILEGES for the original table's privileges. select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type; --Grant the original table's privileges to the copy table. grant DELETE on table sample_namespace.sample_copy to group group1; grant INSERT, UPDATE on table sample_namespace.sample_copy to group group2; grant SELECT on table sample_namespace.sample_copy to user1; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy to user2; --Grant usage permission to every group and user that has privileges in the original table. grant USAGE on schema sample_namespace to group group1, group group2, user1, user2; --Drop the original table. drop table public.sample; --Rename the copy table to match the original table's name. alter table sample_namespace.sample_copy rename to sample;
Pasos para realizar una copia profunda al usar CREATE TABLE LIKE
  1. Cree una tabla nueva al usar CREATE TABLE LIKE.

  2. Use una instrucción INSERT INTO … SELECT para copiar las filas de la tabla actual a la tabla nueva.

  3. Compruebe los permisos adjudicados en la tabla anterior. Puede ver estos permisos en la vista de sistema SVV_RELATION_PRIVILEGES.

  4. Si es necesario, adjudique los permisos de la tabla antigua a la nueva.

  5. Adjudique permisos de uso a todos los grupos y usuarios que tengan privilegios en la tabla original. Este paso no es necesario si la tabla de copia profunda está en el esquema public o está en el mismo esquema que la tabla original.

  6. Elimine la tabla actual.

  7. Use una instrucción ALTER TABLE para renombrar la tabla nueva con el nombre de la tabla original.

En el siguiente ejemplo, se usa CREATE TABLE LIKE para realizar una copia profunda de la tabla SAMPLE.

--Create a copy of the original table in the sample_namespace namespace using CREATE TABLE LIKE. create table sameple_namespace.sample_copy (like public.sample); --Populate the copy with data from the original table. insert into sample_namespace.sample_copy (select * from public.sample); --Check SVV_RELATION_PRIVILEGES for the original table's privileges. select * from svv_relation_privileges where namespace_name = 'public' and relation_name = 'sample' order by identity_type, identity_id, privilege_type; --Grant the original table's privileges to the copy table. grant DELETE on table sample_namespace.sample_copy to group group1; grant INSERT, UPDATE on table sample_namespace.sample_copy to group group2; grant SELECT on table sample_namespace.sample_copy to user1; grant INSERT, SELECT, UPDATE on table sample_namespace.sample_copy to user2; --Grant usage permission to every group and user that has privileges in the original table. grant USAGE on schema sample_namespace to group group1, group group2, user1, user2; --Drop the original table. drop table public.sample; --Rename the copy table to match the original table's name. alter table sample_namespace.sample_copy rename to sample;
Pasos para realizar una copia profunda al crear una tabla temporal y truncar la tabla original
  1. Use CREATE TABLE AS para crear una tabla temporal con las filas de la tabla original.

  2. Trunque la tabla actual.

  3. Use una instrucción INSERT INTO … SELECT para copiar las filas de la tabla temporal a la tabla original.

  4. Elimine la tabla temporal.

En el siguiente ejemplo, se realiza una copia profunda de la tabla SALES al crear una tabla temporal y truncar la tabla original. Como la tabla original permanece, no es necesario adjudicar permisos a la tabla de copia.

--Create a temp table copy using CREATE TABLE AS. create temp table salestemp as select * from sales; --Truncate the original table. truncate sales; --Copy the rows from the temporary table to the original table. insert into sales (select * from salestemp); --Drop the temporary table. drop table salestemp;