Esecuzione di una copia completa - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esecuzione di una copia completa

Una copia completa ricrea e ripopola una tabella tramite inserimento di massa, che ordina automaticamente la tabella. Se una tabella ha una regione ampia e non ordinata, una copia completa è molto più veloce di un vacuum. Ti consigliamo di effettuare aggiornamenti simultanei durante un'operazione di copia completa solo se riesci a tenerne traccia. Una volta completato il processo, sposta gli aggiornamenti delta nella nuova tabella. Un'operazione VACUUM supporta automaticamente gli aggiornamenti simultanei.

È possibile scegliere uno dei seguenti metodi per creare una copia della tabella originale:

  • Utilizza la tabella con DDL originale.

    Se è disponibile CREATE TABLE DDL, questo è il metodo più veloce e preferito. Se crei una nuova tabella, è possibile specificare tutti gli attributi di tabella e colonna, comprese la chiave primaria e le chiavi esterne. È possibile trovare il DDL originale utilizzando la funzione SHOW TABLE.

  • Utilizza CREATE TABLE LIKE.

    Se il DDL originale non è disponibile, è possibile utilizzare CREATE TABLE LIKE per ricreare la tabella originale. La nuova tabella eredita la codifica, la chiave di distribuzione, la chiave di ordinamento e gli attributi non null della tabella padre. La nuova tabella non eredita la chiave primaria e gli attributi di chiave esterna della tabella padre, ma è possibile aggiungerli utilizzando ALTER TABLE.

  • Crea una tabella temporanea e tronca la tabella originale.

    Se è necessario mantenere gli attributi della chiave primaria e della chiave esterna della tabella principale. Se la tabella principale ha dipendenze, puoi usare CREATE TABLE ... AS (CTAS) per creare una tabella temporanea. Quindi troncare la tabella originale e popolarla dalla tabella temporanea.

    L'utilizzo di una tabella temporanea migliora le prestazioni in modo significativo rispetto all'utilizzo di una tabella permanente, ma c'è il rischio di perdere dati. La tabella temporanea viene automaticamente eliminata alla fine della sessione in cui è stata creata. TRUNCATE viene sottoposto immediatamente al commit, anche se si trova all'interno di un blocco di transazione. Se TRUNCATE ha esito positivo ma la sessione termina prima del completamento del comando INSERT successivo, i dati vengono persi. Se la perdita di dati non è accettabile, utilizza una tabella permanente.

Dopo aver creato una copia di una tabella, potrebbe essere necessario concedere l'accesso alla nuova tabella. È possibile utilizzare GRANT per definire i privilegi di accesso. Per visualizzare e concedere tutti i privilegi di accesso di una tabella, devi avere uno dei seguenti ruoli:

  • Un utente con privilegi avanzati.

  • Il proprietario della tabella che si desidera copiare.

  • Un utente con il privilegio ACCESS SYSTEM TABLE per visualizzare i privilegi della tabella e con il privilegio di concessione per tutte le autorizzazioni pertinenti.

Inoltre, potrebbe essere necessario concedere l'autorizzazione all'utilizzo dello schema in cui si trova la copia completa. È necessario concedere l'autorizzazione all'utilizzo se lo schema della copia completa è diverso dallo schema della tabella originale e inoltre non è lo schema public. Per visualizzare e concedere tutti i privilegi di utilizzo, devi avere uno dei seguenti ruoli:

  • Un utente con privilegi avanzati.

  • Un utente che può concedere l'autorizzazione USAGE per lo schema della copia completa.

Per eseguire una copia completa utilizzando la tabella con DDL originale
  1. (Facoltativo) Ricreare la tabella DDL eseguendo uno script chiamato v_generate_tbl_ddl.

  2. Creare una copia della tabella utilizzando l'originale CREATE TABLE DDL.

  3. Utilizzare un'istruzione INSERT INTO ... SELECT per popolare la copia con i dati della tabella originale.

  4. Verifica le autorizzazioni concesse nella tabella precedente. Puoi visualizzare queste autorizzazioni nella vista di sistema SVV_RELATION_PRIVILEGES.

  5. Se necessario, concedi le autorizzazioni della tabella precedente alla nuova tabella.

  6. Concedi l'autorizzazione all'utilizzo a tutti i gruppi e utenti con privilegi nella tabella originale. Questo passaggio non è necessario se la tabella di copia completa è nello schema public o nello stesso schema della tabella originale.

  7. Rilasciare la tabella originale.

  8. Utilizzare un'istruzione ALTER TABLE per assegnare un nuovo nome alla copia con il nome della tabella originale.

L'esempio seguente esegue una copia completa sulla tabella SAMPLE utilizzando un duplicato di SAMPLE denominato 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;
Per eseguire una copia completa utilizzando CREATE TABLE LIKE
  1. Creare un nuovo tabella utilizzando CREATE TABLE LIKE.

  2. Utilizzare un'istruzione INSERT INTO ... SELECT per copiare le righe dalla tabella attuale nella nuova tabella.

  3. Verifica le autorizzazioni concesse nella tabella precedente. Puoi visualizzare queste autorizzazioni nella vista di sistema SVV_RELATION_PRIVILEGES.

  4. Se necessario, concedi le autorizzazioni della tabella precedente alla nuova tabella.

  5. Concedi l'autorizzazione all'utilizzo a tutti i gruppi e utenti con privilegi nella tabella originale. Questo passaggio non è necessario se la tabella di copia completa è nello schema public o nello stesso schema della tabella originale.

  6. Rilasciare la tabella attuale.

  7. Utilizzare un'istruzione ALTER TABLE per assegnare un nuovo nome alla nuova tabella con il nome della tabella originale.

L'esempio seguente esegue una copia completa sulla tabella SAMPLE utilizzando CREATE TABLE LIKE.

--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;
Per eseguire una copia completa tramite la creazione di una tabella temporanea e il troncamento della tabella originale
  1. Utilizzare CREATE TABLE AS per creare una tabella temporanea con le righe della tabella originale.

  2. Troncare la tabella attuale.

  3. Utilizzare un'istruzione INSERT INTO ... SELECT per copiare le righe dalla tabella temporanea nella tabella originale.

  4. Rilasciare la tabella temporanea.

L'esempio seguente esegue una copia completa sulla tabella SALES tramite la creazione di una tabella temporanea e il troncamento della tabella originale. Poiché la tabella originale resta, non è necessario concedere autorizzazioni alla tabella di 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;