3.4 インデクス
3.4.6 インデクスキー値無排他
インデクスキー値に排他を掛けないで,表のデータだけに排他を掛けて表にアクセスすることをインデクス キー値無排他といいます。
インデクスキー値無排他を適用すると,次に示す問題を回避できます。
• データ更新とインデクス検索との間のデッドロック
• 同一キーを持つデータに対するアクセスが必要もなく待たされる
• 異なるキーを持つデータに対するアクセスが必要もなく待たされる
インデクスキー値無排他を使用すると,インデクスを利用した検索処理ではインデクスキー値に排他を掛け ません。また,表に対する更新処理(行挿入,行削除及び列値更新)の場合にも,更新対象列に定義されて いるインデクスのインデクスキー値に対して排他は掛けません。
(1) 適用基準
どの業務でも,インデクスキー値無排他を使用することをお勧めします。ただし,ユニークインデクスの動 作,残存エントリ及びインデクスログ量を考慮した上で決めてください。ユニークインデクスの一意性制約 保証処理の動作,残存エントリについては,「(4)注意事項」を参照してください。インデクスキー値無排他 を使用するときのインデクスログ量については,マニュアル「HiRDB Version 9 システム導入・設計ガイ ド」のインデクスログ量と排他資源数の見積もりの説明を参照してください。
(2) 指定方法
インデクスキー値無排他を使用する場合は,システム共通定義のpd_indexlock_modeオペランドに NONE を指定します。
【UNIX 版の場合の留意事項】
システム定義の pd_inner_replica_control オペランドの指定値が 1 より大きいとき,システム定義の pd_indexlock_mode オペランドの指定に関係なく,pd_indexlock_mode オペランドには NONE が 仮定されます。
(3) インデクスキー値無排他を使用した場合のデッドロック回避の例
インデクスキー値無排他を使用した場合のデッドロック回避の例について説明します。ここで説明する デッドロックの例を次の図に示します。排他制御モードについては,「6.11.2 排他制御モード」を参照し てください。
3 データベースの論理構造
95
図 3‒33 デッドロックの例(インデクスキー値無排他を使用しない場合)
インデクスキー値無排他を指定しておくと,図 3-33 のようなデッドロックを回避できます。インデクス キー値無排他を使用した場合のデッドロック回避の例を次の図に示します。
図 3‒34 インデクスキー値無排他を使用した場合のデッドロック回避の例
(4) 注意事項
(a) ユニークインデクスの一意性制約保証処理の動作
一意性制約定義が指定されている表では,インデクスキー値無排他の場合とそうでない場合とで,行の追加 及び更新時に行われる一意性制約の保証処理の動作が異なります。一意性制約の保証処理とは,行データの 挿入,又は列値更新のときに,インデクス(ユニークインデクス)を使用して追加しようとしているキーを 持つデータが既に表にあるかをチェックするとともに,排他制御で追加キーの一意性を保証する処理のこと をいいます。一意性制約の保証処理では,同一キーを持つインデクスキーエントリが見付かった場合,エ ラーとなります。そのインデクスキーを操作している相手トランザクションが未決着状態で,ロールバック する可能性があったとしても,排他制御でのチェックをしないでエラーとなります。
一意性制約を指定した表データの挿入,又は更新処理をする場合に,待つことよりも処理を続行することを 優先したいときには,インデクスキー値無排他を適用してください。また,待ってでも挿入,又は更新処理 を試みる方を優先したい場合には,インデクスキー値無排他を適用しないでください。
(b) ユニークインデクスの残存エントリ
インデクスキー値無排他を適用する場合,ユニークインデクスで排他待ち,及びデッドロックが発生するこ とがあります。インデクスキー値無排他でのユニークインデクスでは,一意性制約保証のために DELETE 文,又は UPDATE 文実行前のインデクスキーをインデクス上から削除しないで残すようにしています。こ の残っているインデクスキーのことを残存エントリといいます。この残存エントリは,トランザクション決 着後の適当なタイミングで削除されますが,残存エントリと同一のキーに対する INSERT 文,又は UPDATE 文を実行した場合,タイミングによっては予想外に待たされたり,デッドロックが発生したりす ることがあります。
これらを回避するためには,一意性制約の列を更新しないように UAP を作成する必要があります。
3 データベースの論理構造
97
(5) インデクスキー値無排他を適用しても回避できないデッドロック
UAP のアクセス順序によって,インデクスキーとインデクスキーとでデッドロックが発生することがあり ます。これを回避するためには,一意性制約の列を更新しないように UAP を作成しなければなりません。