11.4.24 バックグラウンドインポートとチャンクを意識した運用例2(待機状態のチャンクを利用した運用)
待機状態のチャンクを利用したバックグラウンドインポートの運用例について説明します。待機状態のチャンクを利用すると,次に示すような任意のタイミングでデータを検索対象にしたり,検索対象外にしたりする運用ができます。
ここでは次のようなシステムでの運用を例に説明します。
-
全国の各店舗が取り扱う商品データを10の支社から本社が収集し,取り扱う商品データを使用した分析をします。
-
本社が収集した商品データは,商品表で一元管理します。
-
商品データは毎月変更されるため,翌月の商品データは各支社から毎月25日までに本社に送付されます。
-
本社に翌月の商品データが届くたびに,データベースにインポートします。
-
インポートした翌月の商品データは,月が切り替わるまで,分析対象外にする必要があります。
-
データベースに翌月の商品データをインポートしている間も,今月の商品データを分析します。
-
月が切り替わると,分析対象外としていた商品データを分析対象にします。また,今まで分析対象としていた商品データを分析対象外とします。
-
データベースには,分析対象外とした商品データを6か月間保持します。
-
データ容量の増加を抑えるため,6か月より前の商品データはバックアップを取得してから削除します。
また,このシステムでの運用の流れを次の図に示します。
- 〈この項の構成〉
(1) マルチチャンク表とインデクスの定義
商品データを一元管理するために,商品表(ITEMLIST)およびインデクスを定義します。
(a) 商品表(ITEMLIST)の定義
商品表(ITEMLIST)は,DBエリアTBLDAT_002に格納するように定義します。また,バックグラウンドインポートを実施するために,商品表をマルチチャンク表として定義します。
この運用例では,次に示す数のチャンクが必要となります。
-
分析対象となる今月の商品データを含むチャンク(1個)
-
各支社から送付された商品データを含むチャンク(11個)
支社の数が10あるため,各支社のデータをインポートするチャンクが10個必要になります。また,それら10個のチャンクをマージするためのチャンクが1個必要になります。よって,合計11個のチャンクが必要になります。
-
分析対象外の商品データ6か月分を含むチャンク(6個)
このため,安全率を1.2とすると,作成されるチャンク数の最大値は次の値となります。
作成されるチャンク数の最大値= ↑(1+11+6)×1.2(安全率)↑= 22
- メモ
-
チャンク数が増加すると検索性能に影響を与えます。そのため,使用するチャンク数をできるだけ抑えるように,設計・運用することを推奨します。
この見積もりによって,チャンク数の最大値には22を設定します。この値をCREATE TABLE文のチャンク指定のCHUNKに指定します。SQL文の例を次に示します。
- ■SQL文の例
-
CREATE TABLE "ITEMLIST" ("SHOP_ID" INT,"DELIVERY_TIME" TIMESTAMP, "ITEM_ID" INT, "ITEM_NAME" VARCHAR(100)) IN "TBLDAT002" CHUNK=22
CREATE TABLE文については,マニュアルHADB SQLリファレンスの定義系SQLのCREATE TABLE(表の定義)を参照してください。
(b) 商品表(ITEMLIST)に対するインデクスの定義
商品表に対して,B-treeインデクスとレンジインデクスを定義します。インデクスはそれぞれDBエリアIDXDAT_002,RIXDAT_002に格納するように定義します。
商品ID(ITEM_ID列)に対してB-treeインデクスを定義し,納品時間(DELIVERY_TIME列)に対してレンジインデクスを定義します。SQL文の例を次に示します。
- ■SQL文の例
-
CREATE INDEX "ITEM_ID_IDX" ON "ITEMLIST"("ITEM_ID") IN "IDXDAT_002" EMPTY CREATE INDEX "DELIVERY_TIME_RIX" ON "ITEMLIST"("DELIVERY_TIME") IN "RIXDAT_002" EMPTY INDEXTYPE RANGE
CREATE INDEX文については,マニュアルHADB SQLリファレンスの定義系SQLのCREATE INDEX(インデクスの定義)を参照してください。
(c) この運用例で使用する表のイメージ
この運用例で使用する表のイメージを次の図に示します。
(2) 翌月の商品データを待機状態のチャンクに追加(バックグラウンドインポート)
翌月の商品データは,各支社から毎月25日までに本社に送付されます。本社に翌月の商品データが届くたびに,商品表(ITEMLIST)に追加します。
翌月の商品データの追加は,バックグラウンドインポートで実行します。その際,翌月の商品データは,月が切り替わるまで分析対象外にする必要があります。そのため,待機状態のチャンクとして追加します。
1回のバックグラウンドインポートでマルチチャンク表に格納したデータ,およびそのインデクスは,1つの固まり(チャンク)として管理されます。チャンクについては,「2.14.2 データインポート単位のデータ管理(チャンク)」を参照してください。
- メモ
-
データをチャンク単位で管理することで,チャンク単位でのバックアップの取得や,データの削除ができます。バックグラウンドインポートやチャンクのマージの際に,チャンクに対してコメントを設定できます。コメントを設定しておくと,管理対象とするチャンクを特定しやすくなります。
待機状態のチャンクを作成するバックグラウンドインポートの場合,-bオプションおよび--status waitオプションを指定したadbimportコマンドを使用します。adbimportコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbimport -u ADBUSER01 -p '#HelloHADB_01' -k "'" -s , -g 10 -w /home/adbmanager/tmp -z /home/adbmanager/imp_file/imp_opt_file02.txt -b --status wait -m 'October 2014' ITEMLIST /home/adbmanager/imp_file/imp_data_path02.txt
- [説明]
-
商品表(ITEMLIST)に対して,入力データパスファイル(/home/adbmanager/imp_file/imp_data_path02.txt)に設定した入力データファイルの内容をバックグラウンドインポートします。
10の支社から翌月の商品データが送付されるたびに,バックグラウンドインポートを実行します。その結果,待機状態のチャンクが10個作成されます。
adbimportコマンドについては,マニュアルHADB コマンドリファレンスのadbimport(データのインポート)を参照してください。また,「11.4.4 マルチチャンク表にインポートするデータを一時的に検索対象外にする方法(待機状態のチャンクの作成)」も参照してください。
(3) データの検索
翌月の商品データをデータベースに追加している間も,今月の商品データを検索・分析します。
バックグラウンドインポートによってデータを追加することで,インポートの対象となるデータベースに対して検索を実行しているユーザが存在しても,データのインポートを実行できます(検索と並行してデータのインポートを実行できます)。
バックグラウンドインポートとデータの検索の関係を次の図に示します。
今月の商品データは分析できますが,翌月の商品データは分析対象外であるため,月が切り替わるまで分析できません(待機状態のチャンクは検索できません)。
(4) 待機状態のチャンクのマージ(チャンク数の削減)
各支社から翌月の商品データが送付されるたびに,バックグラウンドインポートすると,待機状態のチャンクが複数作成されます。これらの待機状態のチャンクを通常状態のチャンクに変更して分析対象に含めると,チャンク数の増加によって検索性能が低下するおそれがあります。
そのため,複数ある待機状態のチャンクを,1つのチャンクにまとめることで,チャンク数の増加による検索性能の低下を回避します。この例では,各支社から送付されたすべての商品データを,データベースに追加したあとで,1つのチャンクにまとめます。
(a) マージ対象とする待機状態のチャンクの特定
マージ対象とする待機状態のチャンクのチャンクIDを特定するには,次に示すように,システム表STATUS_CHUNKSを検索します。
SQL文の例を次に示します。
- ■SQL文の例
-
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='ITEMLIST' AND "CHUNK_COMMENT"='October 2014'
- ■検索結果
-
CHUNK_ID -------------------- 2 (中略) 11
- [説明]
-
この例の場合は,バックグラウンドインポート時に付加したチャンクのコメント('October 2014')をキーにSTATUS_CHUNKS表を検索することで,マージ対象とするチャンクのチャンクID(2〜11)を特定しています。
対象となるチャンクと,そのチャンクIDについては,「11.4.8 チャンクの状態や作成されているチャンク数を確認する方法」を参照して確認してください。
(b) 待機状態のチャンクのマージ
待機状態のチャンクのマージには,adbmergechunkコマンドを使用します。adbmergechunkコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbmergechunk -u ADBUSER01 -p '#HelloHADB_01' -g 2 -w /home/adbmanager/tmp -z /home/adbmanager/merge_file/merge_opt_file02.txt -m 'October 2014_merge' -c 2-11 ITEMLIST
- [説明]
-
商品表(ITEMLIST)に対してマージチャンクオプションファイル(/home/adbmanager/merge_file/merge_opt_file02.txt)に設定した値を入力情報として,-cオプションに指定した待機状態のチャンクのマージを実行します。
この例では,2から11のチャンクIDのチャンクを1つの待機状態のチャンクにマージすることで,翌月の商品データ(2014年10月分)としてまとめています。
待機状態のチャンクのマージの例を次の図に示します。
チャンクIDが2から11のチャンクは,adbmergechunkコマンドの正常終了時に自動的に削除されます。
- メモ
-
待機状態のチャンクをマージすることで,通常状態のチャンクに変更したときに検索性能の低下を防ぐことができます。また,1表,1DBエリアが管理できるチャンク数には限りがあります。チャンク数が足りない場合には,複数のチャンクを1つにマージすることで,使用するチャンク数を削減できます。
adbmergechunkコマンドについては,マニュアルHADB コマンドリファレンスのadbmergechunk(チャンクのマージ)を参照してください。また,「11.4.9 チャンクをマージする方法(チャンク数を減らす方法)」も参照してください。
(5) チャンクの状態変更(分析対象の商品データの切り替え)
月が切り替わったら,分析対象外としていた商品データを分析対象にします。また,今まで分析対象としていた商品データを分析対象外とします。
月が切り替わったら,次のようにチャンクの状態を変更します。
-
分析対象としていた商品データを含む通常状態のチャンクを,分析対象外とするため待機状態のチャンクに変更
-
分析対象外としていた商品データを含む待機状態のチャンクを,分析対象とするため通常状態のチャンクに変更
この例では,2014年9月分の商品データを分析対象外に変更し,2014年10月分の商品データを分析対象に変更します。
(a) 状態変更するチャンクのチャンクIDの特定
状態変更するチャンクのチャンクIDを特定するには,次に示すように,システム表STATUS_CHUNKSを検索します。
まず,2014年9月分の商品データを含むチャンクのチャンクIDを特定します。
- ■SQL文の例(通常状態のチャンクを待機状態のチャンクに変更する場合)
-
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='ITEMLIST' AND "CHUNK_COMMENT"='September 2014_merge'
- ■検索結果
-
CHUNK_ID -------------------- 1
- [説明]
-
この例の場合は,チャンクのマージ時に付加したチャンクのコメント('September 2014_merge')をキーにSTATUS_CHUNKS表を検索することで,2014年9月分の商品データを含むチャンクのチャンクIDを特定しています。
次に,2014年10月分の商品データを含むチャンクのチャンクIDを特定します。
- ■SQL文の例(待機状態のチャンクを通常状態のチャンクに変更する場合)
-
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='ITEMLIST' AND "CHUNK_COMMENT"='October 2014_merge'
- ■検索結果
-
CHUNK_ID -------------------- 12
- [説明]
-
この例の場合は,チャンクのマージ時に付加したチャンクのコメント('October 2014_merge')をキーにSTATUS_CHUNKS表を検索することで,2014年10月分の商品データを含むチャンクのチャンクIDを特定しています。
(b) チャンクの状態変更
チャンクの状態変更には,adbchgchunkstatusコマンドを使用します。次に示すように,チャンクの状態を変更します。
-
通常状態のチャンクを,待機状態のチャンクに変更
2014年9月分の商品データを含むチャンク(チャンクID:1)が対象です。
-
待機状態のチャンクを,通常状態のチャンクに変更
2014年10月分の商品データを含むチャンク(チャンクID:12)が対象です。
adbchgchunkstatusコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbchgchunkstatus -u ADBUSER01 -p '#HelloHADB_01' -w 1 -n 12 ITEMLIST
- [説明]
-
商品表(ITEMLIST)に対して,-wオプションと-nオプションに従って,チャンク状態の変更を実行します。
この例では,チャンクIDが1のチャンクを待機状態に変更し,チャンクIDが12のチャンクを通常状態に,それぞれ変更します。
チャンクの状態変更の例を次の図に示します。
- [説明]
-
2014年9月分の商品データを含むチャンク(チャンクID:1)が分析対象外となり,2014年10月分の商品データを含むチャンク(チャンクID:12)が分析対象となります。
adbchgchunkstatusコマンドについては,マニュアルHADB コマンドリファレンスのadbchgchunkstatus(チャンクの状態変更)を参照してください。また,「11.4.12 チャンクの状態を変更する方法」も参照してください。
(6) データのバックアップ
データ容量の増加を抑えるため,6か月より前の商品データはバックアップを取得してから,削除します。データベースのバックアップは月単位で取得します。
(a) 作成日時が最も古いチャンクの特定
商品表(ITEMLIST)で6か月より前のチャンク(作成した日時が最も古いチャンク)を特定します。商品表の最もチャンクの作成日時が古いチャンクを特定するには,次に示すように,システム表STATUS_CHUNKSを検索します。
SQL文の例を次に示します。
- ■SQL文の例
-
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='ITEMLIST' AND "CREATE_TIME"=(SELECT MIN("CREATE_TIME") FROM "MASTER"."STATUS_CHUNKS" WHERE TC."TABLE_SCHEMA"='ADBUSER01' AND TC."TABLE_NAME"='ITEMLIST')
- ■検索結果
-
CHUNK_ID -------------------- 1
- [説明]
-
STATUS_CHUNKS表を検索した結果,この例の場合はチャンクIDが1のチャンクが,作成日時が最も古いチャンク(6か月より前のチャンク)であることがわかります。
- メモ
-
チャンクをマージした場合は,STATUS_CHUNKS表には,マージ元チャンクのうち,最も古い「チャンクの作成日時」が格納されます。
STATUS_CHUNKS表の検索方法については,「付録C.9 システム表の検索」を参照してください。
(b) バックアップの取得
商品表(ITEMLIST)で最もチャンクの作成日時が古いチャンクのチャンクIDが1であるとわかったので,そのチャンクに含まれるデータのバックアップをCSV形式のファイルで取得します。
バックアップの取得には,adbexportコマンドを使用します。adbexportコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbexport -u ADBUSER01 -p '#HelloHADB_01' -z /home/adbmanager/exp_file/exp_opt_file02.txt -n ITEMLIST -c 1 /home/adbmanager/exp_file/exp_data_path02.txt
- ■出力データパスファイル(/home/adbmanager/exp_file/exp_data_path02.txt)の内容
-
/home/adbmanager/exp_backup/backup0101.csv /home/adbmanager/exp_backup/backup0102.csv /home/adbmanager/exp_backup/backup0103.csv
- [説明]
-
チャンクIDが1のチャンクに含まれるデータのバックアップをCSV形式のファイル(/home/adbmanager/exp_backup/backup0101.csv,/home/adbmanager/exp_backup/backup0102.csv,/home/adbmanager/exp_backup/backup0103.csv)に取得します。
この例の場合,月単位でチャンクがマージされているので,1か月分のデータのバックアップになります。
- メモ
-
バックアップを取得するファイルは1つにすることもできますが,複数のファイルに分散することで,出力にかかるオーバヘッドを分散させ性能を向上させることができます。
adbexportコマンドについては,マニュアルHADB コマンドリファレンスのadbexport(データのエクスポート)を参照してください。また,「11.4.5 チャンク単位にデータをエクスポートする方法」も参照してください。
(7) 古いデータ(チャンク)の削除
データ容量の増加を抑えるため,6か月より前のデータを削除します。
商品表(ITEMLIST)から作成日時が最も古いチャンクを削除します。チャンクを削除するには,PURGE CHUNK文の探索条件にチャンクIDを指定して実行します。
- ■SQL文の例
-
PURGE CHUNK "ITEMLIST" WHERE CHUNKID=1
- [説明]
-
チャンクIDが1のチャンクに含まれるデータを削除します。
この例の場合,月単位でチャンクがマージされているので,1か月分のデータが削除されます。
PURGE CHUNK文については,マニュアルHADB SQLリファレンスの操作系SQLのPURGE CHUNK(チャンク内の全行削除)を参照してください。また,「11.4.6 チャンク単位にデータを削除する方法」も参照してください。
(8) 新しいデータの追加・マージ・状態変更と古いデータの削除の繰り返し
待機状態のチャンクを作成するバックグラウンドインポートの実行,待機状態のチャンクのマージ,チャンクの状態変更およびPURGE CHUNK文を利用したチャンクの削除を繰り返すことで,HADBが管理するデータ量を増やすことなく,対象月の商品データだけを分析する運用が継続できます。