3.4.5 無排他条件判定
無排他条件判定は,検索処理時には排他を掛けないで,探索条件を満たした行,又はキー値に対してだけ排他を掛けます。無排他条件判定を使用すると通常の検索と比べて,探索条件を満たさない行,又はキー値に対して排他を掛けないため,検索時間が短縮できます。
また,更新処理と同時に検索処理を実行する場合,相手の更新処理が条件を満たさない行の更新,又は追加であれば,排他待ちが発生しません。このため,デッドロックや排他タイムアウトの発生が低減できます。
通常の検索処理と無排他条件判定の処理の流れを次の図に示します。
無排他条件判定をするには,クライアント環境定義のPDLOCKSKIPオペランドでYESを指定します。
無排他条件判定は次に示す条件を満たす場合に効果が得られます。
-
条件判定をする件数に対して,条件を満たす件数が少ない検索
インデクスのキーによって,探索範囲をある程度絞り込んだ状態から,条件を切り出して検索する場合に,条件を満たすものだけに排他を掛けます。このため,探索範囲の件数に比べて,条件を満たす件数が少ないと,通常の検索処理に比べて(条件を満たす件数/探索範囲の件数)の割合で排他処理を削減できます。
-
インデクスを使わない検索
通常の検索処理で,インデクスを使わない検索は,一時的にすべての行に対して排他を掛けます。
無排他条件判定を使用してインデクスを使わない検索をすると,探索条件を満たしたものだけに排他を掛けるため(条件を満たす件数/検索対象表の総行数)の割合で排他処理を削減できます。
-
条件を満たさない更新処理と同時に実行する検索
ほかの更新トランザクションによって先に検索範囲が更新されていても,更新結果が条件を満たしていなければ,排他待ちにはなりません。
また,次に示す条件の場合に無排他条件判定を使用しても適用されません。
-
WITHOUT LOCK NOWAITのような排他を掛けない検索(システム定義pd_isolation_levelオペランドに0を指定,クライアント環境定義PDISLLVLに0を指定,排他オプションを省略した検索)
-
インデクスキー値無排他を適用したときのインデクスを利用する検索
-
次に示す探索条件で,かつ,インデクスを使わない探索条件
-
システム定義スカラ関数を指定している探索条件
-
ユーザ定義関数を指定している探索条件
-
定義長256バイト以上のVARCHAR型の列を指定している探索条件
-
定義長256バイト以上のMVARCHAR型の列を指定している探索条件
-
定義長128文字以上のNVARCHAR型の列を指定している探索条件
-
定義長256バイト以上のBINARY型の列を含む探索条件
-
BLOB型の列を指定している探索条件
-
繰返し列を指定している探索条件
-
コンポネント指定を使用している探索条件
-
外への参照を含む副問合せを指定している探索条件
-
限定述語又はIN述語を指定している探索条件
-
ネストループ結合の内表として評価される探索条件を除く,2表以上にわたる探索条件
-
検索方式がANDの複数インデクス利用(AND PLURAL INDEXES SCAN)のインデクスで評価されない探索条件
-
検索方式がORの複数インデクス利用(OR PLURAL INDEXES SCAN)のインデクスで評価されない探索条件
-
なお,無排他条件判定は,排他を掛けないで条件判定をするため,コミットしていないデータを検索して条件判定するおそれがあります。例えば,更新トランザクションと同時に条件判定するとき,条件判定での検索結果と,更新トランザクションの処理結果との間に差異が発生することがあるので注意が必要です。