10.4.21 バックグラウンドインポートとチャンクを意識した運用例1(定期的にデータの追加と削除を繰り返す運用)
バックグラウンドインポートとチャンクを意識した運用例について説明します。バックグラウンドインポートを使用すると,次に示すような定期的にデータの追加と削除を繰り返す運用ができます。
ここでは次のようなシステムでの運用を例に説明します
-
各支店のデータを収集し,半年ごと,3か月ごと,1か月ごと,1週間ごと,1日ごとに,それぞれ購買履歴を分析します。
-
各支店の購買履歴を購買履歴表で一元管理します。
-
データベースには6か月分のデータを保持します。
-
1日に1回,全国の各支店から購買履歴データを収集し,まとめてデータベースにインポートします。
-
データベースにデータをインポートしている間も,収集したデータを分析します。
-
データ容量の増加を抑えるため,6か月より前のデータはバックアップを取得してから削除します。
-
バックアップを月単位で取得します。
また,このシステムでの運用の流れを次の図に示します
|
|
- 〈この項の構成〉
(1) マルチチャンク表とインデクスの定義
各支店の購買履歴を購買履歴表で一元管理するために,購買履歴表(PURCHASE)およびインデクスを定義します。
(a) 購買履歴表(PURCHASE)の定義
購買履歴表(PURCHASE)は,DBエリアTBLDAT_001に格納するように定義します。また,バックグラウンドインポートを実施するために,購買履歴表をマルチチャンク表として定義します。
データベースには6か月分のデータを保持します。そのため,データを6か月間保持できるように,CREATE TABLE文のチャンク指定に指定するチャンク数の最大値を見積もります。
1か月を31日とすると,月に31回バックグラウンドインポートを実行するので,必要なチャンク数は31となります。残り5か月分については,検索性能を維持するために,毎月1つのチャンクにまとめることで,チャンク数を抑えるようにします。
安全率を1.2とすると,作成されるチャンク数の最大値は次の値となります。
作成されるチャンク数の最大値= ↑(31+5)×1.2(安全率)↑= 44
- 参考
-
チャンク数が増加すると検索性能に影響を与えます。そのため,使用するチャンク数をできるだけ抑えるように,設計・運用することを推奨します。
この見積もりによって,チャンク数の最大値には44を設定します。この値をCREATE TABLE文のチャンク指定のCHUNKに指定します。SQL文の例を次に示します。
- ■SQL文の例
CREATE TABLE "PURCHASE" ("SHOP_ID" INT , "TRADE_TIME" TIMESTAMP, "ITEM_ID" INT, "ITEM_NAME" VARCHAR(100)) IN "TBLDAT_001" CHUNK=44
CREATE TABLE文については,マニュアル「HADB SQLリファレンス」の「定義系SQL」の「CREATE TABLE(表の定義)」を参照してください。
(b) 購買履歴表(PURCHASE)に対するインデクスの定義
購買履歴表に対して,B-treeインデクスとレンジインデクスを定義します。インデクスはそれぞれDBエリアIDXDAT_001,RIXDAT_001に格納するように定義します。
商品ID(ITEM_ID列)に対してB-treeインデクスを定義し,取引時間(TRADE_TIME列)に対してレンジインデクスを定義します。SQL文の例を次に示します。
- ■SQL文の例
CREATE INDEX "ITEM_ID_IDX" ON "PURCHASE"("ITEM_ID") IN "IDXDAT_001" EMPTY CREATE INDEX "TRADE_TIME_RIX" ON "PURCHASE"("TRADE_TIME") IN "RIXDAT_001" EMPTY INDEXTYPE RANGE
CREATE INDEX文については,マニュアル「HADB SQLリファレンス」の「定義系SQL」の「CREATE INDEX(インデクスの定義)」を参照してください。
(c) この運用例で使用する表のイメージ
この運用例で使用する表のイメージを次の図に示します。
|
|
(2) 新しいデータの追加(バックグラウンドインポート)
1日に1回,全国の各支店から収集した新しい購買履歴データを,購買履歴表(PURCHASE)に追加します。
新しいデータの追加は,バックグラウンドインポートで実行します。1回のバックグラウンドインポートでマルチチャンク表に格納したデータ,およびそのインデクスは,1つの固まり(チャンク)として管理されます。チャンクについては,「2.12.2 データインポート単位のデータ管理(チャンク)」を参照してください。
- ポイント
-
データをチャンク単位で管理することで,チャンク単位でのバックアップの取得や,データの削除ができます。バックグラウンドインポートやチャンクのマージの際に,チャンクに対してコメントを設定できます。コメントを設定しておくと,管理対象とするチャンクを特定しやすくなります。
バックグラウンドインポートには,-bオプションを指定したadbimportコマンドを使用します。adbimportコマンドの実行例を次に示します。
- ■コマンドの実行例
adbimport -u ADBUSER01 -p '#HelloHADB_01' -k "'" -s , -g 10 -w /home/adbmanager/tmp -z /home/adbmanager/imp_file/imp_opt_file01.txt -b -m 'January 2014_daily' PURCHASE /home/adbmanager/imp_file/imp_data_path01.txt- [説明]
-
購買履歴表(PURCHASE)に対して,入力データパスファイル(/home/adbmanager/imp_file/imp_data_path01.txt)に設定した入力データファイルの内容をバックグラウンドインポートします。
adbimportコマンドについては,マニュアル「HADB コマンドリファレンス」の「adbimport(データのインポート)」を参照してください。また,「10.4.2 マルチチャンク表にデータを格納する方法(バックグラウンドインポート)」も参照してください。
(3) データの検索
データベースにデータを追加している間も,収集したデータを検索・分析します。
バックグラウンドインポートによってデータを追加することで,インポートの対象となるデータベースに対して検索を実行しているユーザが存在しても,データのインポートを実行できます(検索と並行してデータのインポートを実行できます)。
バックグラウンドインポートとデータの検索の関係を次の図に示します。
|
|
購買履歴は,半年間,3か月間,1か月間,1週間,1日単位で分析します。
マルチチャンク表にレンジインデクスが定義されている場合,レンジインデクスはキーとなるデータの,チャンク内での最大値・最小値(値域)を保持しています。検索時には探索条件に含まれないデータを格納しているチャンクがスキップされるため,効率良く検索できます。
マルチチャンク表にレンジインデクスが定義されている場合の処理を次の図に示します。
|
|
- [説明]
-
この例の場合,取引時間(TRADE_TIME列)に対してレンジインデクスが定義されています。そのため,取引時間で検索する際に,探索条件に含まれない取引時間のデータが格納されているチャンクの検索はスキップされます。
(4) チャンクのマージ
月ごとのデータを1つのチャンクにまとめることで,チャンク数の増加による検索性能の低下を回避します。この例では,1か月分(2014年1月分)のデータを1つのチャンクにまとめます。
(a) マージ対象とするチャンクの特定
マージ対象とするチャンクのチャンクIDを特定するには,次に示すように,システム表STATUS_CHUNKSを検索します。
SQL文の例を次に示します。
- ■SQL文の例
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='PURCHASE' AND "CHUNK_COMMENT"='January 2014_daily'- ■検索結果
CHUNK_ID -------------------- 1 (中略) 31- [説明]
-
この例の場合は,バックグラウンドインポート時に付加したチャンクのコメント('January 2014_daily')をキーにSTATUS_CHUNKS表を検索することで,マージ対象とするチャンクのチャンクID(1〜31)を特定しています。
対象となるチャンクと,そのチャンクIDについては,「10.4.9 チャンクの状態や作成されているチャンク数を確認する方法」を参照して確認してください。
(b) チャンクのマージ
チャンクのマージには,adbmergechunkコマンドを使用します。adbmergechunkコマンドの実行例を次に示します。
- ■コマンドの実行例
adbmergechunk -u ADBUSER01 -p '#HelloHADB_01' -g 2 -w /home/adbmanager/tmp -z /home/adbmanager/merge_file/merge_opt_file01.txt -m 'January 2014' -c 1-31 PURCHASE- [説明]
-
購買履歴表(PURCHASE)に対してマージチャンクオプションファイル(/home/adbmanager/merge_file/merge_opt_file01.txt)に設定した値を入力情報として,-cオプションに指定したチャンクのマージを実行します。
この例では,1から31のチャンクIDのチャンクを1つのチャンクにマージすることで,2014年1月分のデータとしてまとめています。
チャンクのマージの例を次の図に示します。
|
|
チャンクID1から31のチャンクは,adbmergechunkコマンドの正常終了時に自動的に削除されます。
- 参考
-
チャンクをマージすることで検索性能を向上させることができます。また,1表,1DBエリアが管理できるチャンク数には限りがあります。チャンク数が足りない場合には,複数のチャンクを1つにマージすることで,使用するチャンク数を削減できます。
マージ対象のチャンクに対して検索を実行しているユーザが存在しても,マージチャンクは実行できます。
adbmergechunkコマンドについては,マニュアル「HADB コマンドリファレンス」の「adbmergechunk(チャンクのマージ)」を参照してください。また,「10.4.10 チャンクをマージする方法(チャンク数を減らす方法)」も参照してください。
(5) データのバックアップ
データ容量の増加を抑えるため,6か月より前のデータはバックアップを取得してから,削除します。データベースのバックアップは月単位で取得します。
(a) 作成日時が最も古いチャンクの特定
購買履歴表(PURCHASE)で6か月より前のチャンク(作成した日時が最も古いチャンク)を特定します。購買履歴表の最もチャンクの作成日時が古いチャンクを特定するには,次に示すように,システム表STATUS_CHUNKSを検索します。
SQL文の例を次に示します。
- ■SQL文の例
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='PURCHASE' AND "CREATE_TIME"=(SELECT MIN("CREATE_TIME") FROM "MASTER"."STATUS_CHUNKS" WHERE TC."TABLE_SCHEMA"='ADBUSER01' AND TC."TABLE_NAME"='PURCHASE')- ■検索結果
CHUNK_ID -------------------- 32 KFAA96404-I 1 rows were selected.- [説明]
-
STATUS_CHUNKS表を検索した結果,この例の場合はチャンクIDが32のチャンクが,作成日時が最も古いチャンク(6か月より前のチャンク)であることがわかります。
- 参考
-
チャンクをマージした場合は,STATUS_CHUNKS表には,マージ元チャンクのうち,最も古い「チャンクの作成日時」が格納されます。
STATUS_CHUNKS表の検索方法については,「付録C.7 システム表の検索 」を参照してください。
(b) バックアップの取得
購買履歴表(PURCHASE)で最もチャンクの作成日時が古いチャンクのチャンクIDが32であるとわかったので,そのチャンクに含まれるデータのバックアップをCSV形式のファイルで取得します。
バックアップの取得には,adbexportコマンドを使用します。adbexportコマンドの実行例を次に示します。
- ■コマンドの実行例
adbexport -u ADBUSER01 -p '#HelloHADB_01' -z /home/adbmanager/exp_file/exp_opt_file01.txt -n PURCHASE -c 32 /home/adbmanager/exp_file/exp_data_path01.txt- ■出力データパスファイル(/home/adbmanager/exp_file/exp_data_path01.txt)の内容
/home/usr/backup0001.csv /home/usr/backup0002.csv /home/usr/backup0003.csv
- [説明]
-
チャンクIDが32のチャンクに含まれるデータのバックアップをCSV形式のファイル(/home/usr/backup0001.csv,/home/usr/backup0002.csv,/home/usr/backup0003.csv)に取得します。
この例の場合,月ごとにチャンクがマージされているので,1か月分のデータのバックアップになります。
- ポイント
-
バックアップを取得するファイルは1つにすることもできますが,複数のファイルに分散することで,出力にかかるオーバヘッドを分散させ性能を向上させることができます。
adbexportコマンドについては,マニュアル「HADB コマンドリファレンス」の「adbexport(データのエクスポート)」を参照してください。また,「10.4.6 チャンク単位にデータをエクスポートする方法」も参照してください。
(6) 古いデータ(チャンク)の削除
データ容量の増加を抑えるため,6か月より前のデータを削除します。
購買履歴表(PURCHASE)から作成日時が最も古いチャンクを削除します。チャンクを削除するには,PURGE CHUNK文の探索条件にチャンクIDを指定して実行します。
- ■SQL文の例
PURGE CHUNK "PURCHASE" WHERE CHUNKID=32
- [説明]
-
チャンクIDが32のチャンクに含まれるデータを削除します。
この例の場合,月ごとにチャンクがマージされているので,1か月分のデータが削除されます。
PURGE CHUNK文については,マニュアル「HADB SQLリファレンス」の「操作系SQL」の「PURGE CHUNK(チャンク内の全行削除)」を参照してください。また,「10.4.7 チャンク単位にデータを削除する方法」も参照してください。
(7) 新しいデータの追加・マージと古いデータの削除の繰り返し
バックグラウンドインポートの実行とチャンクのマージ,およびPURGE CHUNK文を利用したチャンクの削除を繰り返すことで,HADBが管理するデータ量を増やすことなく,購買履歴を分析する運用が継続できます。