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