OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

既存のテーブルを高速にコピーする方法

公開日:
更新日:
基本操作
#テーブル

はじめに

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千万件のデータを既存のテーブルから、新しいテーブルにコピーする例をご紹介します。

//コピー元テーブルの確認
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_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で確認しています。