Ausführen einer Deep Copy-Operation - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Ausführen einer Deep Copy-Operation

In einer Deep Copy-Operation wird eine Tabelle mittels einer Masseneinfügung neu erstellt und ausgefüllt. Dabei wird die Tabelle automatisch sortiert. Wenn eine Tabelle über eine große, nicht sortierte Region verfügt, ist eine Deep Copy-Operation sehr viel schneller als eine Bereinigung. Wir empfehlen, während einer Deep-Copy-Operation nur dann gleichzeitige Aktualisierungen auszuführen, wenn Sie diese nachverfolgen können. Verschieben Sie nach Abschluss des Vorgangs die Delta-Updates in die neue Tabelle. Ein VACUUM Vorgang unterstützt automatische gleichzeitige Aktualisierungen.

Für das Erstellen einer Kopie der ursprünglichen Tabelle steht Ihnen eine der folgenden Methoden zur Verfügung:

  • Verwenden Sie die OriginaltabelleDDL.

    Wenn die verfügbar CREATE TABLE DDL ist, ist dies die schnellste und bevorzugte Methode. Wenn Sie eine neue Tabelle erstellen, können Sie alle Tabellen- und Spaltenattribute angeben, einschließlich primärer Schlüssel und Fremdschlüssel. Sie können das Original finden, DDL indem Sie die SHOW TABLE Funktion verwenden.

  • Benutze CREATE TABLELIKE.

    Wenn das Original nicht verfügbar DDL ist, können Sie es verwenden, CREATE TABLE LIKE um die Originaltabelle neu zu erstellen. Die neue Tabelle erbt die Kodierung, den Verteilungsschlüssel, den Sortierschlüssel und die NOT NULL-Attribute der übergeordneten Tabelle. Die neue Tabelle erbt die Primärschlüssel- und Fremdschlüsselattribute der übergeordneten Tabelle nicht. Sie können diese jedoch mittels hinzufügen ALTER TABLE.

  • Erstellen Sie eine temporäre Tabelle und verkürzen Sie die ursprüngliche Tabelle.

    Wenn Sie die Primärschlüssel- und Fremdschlüsselattribute der übergeordneten Tabelle beibehalten müssen. Wenn die übergeordnete Tabelle Abhängigkeiten hat, können Sie... verwenden CREATE TABLE AS (CTAS), um eine temporäre Tabelle zu erstellen. Verkürzen Sie anschließend die ursprüngliche Tabelle und füllen Sie sie mit Daten aus der temporären Tabelle.

    Durch die Verwendung einer temporären Tabelle wird die Leistung im Vergleich zur Verwendung einer permanenten Tabelle deutlich verbessert. Es besteht jedoch das Risiko, dass Daten verloren gehen. Eine temporäre Tabelle wird am Ende der Sitzung, in der sie erstellt wurde, automatisch entfernt. TRUNCATEschreibt sofort fest, auch wenn es sich in einem Transaktionsblock befindet. Wenn der Vorgang TRUNCATE erfolgreich ist, die Sitzung jedoch beendet wird, bevor der folgende Vorgang INSERT abgeschlossen ist, gehen die Daten verloren. Wenn ein Datenverlust nicht akzeptabel ist, verwenden Sie eine permanente Tabelle.

Nachdem Sie eine Kopie einer Tabelle erstellt haben, müssen Sie möglicherweise Zugriff auf die neue Tabelle gewähren. Sie können GRANT verwenden, um Zugriffsberechtigungen zu definieren. Um alle Zugriffsberechtigungen für eine Tabelle anzeigen und erteilen zu können, müssen Sie einer der folgenden Kategorien angehören:

  • Superuser

  • Besitzer der Tabelle, die Sie kopieren möchten.

  • Ein Benutzer mit der ACCESS SYSTEM TABLE Berechtigung, die Berechtigungen der Tabelle einzusehen, und mit der Grant-Berechtigung für alle relevanten Berechtigungen.

