Verticaにデータをロードする場合は、以下の2通りの方法があります。
1 COPY、またはCOPY DIRECTコマンドを使用してロードする方法
2 INSERT、またはINSERT /*+DIRECT*/文を使用してロード(挿入)する方法
目次
データロード機能の使い分け
データのロード機能は、主に以下のようなガイドラインに従って使い分けることができます。・少量のデータロード、または頻繁に実施するロード
COPYコマンドを使用します。・大量のデータロード、または頻繁に実施しないロード
COPY DIRECTコマンドを使用します。・既存のテーブルからのINSERT INTO…SELECTによるデータロード
INSERT /*+DIRECT*/ を使用します。各ロード機能の使用方法については以下に解説します。
COPYコマンドを使用してロードする方法
COPYコマンドはVerticaのデータロード用のコマンドで、vsql上から実行します。COPYコマンドにはトリクルロード(COPY)とバルクロード(COPY DIRECT)の2種類があり、用途によって使い分けることができます。トリクルロード(COPY)
少量のデータをロードする場合はCOPYコマンドを使用します。
1 |
dbadmin=> COPY スキーマ名.テーブル名 FROM 'ロードファイル名' オプション; |
/data/table1.csvファイルのデータをtable1にロードする場合の例)
1 |
dbadmin=> COPY table1 FROM '/data/table1.csv' DELIMITER ',' ENCLOSED BY '"' ENFORCELENGTH; |
COPYコマンドを実行すると、データはWOS上にロードされます。ただし、デフォルトではロードデータサイズがWOS領域の25%、または2GBを超える場合は、それ以上のデータはROSに直接ロードされます。
バルクロード(COPY DIRECT)
夜間のバッチ処理などで大量データをロードする場合は、COPY DIRECTコマンドを使用します。/data/table1.csvファイルのデータをtable1にロードする場合の例)
1 2 |
dbadmin=> COPY table1 FROM '/data/table1.csv' DELIMITER ',' ENCLOSED BY '"' dbadmin-> ENFORCELENGTH DIRECT; |
COPY DIRECTコマンドの場合、ロードデータはWOSを経由せず直接ROSに書込まれるため、大量データのロードにおいては、COPYコマンドより効率的です。
ただし、少ない件数のロードを頻繁に実施すると、ROSコンテナのフラグメンテーションが大量に発生してしまうため注意が必要です。
その場合は、上記のCOPYコマンドを使用します。COPYコマンドの場合は、少ない件数のロードが頻繁に行われても、ある程度まとまった単位でROSにMove Outされるため、ROSコンテナのフラグメンテーションが少なくて済みます。
INSERT文を使用してロード(挿入)する方法
トリクルロード(INSERT)
汎用RDBMSと同様にINSERT文を使ったデータロードもできます。INSERTの場合もCOPYコマンドと同様にデータはWOS上にロードされます。ただし、COPYコマンドと比べるとロード時のオーバーヘッドが大きいため、データロードはCOPYコマンドを使用することをお薦めします
バルクロード(INSERT /*+DIRECT*/)
INSERT INTO … SELECT…のように大量データをINSERT文でロードする必要がある場合は、/*+DIRECT*/オプションを付与することで、COPY DIRECTコマンドと同様に、ROSに直接ロードできます。
table1のデータをtable2にロードする場合の例)
1 |
dbadmin=> INSERT /*+DIRECT*/ INTO table2 SELECT * FROM table1; |
参考情報
Verticaで既存環境のテーブルのDDLとデータを一括で抽出する方法http://vertica-tech.ashisuto.co.jp/export-all-data/