スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
この項では,インデクスの変更(データの変更に伴うインデクスのメンテナンス処理)の内部動作,及びインデクス検索時のUAPの設計指針について説明します。
インデクスは,探索条件に対する行の絞り込みを効率的に行い,データに対するアクセスや検索結果の返却を高速に行うためのアクセス手段です。
HiRDBは,複数のトランザクションによるインデクス検索と,インデクスの変更を同時に行うことによって,高レスポンス,高スループットのシステムを実現しています。しかし,その反面,インデクス変更の最中にインデクスを使用した検索を行うと,検索結果が変わることがあります。検索結果を変えないために,検索時に検索対象の表に対して排他を掛ける(LOCK TABLE文を実行する)対処方法がありますが,システムの性能要件からこの対処方法が適用できないケースもあります。
このような場合に,複数トランザクションを同時実行し,順序関係に厳密な業務アプリケーションを実行するときは,この項で説明するUAPの設計指針を参考に業務アプリケーションを開発してください。
また,複数列インデクスを構成する列(例えば,ステータスの列など)に対する更新時のインデクス検索についても注意が必要です。
インデクス構成列の列値変更(UPDATE文)に伴うインデクスの変更は,更新前の列値に対応するインデクスエントリの変更処理,及び更新後の列値に対応するインデクスエントリの変更処理の,二つの処理によって実現します。
ここでの更新前の列値に対応するインデクスエントリの変更とは,対応するインデクスキーがある行データが一つの場合,インデクスキーの削除を示します。更新後の列値に対応するインデクスエントリの変更とは,対応するインデクスキーがある行データが一つの場合,インデクスキーの追加を示します。また,これらの処理をインデクスキーの削除,インデクスキーの追加の順に実行します。これは,インデクスの変更時にインデクス容量の増加を抑えるためです。
インデクス変更の内部動作の例を次の図に示します。
図4-1 インデクス変更の内部動作の例
インデクスの変更の最中にインデクス検索を行うと,検索結果が変わるケースがあります。具体的には,次の二つのケースがあります。
更新中の行が検索対象外となるケースについて説明します。
UPDATE文によって,インデクス検索が終了していない範囲から,終了した範囲へインデクスキーを更新すると,そのインデクスキーは検索対象外となります。
更新中の行が検索対象外となる例を次の図に示します。
図4-2 更新中の行が検索対象外となる例(その1)
インデクス検索より先にINSERT文を実行しても,インデクス検索が終了した範囲へインデクスキーを追加すると,そのインデクスキーは検索対象外となります。
更新中の行が検索対象外となる例を次の図に示します。
図4-3 更新中の行が検索対象外となる例(その2)
インデクスの変更の際,インデクスキーを削除した時点でインデクス検索が行われた場合,対応する行は検索対象外となります。
更新中の行が検索対象外となる例を次の図に示します。
図4-4 更新中の行が検索対象外となる例(その3)
図4-5 UPDATE文に伴うインデクスキーの変更によって検索されなくなる例
更新対象の行が複数回検索結果に現れるケースについて説明します。
排他オプションにWITHOUT LOCK WAITを指定した場合,トランザクション完了までの検索結果は保証されないため,タイミングによって更新対象の行が検索結果として複数回現れることがあります。排他オプションにWITHOUT LOCK NOWAITを指定した場合も同様です。具体的には,UPDATE文によってインデクス検索が終了した範囲から,終了していない範囲へインデクスキーを更新すると,そのインデクスキーは再度検索されます。
更新対象の行が複数回検索結果に現れる例を次の図に示します。
図4-6 更新対象の行が複数回検索結果に現れる例
INSERT文,UPDATE文,及びDELETE文実行中にインデクスを検索した場合,検索結果が変わるケースが発生する可能性を,次の表に示します。
表4-1 検索結果が変わるケースが発生する可能性
後続処理(インデクスを使用した検索) | 先行処理 | ||
---|---|---|---|
INSERT文 | UPDATE文 | DELETE文 | |
SELECT文 | × | ×※ | ○ |
UPDATE文 | × | × | ○ |
DELETE文 | × | × | ○ |
INSERT文ではインデクスを使用した検索は行わないため,後続処理としてINSERT文で発生する可能性はありません。
なお,更新対象の行が複数回検索結果に現れるかどうかは,更新前後のインデクスキー値の変化に依存します。更新トランザクションがインデクスを更新したときの,インデクスキー値の変化の方向と,検索トランザクションのインデクス検索方向が一致する場合,次に示す表のように,複数回検索結果に現れる可能性があります。
インデクス検索方向 | UPDATE文によるインデクスキー値の変化 | ||
---|---|---|---|
インデクスキー値が大きくなる | インデクスキー値が小さくなる | インデクスキー値が同じ(同値更新) | |
昇順 (キー値の大きい方向) |
× | ○ | ○ |
降順 (キー値の小さい方向) |
○ | × | ○ |
複数トランザクションを同時に実行する場合で,順序関係に厳密さを必要とする業務アプリケーションを開発するときは,UAPが表に対する排他を取得することで,インデクスの変更とインデクス検索をシリアライズする必要があります。ただし,性能面で影響がある場合には,次の対処を検討してください。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.