ディープコピーを実行する - Amazon Redshift

ディープコピーを実行する

ディープコピーでは、テーブルを自動的にソートする一括挿入を利用してテーブルを再作成し、データを入力します。テーブルにソートされていない大規模なリージョンがある場合、ディープコピーの方がバキューム処理より高速です。トレードオフは、プロセス完了後に追跡して差分更新を新しいテーブルに移動できない限り、ディープコピーオペレーション中に同時更新を行わないでください。VACUUM オペレーションは同時更新を自動でサポートします。

4 つの方法の 1 つを選択し、元のテーブルのコピーを作成できます:

  • 元のテーブル DDL を使用します。

    CREATE TABLE DDL が利用できる場合、これが最も速く推奨の方法になります。新しいテーブルを作成する場合は、プライマリキーと外部キーを含むすべてのテーブルと列の属性を指定できます。

    注記

    元の DDL が利用できない場合、v_generate_tbl_ddl というスクリプトを実行して DDL を再作成できる可能性があります。スクリプトは、アマゾン ウェブ サービス - ラボの git ハブリポジトリの一部である amazon-redshift-utils からダウンロードできます。

  • CREATE TABLE LIKE を使用します。

    元の DDL が利用できない場合、CREATE TABLE LIKE を使用して元のテーブルを再作成できます。新しいテーブルは親テーブルのエンコーディング、分散キー、ソートキー、非 null の属性を継承します。新しいテーブルは親テーブルのプライマリキーと外部キーの属性を継承しませんが、ALTER TABLE を使ってそれらを追加できます。

  • 一時テーブルを作成し、元のテーブルの全データを削除します。

    親テーブルのプライマリキーおよび外部キーの属性を維持する必要がある場合、または親テーブルに依存関係がある場合、CREATE TABLE ... AS (CTAS) を使用して一時テーブルを作成し、元のテーブルの全データを削除してから、一時テーブルのデータを入力します。

    一時テーブルを使用すると、永続テーブルを使用する場合と比較して著しくパフォーマンスが向上しますが、データを失うリスクがあります。一時テーブルは、作成したセッションの終了時に自動的に削除されます。TRUNCATE を使うと、トランザクションブロック内にある場合でも、即座にコミットされます。TRUNCATE が成功しても後続の INSERT が完了する前にセッションが終了すると、データが失われます。データ損失を許容できない場合は、永続テーブルを使用します。

テーブルのコピーを作成した後、新しいテーブルへのアクセスを許可する必要がある場合があります。GRANT を使用してアクセス権限を定義できます。

元のテーブル DDL を使用してディープコピーを実行するには、次のように実行します。
  1. (オプション) v_generate_tbl_ddl というスクリプトを実行してテーブル DDL を再作成します。

  2. 元の CREATE TABLE DDL を使い、テーブルのコピーを作成します。

  3. INSERT INTO … SELECT ステートメントを使い、元のテーブルのデータをコピーに入力します。

  4. 元のテーブルを削除 (Drop) します。

  5. ALTER TABLE ステートメントを使用し、コピーの名前を元のテーブル名に変更します。

次の例では、「SALESCOPY」という名前の SALES の複製を利用し、SALES テーブルにディープコピーが実行されます。

create table salescopy ( … ); insert into salescopy (select * from sales); drop table sales; alter table salescopy rename to sales;
CREATE TABLE LIKE を使用してディープコピーを実行するには、次のように実行します。
  1. CREATE TABLE LIKE を使用して新しいテーブルを作成します。

  2. INSERT INTO … SELECT ステートメントを使用し、現在のテーブルから新しいテーブルに行をコピーします。

  3. 現在のテーブルを削除 (Drop) します。

  4. ALTER TABLE ステートメントを使用し、新しいテーブルの名前を元のテーブル名に変更します。

次の例では、CREATE TABLE LIKE を使用して SALES テーブルにディープコピーを実行します。

create table likesales (like sales); insert into likesales (select * from sales); drop table sales; alter table likesales rename to sales;
一時テーブルを作成し、元のテーブルの全データを削除する方法でディープコピーを実行するには、次のように実行します。
  1. CREATE TABLE AS を使用し、元のテーブルの行を使用して一時テーブルを作成します。

  2. 現在のテーブルの全データを削除します。

  3. INSERT INTO … SELECT ステートメントを使用し、一時テーブルから元のテーブルに行をコピーします。

  4. 一時テーブルを削除 (Drop) します。

次の例では、一時テーブルを作成し、元のテーブルの全データを削除することによって、SALES テーブルにディープコピーが実行されます。

create temp table salestemp as select * from sales; truncate sales; insert into sales (select * from salestemp); drop table salestemp;