はじめに

Verticaは既存のテーブルから新しいテーブルを作成する方法として、”COPY_TABLE” コマンドを利用することができます。論理的なコピーのため、”CREATE TABLE AS SELECT” と比較して高速です。

動作イメージ


注意点

・同一テーブルを同時にコピーすると、一部のコピーが失敗する可能性があります。そのため、順番にテーブルをコピーする必要があります。
・Verticaライセンスは、コピー元とコピー先のテーブルで別扱いになります。例えば、1TBのテーブルをコピーすると、1TBのディスク容量しか消費されません。しかし、Verticaのライセンス容量は、2TBとして扱われます。

COPY_TABLE コマンド

COPY_TABLE コマンドの構文およびパラメータの説明は、次のとおりです。

構文

COPY_TABLE(‘[スキーマ名.]ソーステーブル名’, ‘[スキーマ名.]ターゲットテーブル名’)

パラメータ

項目説明
スキーマ名スキーマがpublic以外の場合は、スキーマ名を指定します。
ソーステーブル名コピー元のテーブルを指定します。ソーステーブルの全データをターゲットテーブルにコピーします。
ターゲットテーブル名コピー先のテーブルを指定します。ターゲットテーブルが既に存在する場合、テーブルにデータを追加します。テーブルが存在しない場合、"CREATE TABLE ... LIKE ... INCLUDING PROJECTIONS" を呼び出して、ソーステーブルの定義からテーブルを作成します。
ターゲットテーブルの所有権は、ソーステーブルから継承します。 詳細は「Replicating a Table」を参照してください。


実行に必要な権限

DBユーザは、ソーステーブルとターゲットテーブルに対して、次の権限が必要です。

・ソーステーブルに対しての「INSERT、UPDATE、DELETE、SELECT」権限
・ターゲットテーブルが存在しない場合、ターゲットテーブルとスキーマに対しての「CREATE」権限
・ターゲットテーブルが存在する場合、ターゲットテーブルに対しての「INSERT」権限

テーブル属性の要件

ソーステーブルとターゲットテーブルは、次の属性が同一の必要があります。

・NULL/NOT NULL制約が含まれるカラム定義
・セグメンテーション
・パーティショニング式
・プロジェクション数
・プロジェクションのソート順
・主キー制約と一意キー制約
・テキストインデックスの数と定義

テーブルの制限

ソーステーブルとターゲットテーブルは、次の制限があります。

・ソーステーブルとターゲットテーブルのパーティションが異なるストレージ階層(ストレージロケーション)にある場合、WARNIGが発生しますが、コピーは実行されます。

・ソーステーブルにシーケンスが含まれている場合、シーケンスを整数に変換してからターゲットテーブルにコピーします。ターゲットテーブルに自動インクリメント、アイデンティティ、名前付きシーケンスカラムが含まれている場合、ERRORが発生して、コピーは実行できません。

・次のテーブルは、ソーステーブルとターゲットテーブルとして、使用できません。
 ・一時テーブル
 ・仮想テーブル
 ・システムテーブル
 ・外部テーブル

実行例

“COPY_TABLE”を利用して、約1億8千万件のデータを既存のテーブルから、新しいテーブルにコピーする例をご紹介します。


ご参考として、”CREATE TABLE AS SELECT”の実行時間をご紹介します。


以下は約1億8千万件のコピーにかかった実行時間の比較結果です。
“COPY_TABLE”のほうが “CREATE TABLE AS SELECT”より、高速に処理できることがわかります。

実行コマンド実行時間
COPY_TABLE12ミリ秒
CREATE TABLE AS SELECT101秒


参考情報

COPY_TABLE
https://my.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/COPY_TABLE.htm

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。