OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

データロード時にトランザクション管理する方法

公開日:
更新日:
基本操作
#COPY
#トランザクション

はじめに

データロードにおいて、以下のような目的で複数テーブル間でのデータの整合性が求められる場合があります。

複数テーブルに対するデータロード実行中、中途半端なデータをユーザへ公開したくない複数テーブルに対するデータロードが1つでもエラーとなったらROLLBACKしたい

本記事では、複数テーブルに対するロードが正常終了した場合にCOMMITするといった、トランザクション管理の方法をご紹介します。

データロード時にトランザクション管理する方法

構文

COPY文で「NO COMMIT」パラメータを使用します。
デフォルトでは「NO COMMIT」パラメータがOFFになっており、1つのCOPY文が完了すると自動的にCOMMITされます。

SQL=> COPY スキーマ名.テーブル名
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 本記事を公開