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

注意点
・同一テーブルを同時にコピーすると、一部のコピーが失敗する可能性があります。そのため、順番にテーブルをコピーする必要があります。
・Verticaライセンスは、コピー元とコピー先のテーブルで別扱いになります。例えば、1TBのテーブルをコピーすると、1TBのディスク容量しか消費されません。しかし、Verticaのライセンス容量は、2TBとして扱われます。
・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」権限
・ターゲットテーブルが存在しない場合、ターゲットテーブルとスキーマに対しての「CREATE」権限
・ターゲットテーブルが存在する場合、ターゲットテーブルに対しての「INSERT」権限
テーブル属性の要件
ソーステーブルとターゲットテーブルは、次の属性が同一の必要があります。
・NULL/NOT NULL制約が含まれるカラム定義
・セグメンテーション
・パーティショニング式
・プロジェクション数
・プロジェクションのソート順
・主キー制約と一意キー制約
・テキストインデックスの数と定義
・セグメンテーション
・パーティショニング式
・プロジェクション数
・プロジェクションのソート順
・主キー制約と一意キー制約
・テキストインデックスの数と定義
テーブルの制限
ソーステーブルとターゲットテーブルは、次の制限があります。
・ソーステーブルとターゲットテーブルのパーティションが異なるストレージ階層(ストレージロケーション)にある場合、WARNIGが発生しますが、コピーは実行されます。
・ソーステーブルにシーケンスが含まれている場合、シーケンスを整数に変換してからターゲットテーブルにコピーします。ターゲットテーブルに自動インクリメント、アイデンティティ、名前付きシーケンスカラムが含まれている場合、ERRORが発生して、コピーは実行できません。
・次のテーブルは、ソーステーブルとターゲットテーブルとして、使用できません。
・一時テーブル
・仮想テーブル
・システムテーブル
・外部テーブル
・ソーステーブルにシーケンスが含まれている場合、シーケンスを整数に変換してからターゲットテーブルにコピーします。ターゲットテーブルに自動インクリメント、アイデンティティ、名前付きシーケンスカラムが含まれている場合、ERRORが発生して、コピーは実行できません。
・次のテーブルは、ソーステーブルとターゲットテーブルとして、使用できません。
・一時テーブル
・仮想テーブル
・システムテーブル
・外部テーブル
実行例
“COPY_TABLE”を利用して、約1億8千万件のデータを既存のテーブルから、新しいテーブルにコピーする例をご紹介します。
//コピー元テーブルの確認
dbadmin=> select count(*) from ssbm.lineorder;
count
-----------
179998372
(1 row)
dbadmin=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+----------------+-------+---------+---------
ssbm | lineorder | table | dbadmin |
(1 rows)
//コピー元プロジェクションの確認
dbadmin=> \dj
List of projections
Schema | Name | Owner | Node | Comment
--------+--------------------------+---------+-------------------+---------
ssbm | lineorder_DBD_1_rep_com1 | dbadmin | v_testdb_node0001 |
(1 rows)
//COPY_TABLEの実行
dbadmin=> select copy_table('ssbm.lineorder','ssbm.lineorder_new');
copy_table
--------------------------------------------------------------------------------------
Created table ssbm.lineorder_new.
Copied table ssbm.lineorder to ssbm.lineorder_new
(1 row)
Time: First fetch (1 row): 11.679 ms. All rows formatted: 11.712 ms
★約12ミリ秒で実行完了
//コピー先テーブルの確認
dbadmin=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+----------------+-------+---------+---------
ssbm | lineorder | table | dbadmin |
ssbm | lineorder_new | table | dbadmin |
(2 rows)
★新規に「lineorder_new」が作成
dbadmin=> select count(*) from ssbm.lineorder_new;
count
-----------
179998372
(1 row)
//コピー先プロジェクションの確認
dbadmin=> \dj
List of projections
Schema | Name | Owner | Node | Comment
--------+------------------------------------+---------+-------------------+---------
ssbm | lineorder_DBD_1_rep_com1 | dbadmin | v_testdb_node0001 |
ssbm | lineorder_new_DBD_1_rep_com1_super | dbadmin | v_testdb_node0001 |
(2 rows)
★新規に「lineorder_new_DBD_1_rep_com1_super」が作成
dbadmin=> select projection_schema,anchor_table_name,projection_name,projection_basename,create_type,owner_name from projections;
projection_schema | anchor_table_name | projection_name | projection_basename | create_type | owner_name
-------------------+-------------------+------------------------------------+------------------------------+------------------+------------
ssbm | lineorder | lineorder_DBD_1_rep_com1 | lineorder_DBD_1_rep_com1 | DESIGNER | dbadmin
ssbm | lineorder_new | lineorder_new_DBD_1_rep_com1_super | lineorder_new_DBD_1_rep_com1 | DESIGNER ★ | dbadmin
(2 rows)
★Database Designerで実行されていることを確認ご参考として、”CREATE TABLE AS SELECT”の実行時間をご紹介します。
//CREATE TABLE AS SELECTコマンドの実行
dbadmin=> create table ssbm.lineorder_new2 as select * from ssbm.lineorder;
CREATE TABLE
Time: First fetch (0 rows): 100994.376 ms. All rows formatted: 100994.391 ms
★約101秒で実行完了以下は約1億8千万件のコピーにかかった実行時間の比較結果です。
“COPY_TABLE”のほうが “CREATE TABLE AS SELECT”より、高速に処理できることがわかります。
| 実行コマンド | 実行時間 |
|---|---|
| COPY_TABLE | 12ミリ秒 |
| CREATE TABLE AS SELECT | 101秒 |
参考情報
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。