11.4.9 チャンクをマージする方法(チャンク数を減らす方法)
バックグラウンドインポートを繰り返してチャンク数が増加すると,B-treeインデクスやテキストインデクスを使用した検索時に性能が低下するおそれがあります。インデクスがチャンクごとに分割されると,インデクスのデータの総容量が増え,I/O回数がチャンク数に比例して増加するためです。
そのため,チャンク数が増えた場合は,adbmergechunkコマンドでチャンクをマージして,チャンク数を減らすことを検討してください。
- 〈この項の構成〉
(1) チャンクの状態に関する留意事項
次に示すチャンクをマージできます(状態が同じである複数のチャンクをマージできます)。
- レギュラーマルチチャンク表の場合
-
-
複数の通常状態のチャンクを,1つの通常状態のチャンクにマージできます。
-
複数の待機状態のチャンクを,1つの待機状態のチャンクにマージできます。
-
- アーカイブマルチチャンク表の場合
-
-
通常状態でアーカイブ状態ではない複数のチャンクを,通常状態でアーカイブ状態ではない1つのチャンクにマージできます。
-
通常状態でアーカイブ状態の複数のチャンクを,通常状態でアーカイブ状態の1つのチャンクにマージできます。
-
待機状態でアーカイブ状態ではない複数のチャンクを,待機状態でアーカイブ状態ではない1つのチャンクにマージできます。
-
待機状態でアーカイブ状態の複数のチャンクを,待機状態でアーカイブ状態の1つのチャンクにマージできます。
-
- 重要
-
-
通常状態のチャンクと待機状態のチャンクを,マージすることはできません。
-
アーカイブ状態ではないチャンクとアーカイブ状態のチャンクを,マージすることはできません。
-
(2) カラムストア表のチャンクをマージする場合の留意事項
次に示す条件をすべて満たす場合は,マージ元チャンクの再編成を実行したあとにチャンクをマージしてください。
-
adbmergechunkコマンドの対象表がカラムストア表である
-
マージ元チャンクのデータに対して更新系SQLを実行したことがある
チャンクをマージしたあとにマージ先チャンクの再編成を実行した場合,次に示す影響があります。
-
再編成時に必要なファイルの容量やデータ用DBエリアの空き領域がより必要になる
-
再編成に掛かる時間が長くなる
マージ元チャンクのデータに対して更新系SQLを実行したことがあるかどうかは,adbdbstatusコマンドを実行して,再編成要否の情報を取得して確認してください。取得した情報のうち,次のどちらかの値が1以上の場合は,対象のチャンクに対して更新系SQLが実行されたことを示しています。
-
Base_row_pages(ローデータ用セグメントに含まれる基本行用ページのページ数)
-
Invalid_row_information_pages(ローデータ用セグメントに含まれる無効情報管理用ページのページ数)
adbdbstatusコマンドについては,マニュアルHADB コマンドリファレンスのadbdbstatus(データベースの状態解析)を参照してください。
(3) adbmergechunkコマンドによるチャンクのマージ
adbmergechunkコマンドを使用してチャンクをマージする例を次に示します。
adbmergechunkコマンドについては,マニュアルHADB コマンドリファレンスのadbmergechunk(チャンクのマージ)を参照してください。
- ■チャンクのマージの実行例
-
HADBユーザ(ADBUSER01)が,店舗表(SHOPSLIST)の2つのチャンク(チャンクIDが1および2)をマージします。
adbmergechunk -u ADBUSER01 -p '#HelloHADB_01' -g 2 -w /home/adbmanager/tmp -z /home/adbmanager/merge_file/merge_opt_file.txt -m 'January 2014' -c 1,2 SHOPSLIST
- [説明]
-
adbmergechunkコマンドを実行すると,マージ元チャンクである2つのチャンク(チャンクIDが1および2)が,1つのチャンク(チャンクIDが4)にマージされます。マージが完了すると,マージ元チャンクは削除されます。
- メモ
-
- ■削除仕掛中のチャンク
-
実行中のadbmergechunkコマンドが,マージ先チャンクの完成からマージ元チャンクの削除完了までの間に中断した場合,マージ元チャンクの状態は「削除仕掛中」となります。このとき,マージ元チャンクは削除されないで残ります。adbcancelコマンドを実行したとき,HADBサーバでメモリ不足が発生したときなどが該当します。
また,adbmergechunkコマンドの--purge-chunkオプションにNOWAITを指定して実行した場合,マージ先チャンクの完成からマージ元チャンクの削除開始までの間に,マージチャンク対象の表を参照している処理が存在したときも,マージ元チャンクの状態は「削除仕掛中」となります。そのため,マージ元チャンクは削除されないで残ります。
「削除仕掛中」となったマージ元チャンクは手動で削除する必要があります。
手動でマージ元チャンクを削除する場合は,「付録C.9 システム表の検索」の「(12) 削除仕掛中のチャンクを調べる場合」を参照してマージ元チャンクのチャンクIDを調べ,PURGE CHUNK文で削除してください。
なお,PURGE CHUNK文のWHERE句に条件(IN述語,限定述語)を指定して,「削除仕掛中」のチャンクを一括して削除することができます。PURGE CHUNK文の指定方法の例については,マニュアルHADB SQLリファレンスのPURGE CHUNK(チャンク内の全行削除)のPURGE CHUNK文の指定形式および規則の例題を参照してください。
- ■チャンクのマージに伴うインデクスのデータ量の一時的な増加
-
adbmergechunkコマンドの実行中は,マージ元チャンクのインデクスのデータ,およびマージ先チャンクのインデクスのデータの両方が一時的に存在するときがあります。そのため,インデクスのデータ量が一時的に増加します。
このとき,実行中のadbmergechunkコマンドを中断し,削除仕掛中のチャンクが残ると,一時的に作成されたインデクスのデータも残るため,削除仕掛中のチャンクを手動で削除する必要があります。
- ■マージ元チャンクの削除と検索処理・更新処理の関係
-
adbmergechunkコマンドは,マージ先チャンクが完成したタイミングで,マージチャンク対象の表に対する検索処理(SQL文,adbexportコマンド,--shared-lockオプションを指定したadbdbstatusコマンドなど)の存在有無を確認します。検索処理が存在した場合は,確認したすべての検索処理の完了を待ってから,マージ元チャンクの削除を行います。そのため,検索処理によっては,マージ元チャンクの削除を行うまでに時間が掛かることがあります。なお,マージ先チャンクが完成したタイミング以降の検索処理については,マージ元チャンクの削除に影響しません。
また,マージ先チャンクの完成後,マージ元チャンクの削除完了を待たないで,マージチャンク対象の表に対して更新処理を行いたい場合は,adbmergechunkコマンドをadbcancelコマンドでキャンセルしてください。キャンセルすると,マージチャンク対象の表を更新できるようになります。
ただし,マージ元チャンクの状態は「削除仕掛中」となり,マージ元チャンクは削除されないで残ります。「削除仕掛中」となったマージ元チャンクは手動で削除してください。
- ■システム用のチャンク
-
データ用DBエリアには,通常のチャンクとは別にシステム用のチャンクが存在します。システム用のチャンクは,実表やデータ用DBエリアに作成できるチャンクがない状態でもadbmergechunkコマンドを実行できるようにするためのチャンクです。
実表やデータ用DBエリアに作成できるチャンクがない状態でadbmergechunkコマンドを実行した場合,マージ先チャンクとしてシステム用のチャンクが使用されます。そして,マージ元チャンクが削除されたときに,削除されたチャンクの1つがシステム用のチャンクとなります。
(4) adbmergechunkコマンド実行中に検索対象となるチャンク
adbmergechunkコマンドの実行中に,チャンクIDを指定した検索(-cオプションを指定したadbexportコマンドやadbsqlコマンドのサブコマンド#GETDATAなど)を実行した場合,検索対象となるチャンクを次の表に示します。
項番 |
adbmergechunkコマンドの処理状況 |
検索対象のチャンク |
検索の可否 |
---|---|---|---|
1 |
|
マージ元チャンク |
○ |
マージ先チャンク |
× |
||
マージ対象外のチャンク |
○ |
||
2 |
|
マージ元チャンク(削除仕掛中) |
× |
マージ先チャンク |
○ |
||
マージ対象外のチャンク |
○ |
||
3 |
|
マージ元チャンク |
× |
マージ先チャンク |
○ |
||
マージ対象外のチャンク |
○ |
- (凡例)
-
○:検索できます。
×:検索対象外のため,検索結果は0件となります。
(5) 待機状態のチャンクをマージする場合の注意点
複数の待機状態のチャンク(マージ元チャンク)をマージした場合,マージ先チャンクは待機状態のチャンクとなります。その際,カレントチャンクは変更されません。
また,待機状態のチャンクをマージした場合,マージするチャンクの状態の組み合わせによって,システム表STATUS_CHUNKSにあるチャンクの作成日時,およびカレントチャンクが切り替わった日時に設定される情報が異なります。詳細を次に示します。
- メモ
-
システム表STATUS_CHUNKSの詳細については,「付録C.5 STATUS_CHUNKSの内容」を参照してください。
(a) 過去に通常状態になったことがない待機状態のチャンクだけをマージしたとき
過去に通常状態になったことがない待機状態のチャンクだけをマージしたときは,マージ先チャンクに,チャンクの作成日時およびカレントチャンクが切り替わった日時は設定されません。
- [説明]
-
過去に通常状態になったことがない待機状態のチャンク(チャンク1と2)をマージすると,マージ先チャンクとして待機状態のチャンク(チャンク4)が作成されます。
その際,カレントチャンクは変更されません。また,チャンク4に,チャンクの作成日時およびカレントチャンクが切り替わった日時は設定されません。
(b) 過去に通常状態になったことがある待機状態のチャンクだけをマージしたとき
過去に通常状態になったことがある待機状態のチャンクだけをマージしたときは,マージ先チャンクに,チャンクの作成日時およびカレントチャンクが切り替わった日時が設定されます。
- [説明]
-
過去に通常状態になったことがある待機状態のチャンク(チャンク1と2)をマージすると,マージ先チャンクとして待機状態のチャンク(チャンク4)が作成されます。
その際,カレントチャンクは変更されません。また,チャンク4に,チャンクの作成日時およびカレントチャンクが切り替わった日時が設定されます。
-
チャンクの作成日時に設定される情報
マージ元チャンクの「チャンクの作成日時」のうち,最も古い日時が設定されます。
-
カレントチャンクが切り替わった日時に設定される情報
マージ元チャンクの「カレントチャンクが切り替わった日時」のうち,最も新しい日時が設定されます。
-
(c) 過去に通常状態になったことがない待機状態のチャンクと,過去に通常状態になったことがある待機状態のチャンクをマージしたとき
過去に通常状態になったことがない待機状態のチャンクと,過去に通常状態になったことがある待機状態のチャンクをマージしたときは,マージ先チャンクに,チャンクの作成日時およびカレントチャンクが切り替わった日時が設定されます。
- [説明]
-
過去に通常状態になったことがない待機状態のチャンク(チャンク1)と,過去に通常状態になったことがある待機状態のチャンク(チャンク2)をマージすると,マージ先チャンクとして待機状態のチャンク(チャンク4)が作成されます。
その際,カレントチャンクは変更されません。また,チャンク4に,チャンクの作成日時およびカレントチャンクが切り替わった日時が設定されます。
-
チャンクの作成日時に設定される情報
マージ元チャンクの「チャンクの作成日時」のうち,最も古い日時が設定されます。
-
カレントチャンクが切り替わった日時に設定される情報
マージ元チャンクの「カレントチャンクが切り替わった日時」のうち,最も新しい日時が設定されます。
-
- 重要
-
過去に通常状態になったことがない待機状態のチャンクと,過去に通常状態になったことがある待機状態のチャンクをマージした場合,マージ先チャンク(待機状態のチャンク)を通常状態のチャンクに変更しても,カレントチャンクにはなりません。
そのため,過去に通常状態になったことがない待機状態のチャンクと,過去に通常状態になったことがある待機状態のチャンクをマージすることは推奨しません。
(6) adbmergechunkコマンドの--purge-chunkオプション指定時の考慮点
ここでは,adbmergechunkコマンドに--purge-chunkオプションを指定する場合の考慮点について説明します。
--purge-chunkオプションには,WAITまたはNOWAITのどちらかを指定できます。通常は,WAITを指定してください(または,--purge-chunkオプションの指定を省略してください)。
--purge-chunkオプションにWAITを指定してadbmergechunkコマンドを実行すると,マージチャンク処理は次の順番で行われます。--purge-chunkオプションの指定を省略した場合も同様です。
- ■--purge-chunkオプションにWAITを指定した場合のマージチャンク処理
-
-
複数のチャンク(マージ元チャンク)が,1つのチャンク(マージ先チャンク)にマージされます。
-
マージ完了後に,ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在しない場合は,マージ元チャンクが削除されます。
なお,ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在する場合は,マージ元チャンクの削除を待ちます。マージチャンク対象表を参照する処理が1つも存在しない状況になったら,マージ元チャンクが削除されます。
-
マージ元チャンクの削除が完了すると,adbmergechunkコマンドが終了します。
-
--purge-chunkオプションにWAITを指定すると,上記のとおり,マージ元チャンクの削除を待つことがあります。マージ元チャンクの削除を待つ間は,adbmergechunkコマンドが終了しません。そのため,マージチャンク対象表を更新する処理は実行できません。例えば,adbimportコマンドによるバックグラウンドインポートなどは実行できません。
ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在することで,adbmergechunkコマンドがマージ元チャンクの削除を待つと困る場合は,--purge-chunkオプションにNOWAITを指定することを検討してください。--purge-chunkオプションにNOWAITを指定してadbmergechunkコマンドを実行すると,マージチャンク処理は次の順番で行われます。
- ■--purge-chunkオプションにNOWAITを指定した場合のマージチャンク処理
-
-
複数のチャンク(マージ元チャンク)が,1つのチャンク(マージ先チャンク)にマージされます。
マージ完了後に,ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在しない場合は,2.に進みます。
ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在する場合は,3.に進みます。
-
ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在しない場合は,マージ元チャンクが削除されます。
マージ元チャンクの削除が完了すると,adbmergechunkコマンドが終了します。
-
ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在する場合は,マージ元チャンクの削除を行わないで,adbmergechunkコマンドが終了します。
マージ元チャンクは削除されないため,削除仕掛中のチャンクとして残ります。
-
--purge-chunkオプションにNOWAITを指定すると,上記のとおり,マージ元チャンクの削除を行わないでadbmergechunkコマンドが終了することがあります。adbmergechunkコマンドは終了するため,マージチャンク対象表を更新する処理を実行できます。例えば,adbimportコマンドによるバックグラウンドインポートなどが実行できます。このように,--purge-chunkオプションにNOWAITを指定すると,ほかのSQL文やコマンドによるマージチャンク対象表を参照する処理が存在することで,adbmergechunkコマンドがマージ元チャンクの削除を待つというケースを防げます。
ただし,マージ元チャンクは削除されないで削除仕掛中のチャンクとして残るため,PURGE CHUNK文で削除する必要があります。マージ元チャンクを削除しないと,adbmergechunkコマンドを実行できません。また,残っているマージ元チャンクの数だけ,作成できるチャンク数が減ります。adbmergechunkコマンドが終了したあとで,任意のタイミングで,マージ元チャンクをPURGE CHUNK文で削除してください。マージ元チャンクを削除する場合は,「付録C.9 システム表の検索」の「(12) 削除仕掛中のチャンクを調べる場合」を参照して,マージ元チャンクのチャンクIDを調べてください。そして,調べたチャンクIDを基にPURGE CHUNK文で,マージ元チャンクを削除してください。なお,マージ元チャンクのチャンクIDは,KFAA96785-Eメッセージで調べることもできます。
- 重要
-
adbmergechunkコマンドの終了後から次のadbmergechunkコマンドを実行するまでの間に,残っているマージ元チャンクをPURGE CHUNK文で削除するタイミングが存在しない場合は,--purge-chunkオプションにNOWAITを指定しないでください。マージ元チャンクが残っているマージチャンク対象表を参照・更新する処理が存在する場合には,PURGE CHUNK文は実行できません。