はじめに
データロードにおいて、以下のような目的で複数テーブル間でのデータの整合性が求められる場合があります。
複数テーブルに対するデータロード実行中、中途半端なデータをユーザへ公開したくない複数テーブルに対するデータロードが1つでもエラーとなったらROLLBACKしたい本記事では、複数テーブルに対するロードが正常終了した場合にCOMMITするといった、トランザクション管理の方法をご紹介します。
データロード時にトランザクション管理する方法
構文
COPY文で「NO COMMIT」パラメータを使用します。
デフォルトでは「NO COMMIT」パラメータがOFFになっており、1つのCOPY文が完了すると自動的にCOMMITされます。
SQL=> COPY スキーマ名.テーブル名
SQL-> FROM ‘CSVファイル名’
SQL-> [ NO COMMIT | COMMIT ];
SQL-> FROM ‘CSVファイル名’
SQL-> [ NO COMMIT | COMMIT ];
実行例
/*****************************************/
/*** セッションAで2つのテーブルのレコード件数を確認 ***/
/*****************************************/
dbadmin=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+-----------+-------+---------+---------
public | LINEORDER | table | dbadmin |
public | PART | table | dbadmin |
(2 rows)
dbadmin=> SELECT COUNT(*) FROM lineorder;
COUNT
-------
0
(1 row)
dbadmin=> SELECT COUNT(*) FROM part;
COUNT
-------
0
(1 row)
/*****************************************/
/*** セッションBでlineorderテーブルにデータロード ***/
/*****************************************/
dbadmin=> COPY lineorder FROM '/data/csv/lineorder.csv' NO COMMIT;
Rows Loaded
-------------
10000000
(1 row)
dbadmin=> SELECT COUNT(*) FROM lineorder;
COUNT
----------
10000000
(1 row)
/**********************************************/
/*** セッションAでlineorderテーブルのレコード件数を確認 ***/
/**********************************************/
//セッションBでNO COMMITパラメータを指定しているため、セッションAからデータは確認不可
dbadmin=> SELECT COUNT(*) FROM lineorder;
COUNT
-------
0
(1 row)
/*************************************************/
/*** セッションBでpartテーブルへのデータロードとCOMMITを実行 ***/
/*************************************************/
dbadmin=> COPY part FROM '/data/csv/part.csv' NO COMMIT;
Rows Loaded
-------------
1400000
(1 row)
dbadmin=> COMMIT;
COMMIT
dbadmin=> SELECT COUNT(*) FROM part;
COUNT
---------
1400000
(1 row)
/******************************************/
/*** セッションAで2つのテーブルのレコード件数を確認 ***/
/******************************************/
//セッションBでCOMMITを明示的に実行したため、セッションAからも両テーブルのデータを確認可能
dbadmin=> SELECT COUNT(*) FROM lineorder;
COUNT
----------
10000000
(1 row)
dbadmin=> SELECT COUNT(*) FROM part;
COUNT
---------
1400000
(1 row)参考情報
関連マニュアル「Using Transactions to Stage a Load」
https://www.vertica.com/docs/10.0.x/HTML/Content/Authoring/DataLoad/OverrideCOPYAutoCommit.htm
検証バージョンについて
この記事の内容はVertica 10.0で確認しています。
更新履歴
2021/01/06 本記事を公開