目次
はじめに
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千万件のデータを既存のテーブルから、新しいテーブルにコピーする例をご紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
//コピー元テーブルの確認 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”の実行時間をご紹介します。
1 2 3 4 5 |
//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秒 |
参考情報
COPY_TABLEhttps://my.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/COPY_TABLE.htm