oracleチューニング

Oracle ヒント句でINDEXを指定する

通常適切な統計情報(ヒストグラム)が取得されていればほとんど必要ないのですが、SQL実行のタイミングによってはヒストグラムの値と実データの間に大きな乖離が発生する状況により、オプティマイザが不適切なプランを選択してしまう事や、バインドピーク問題の対策の一つとして利用する事があります。

(蛇足かもしれませんが)以下にエイリアスを使った場合と、直接テーブル名を指定した場合を試していますが、どちらも実行計画に違いはないので、PLAN_HASH_VALUEは同じになります。

テーブル名と、利用するインデックス名を指定する
select /*+ index(tbl26 tbl26_idx01) */ COL1,COL5 from tbl26 where COL5='22CCCC'
;
エイリアスを使った場合エイリアス名を指定する
select /*+ index(t tbl26_idx01) */ t.COL1,t.COL5 from tbl26 t where t.COL5='22CCCC'
;
-- 何も指定しない場合フルスキャンが選択される状況
select  t.COL1,t.COL5 from tbl26 t where t.COL5='22CCCC'
 
------------------------ 実行計画 --------------------------
SELECT STATEMENT   Cost = 11667
    TABLE ACCESS FULL TBL26 
--------------------------------------------------------------------------------

-- ヒント句を指定する
-- テーブル名と、利用するインデックス名を指定する
select /*+ index(tbl26 tbl26_idx01) */ COL1,COL5 from tbl26 where COL5='22CCCC'
 
------------------------ 実行計画 --------------------------
SELECT STATEMENT   Cost = 34669
    TABLE ACCESS BY INDEX ROWID BATCHED TBL26 
        INDEX RANGE SCAN TBL26_IDX01 
--------------------------------------------------------------------------------
-- エイリアスを使った場合エイリアス名を指定する
select /*+ index(t tbl26_idx01) */ t.COL1,t.COL5 from tbl26 t where t.COL5='22CCCC'
 
------------------------ 実行計画 --------------------------
SELECT STATEMENT   Cost = 34669
    TABLE ACCESS BY INDEX ROWID BATCHED TBL26 
        INDEX RANGE SCAN TBL26_IDX01 
--------------------------------------------------------------------------------
スポンサーリンク