Darüber hinaus müssen Sie möglicherweise eine Nutzungsberechtigung für das Schema erteilen, in dem sich Ihre Deep Copy befindet. Eine Nutzungsberechtigung muss erteilt werden, wenn sich das Schema Ihrer Deep Copy vom Schema der Originaltabelle unterscheidet und es sich nicht um das public-Schema handelt. Um Nutzungsrechte anzeigen und gewähren zu können, müssen Sie einer der folgenden Kategorien angehören:

  • Superuser

  • Ein Benutzer, der die USAGE Berechtigung für das Schema der Deep Copy erteilen kann.

Um eine tiefe Kopie unter Verwendung der Originaltabelle durchzuführen DDL
  1. (Optional) Erstellen Sie die Tabelle neu, DDL indem Sie ein Skript mit dem Namen v_generate_tbl_ddl ausführen.

  2. Erstellen Sie eine Kopie der Tabelle unter Verwendung des Originals CREATE TABLEDDL.

  3. Verwenden Sie eine INSERTINTO... SELECT -Anweisung, um die Kopie mit Daten aus der Originaltabelle zu füllen.

  4. Suchen Sie nach Berechtigungen, die für die alte Tabelle erteilt wurden. Sie können diese Berechtigungen in der PRIVILEGES Systemansicht SVV _ RELATION _ sehen.

  5. Falls erforderlich, gewähren Sie der neuen Tabelle die Berechtigungen der alten Tabelle.

  6. Erteilen Sie jeder Gruppe und jedem Benutzer, die/der über Berechtigungen in der ursprünglichen Tabelle verfügt, eine Nutzungsberechtigung. Dieser Schritt ist nicht erforderlich, wenn sich Ihre Deep-Copy-Tabelle im public-Schema oder in demselben Schema wie die Originaltabelle befindet.

  7. Entfernen Sie die ursprüngliche Tabelle.

  8. Verwenden Sie eine ALTER TABLE Anweisung, um die Kopie in den ursprünglichen Tabellennamen umzubenennen.

Im folgenden Beispiel wird eine tiefe Kopie der SAMPLE Tabelle durchgeführt, wobei ein Duplikat mit SAMPLE dem Namen sample_copy verwendet wird.

--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;
Um eine tiefe Kopie durchzuführen mit CREATE TABLE LIKE
  1. Erstellen Sie eine neue Tabelle mit CREATE TABLELIKE.

  2. Verwenden Sie eine INSERTINTO... SELECT -Anweisung, um die Zeilen aus der aktuellen Tabelle in die neue Tabelle zu kopieren.

  3. Suchen Sie nach Berechtigungen, die für die alte Tabelle erteilt wurden. Sie können diese Berechtigungen in der PRIVILEGES Systemansicht SVV RELATION _ _ sehen.

  4. Falls erforderlich, gewähren Sie der neuen Tabelle die Berechtigungen der alten Tabelle.

  5. Erteilen Sie jeder Gruppe und jedem Benutzer, die/der über Berechtigungen in der ursprünglichen Tabelle verfügt, eine Nutzungsberechtigung. Dieser Schritt ist nicht erforderlich, wenn sich Ihre Deep-Copy-Tabelle im public-Schema oder in demselben Schema wie die Originaltabelle befindet.

  6. Entfernen Sie die aktuelle Tabelle.

  7. Verwenden Sie eine ALTER TABLE Anweisung, um die neue Tabelle in den ursprünglichen Tabellennamen umzubenennen.

Im folgenden Beispiel wird eine tiefe Kopie der SAMPLE Tabelle ausgeführt mit CREATE TABLELIKE.

--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;
Ausführen einer Deep Copy-Operation durch Erstellen einer temporären Tabelle und Verkürzen der ursprünglichen Tabelle
  1. Verwenden Sie CREATE TABLE AS, um eine temporäre Tabelle mit den Zeilen aus der Originaltabelle zu erstellen.

  2. Verkürzen Sie die aktuelle Tabelle.

  3. Verwenden Sie eine INSERTINTO... SELECT -Anweisung, um die Zeilen aus der temporären Tabelle in die Originaltabelle zu kopieren.

  4. Entfernen Sie die temporäre Tabelle.

Im folgenden Beispiel wird eine tiefe Kopie der SALES Tabelle durchgeführt, indem eine temporäre Tabelle erstellt und die Originaltabelle gekürzt wird. Da die ursprüngliche Tabelle erhalten bleibt, müssen Sie keine Berechtigungen für die kopierte Tabelle erteilen.

--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;