はじめに
データロードにおいて、以下のような目的で複数テーブル間でのデータの整合性が求められる場合があります。本記事では、複数テーブルに対するロードが正常終了した場合に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 ];
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
/*****************************************/ /*** セッション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