条件が設定されていない場合は無条件抽出

条件が入力されている場合は条件に該当するものを抽出、条件が入力されていない場合は無条件抽出をキーが指定されていない場合は無条件に抽出したい。
以下の書き方だと INDEX を使わずに TABLE を検索し TABLE ACCESS FULL になる。

  SELECT * FROM HOGE
   WHERE ( ( P_KEY IS NULL ) OR ( P_KEY IS NOT NULL AND KEY = P_KEY ) )

以下のように書き換えたら INDEX の検索は INDEX RANGE SCAN になり TABLE の検索は TABLE ACCESS BY INDEX ROW になる。

  IF NVL(P_KEY, ' ') = ' ' THEN
    V_KEY := '%';
  ELSE
    V_KEY := P_KEY;
  END IF;

  SELECT * FROM HOGE
   WHERE ITEM LIKE :V_KEY

INDEX の検索は INDEX UNIQUE SCAN になって欲しいのだが、静的SQLだけで実現する方法がまだ分かっていない。
動的SQLであれば INDEX UNIQUE SCAN にするのは容易だが、動的SQLは文字列結合コストがかかるし EXECUTE IMMEDIATE を用いても Hard Parse の頻度が上がってしまう。

  • 最終更新:2013-12-21 16:30:57

このWIKIを編集するにはパスワード入力が必要です

認証パスワード