メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

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

ディープコピーでは、テーブルを自動的にソートする一括挿入を利用してテーブルを再作成し、データを入力します。テーブルにソートされていない大規模なリージョンがある場合、ディープコピーの方がバキューム処理より高速です。欠点としては、ディープコピー処理中は同時更新を実行できません。バキューム処理では実行できます。

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

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

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

    注記

    元の DDL が利用できない場合、v_generate_tbl_ddl というスクリプトを実行して DDL を再作成できる可能性があります。Amazon Web Services - Labs Github リポジトリの一部である amazon-redshift-utils からスクリプトをダウンロードできます。

  • CREATE TABLE LIKE を使用します。

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

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

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

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

元のテーブル DDL を使用してディープコピーを実行するには、次のように実行します。

  1. (オプション) v_generate_tbl_ddl というスクリプトを実行してテーブル DDL を再作成します。

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

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

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

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

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

Copy
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 テーブルにディープコピーを実行します。

Copy
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 テーブルにディープコピーが実行されます。

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