INGESTはDB2においてある程度まとまった量のデータをテーブルにインポートする方法としてとても便利です。INGEST処理を自動化し業務アプリケーションとして利用したいというニーズも多いのではないでしょうか。
自動化する際、必ず検討しないといけないのがCOMMIT制御です。INGESTのCOMMIT制御は少し癖があり、私がINGESTを業務アプリケーションに適用した際につまづいた点を下記にて共有したいと思います。
※私が検証した環境はDB2 V11です
⒈INGESTのコミット制御
INGESTは通常のSQLとは違い、デフォルト設定では処理の一部でエラーが発生してもROLLBACKされることはありません。INGEST のコミットは commit_period と commit_count パラメーターで制御されます。デフォルトは commit_period が1秒、commit_count が 0 (利用しない) に設定され、処理される行数にかかわらず、1秒おきにコミットされます。
例えば、500 行以下のファイルを INGEST でインポートし、これを単一のトランザクションとして扱う場合、commit_period=0 (利用しない) 、commit_count =1000 をご指定ください。commit_period を変更しない場合、1000 行処理するのに 1秒以上かかる場合、途中の行でコミットされます。なお、commit_count は 1000 の倍数の数値を受け入れます。
参考資料
commit_period – コミット期間構成パラメーター
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.config.doc/doc/r0057227.html
commit_count – コミット・カウント構成パラメーター
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.config.doc/doc/r0057226.html
⒉INGESTでエラー発生時に全量ロールバックさせる方法
通常のアプリケーションではトランザクション中にエラーが発生した場合は全ての処理をROLLBACKするという仕様が多いと思います。上記基本的なINGESTの仕様を踏まえた上で、エラー発生時に全ての処理を無かったことにする(ROLLBACK)させる方法について説明します。
例えば1000行処理中、間の500行目の処理中にエラーが発生した場合、全ての行の処理をROLLBACKするには下記の上記の構成パラメーター設定に加え、warningcount を 1 に設定します。
設定例
$ cat test.sql
INGEST SET COMMIT_PERIOD 0;
INGEST SET COMMIT_COUNT 1000;
INGEST FROM FILE ファイル名 FORMAT DELIMITED
(
$id INT ,$name CHAR(8)
)
WARNINGCOUNT 0
;