ASSIST指定の実行制御ASSISTを使用することで、SQL文の最初の1件の検索を高速化することができます。
ここでは、実行制御ASSISTの使用方法について説明します。
実行制御ASSISTには、FIRST_ROWSがあります。
参照
FIRST_ROWSの一般規則については、“SQLリファレンス”の“ASSIST指定”を参照してください。
最初の1件の検索について最短の応答時間を目標にアクセスプランを選択します。
FIRST_ROWSを指定しない場合、探索条件を満たすすべての行を検索する場合の最短の応答時間を目標にしたアクセスプランを最適化処理が決定します。
注意
SQL文の形式が“FIRST_ROWSが有効となるSQL文の条件”をすべて満たし、排他の属性が“FIRST_ROWSが有効となる排他の属性の条件”のいずれかに該当する場合、FIRST_ROWSが有効になります。
問合せ指定である。
DISTINCTを指定していない。
集合関数を指定していない。
FROM句に実表を指定している。(注1)
副問合せを指定していない。
GROUP BY句を指定していない。
HAVING句を指定していない。
ORDER BY句を指定した場合、ソート指定がすべて昇順または降順である。
ORDER BY句のソート指定に1つの表の列のみを指定し、各ソート指定がすべてASCまたはDESCである。
ORDER BY句のソート指定の列をインデックスキーの順にすべて含むインデックスが定義されている。
ORDER BY句のソート指定に指定した列を持つ表について、下記のいずれかを満たす。
・ DSI分割していない。
・ DSI定義で分割値の指定を1つだけ指定しており、ORDER BY句のソート指定の列の順と分割キーの列名リストの順が一致している。
・ DSI定義で分割キーの列名リストで指定したすべての列に対して、WHERE句の探索条件に比較述語“=”の条件を指定している。
注1) FROM句に表を複数指定した場合はフェッチジョインが可能です。フェッチジョインについては、“3.3.2.4 ジョインASSISTの使用方法”を参照してください。
独立性水準がSERIALIZABLEで、占有の単位がページ、またはDSIである。
独立性水準がREAD UNCOMMITTEDである。
占有モードがEXCLUSIVE LOCKで、占有の単位がページ、またはDSIである。
占有モードがSHARE LOCKで、占有の単位がページ、またはDSIである。
占有モードがNO LOCKである。
リザルトバッファを使用すると、1回目のFETCH文のレスポンス時間には、リザルトバッファを満杯にする時間も含まれます。このため、少量検索においては、リザルトバッファのサイズを大きくしないでください。
実行制御ASSISTの使用例
FROM句に表を1個指定した場合のFIRST_ROWSの例を以下に示します。
最初の1件の検索について最短の応答時間を目標にアクセスプランを選択します。
SELECT /* ASSIST FIRST_ROWS */ 倉庫番号,製品番号 FROM 在庫管理.在庫表 WHERE 製品番号 BETWEEN 123 AND 200 ORDER BY 倉庫番号
FROM句に表を複数個指定した場合のFIRST_ROWSの例を以下に示します。
ORDER BY句のソート指定の列と一致するインデックスDSOのINDEX1を使用して検索しながら、在庫表、発注表の順でフェッチジョインを行います。
SELECT /* ASSIST FIRST_ROWS */ 在庫表.製品番号,発注表.取引先 FROM 在庫管理.在庫表,在庫管理.発注表 WHERE 在庫表.製品番号 = 発注表.取引製品 AND 在庫表.倉庫番号 = 2 AND 在庫表.製品番号 > 227 ORDER BY在庫表.製品番号 DESC
ORDER BY句のソート指定の列と一致するインデックスが複数個ある場合、どちらのインデックスを使用するかは最適化処理が決定します。更新トランザクションとのインデックスキー更新の排他の関係などで、使用するインデックスを細かく制御する場合は、USE_INDEXも同時に指定します。また、FIRST_ROWSを指定するとフェッチジョインを行いますが、ジョイン順は最適化処理が決定します。ジョイン順を細かく制御する場合は、LEADING_TABLEも同時に指定します。このような場合、以下のSQL文になります。
SELECT /* ASSIST FIRST_ROWS USE_INDEX(在庫表(INDEX1)) LEADING_TABLE(在庫表,発注表) */ 在庫表.製品番号,発注表.取引先 FROM 在庫管理.在庫表,在庫管理.発注表 WHERE 在庫表.製品番号 = 発注表.取引製品 AND 在庫表.倉庫番号 = 2 AND 在庫表.製品番号 > 227 ORDER BY在庫表.製品番号 DESC