ディープコピーを実行する
ディープコピーでは、テーブルを自動的にソートする一括挿入を利用してテーブルを再作成し、データを入力します。テーブルにソートされていない大規模なリージョンがある場合、ディープコピーの方がバキューム処理より高速です。トレードオフは、プロセス完了後に追跡して差分更新を新しいテーブルに移動できない限り、ディープコピーオペレーション中に同時更新を行わないでください。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 を使用してディープコピーを実行するには、次のように実行します。
-
(オプション)
v_generate_tbl_ddl
というスクリプトを実行してテーブル DDL を再作成します。 -
元の CREATE TABLE DDL を使い、テーブルのコピーを作成します。
-
INSERT INTO … SELECT ステートメントを使い、元のテーブルのデータをコピーに入力します。
-
元のテーブルを削除 (Drop) します。
-
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 を使用してディープコピーを実行するには、次のように実行します。
-
CREATE TABLE LIKE を使用して新しいテーブルを作成します。
-
INSERT INTO … SELECT ステートメントを使用し、現在のテーブルから新しいテーブルに行をコピーします。
-
現在のテーブルを削除 (Drop) します。
-
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;
一時テーブルを作成し、元のテーブルの全データを削除する方法でディープコピーを実行するには、次のように実行します。
-
CREATE TABLE AS を使用し、元のテーブルの行を使用して一時テーブルを作成します。
-
現在のテーブルの全データを削除します。
-
INSERT INTO … SELECT ステートメントを使用し、一時テーブルから元のテーブルに行をコピーします。
-
一時テーブルを削除 (Drop) します。
次の例では、一時テーブルを作成し、元のテーブルの全データを削除することによって、SALES テーブルにディープコピーが実行されます。
create temp table salestemp as select * from sales; truncate sales; insert into sales (select * from salestemp); drop table salestemp;