はじめに

Verticaではアーキテクチャの関係上、大量データのロード処理はINSERTではなくCOPYコマンドを利用することが推奨されていますが、日々のバッチ処理等において、既存データへの更新処理が発生する場合の手法について、ご相談されることがよくあります。

本記事では、データの更新が伴う、データロード処理の手法について整理していますので、データ連携の手法にお悩みの方はご参考にいただければと思います。

データ更新が伴うデータロード処理について

データ更新が伴うデータロード処理は、テーブルデータ量や更新量、バッチ処理に許容される時間を加味して方法を検討する必要があります。データ更新が伴うデータロード処理は主に以下の方法から検討します。

TRUNCATE + COPY

毎回、テーブルデータをTRUNCATEし、COPYコマンドにて全件のデータ連携を実施します。いわゆる洗い替えです。

実行例

更新対象のテーブル:lineorder
1.TRUNCATE文によるデータ削除


2.COPY文によるデータロード


※なお、Vertica9.3以降より、TRUNCATE実行後に統計情報が”NONE”(統計情報が取得されていない状態)となるように仕様変更されております。
そのため、TRUNCATE実行後には明示的に統計情報を取得する必要がありますので、ご注意ください。

手動で統計情報を取得する方法
http://vertica-tech.ashisuto.co.jp/collect_analyze/

DELETE + COPY

CSVデータを一度ワークテーブルにロードし、DELETE + COPYにてデータ連携を実施します。




実行例

更新対象のテーブル:lineorder
ワークテーブル:lineorder_temp
プライマリキー:LO_CUSTKEY

1.COPYコマンドによるワークテーブルへのデータロード

2.更新対象のデータをDELETE

3.本テーブルへのデータロード


VerticaではDELETEを利用する場合、いくつか注意点があります。
以下の記事をご参照ください。

DELETEの注意点(1)
http://vertica-tech.ashisuto.co.jp/delete-notice-1/
DELETEの注意点(2)
http://vertica-tech.ashisuto.co.jp/delete-notice-2/
DELETEの注意点(3)
http://vertica-tech.ashisuto.co.jp/delete-notice-3/

MERGE

CSVデータを一度ワークテーブルにロードし、MERGE文にてデータ連携を実施します。




実行例

更新対象のテーブル:lineorder
ワークテーブル:lineorder_temp
プライマリキー:LO_CUSTKEY
1.COPYコマンドによるワークテーブルへのデータロード

2.MERGE文にて本テーブルへのデータロード



各手法のメリット・デメリット

方法メリットデメリット
TRUNCATE + COPY
処理がシンプルであるため、開発工数を大幅に削減できる
更新対象のデータが少なく、テーブルデータが多い場合、DELETE + COPYと比較し、処理に長時間かかる可能性がある
DELETE + COPY
データ処理量が少なくなるため、処理が早く完了する可能性がある
処理が複雑になるため、開発工数がかかる
MERGE
・DELETE + COPYと比較すると、処理がシンプルになるため、開発工数を削減できる

・TRUNCATE + COPYと比較すると、データ処理量が少なくなるため、処理が早く完了する可能性がある
・データ走査が全件に実行されるため、データ件数が増えると処理に時間がかかる可能性がある

・MERGEには列を記述する必要があるため、列定義が変更されるとメンテンスが発生する


参考情報

データロードの基本
http://vertica-tech.ashisuto.co.jp/dataload_overview/

MERGE文の使用方法
http://vertica-tech.ashisuto.co.jp/merge/

検証バージョンについて

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

更新履歴

2021/12/27 本記事を公開