0

APEX ページにレポートがあり、10,000 ~ 1,000,000 (1M) レコードの範囲の結果 (行数) を含む複数の列があります。

私が持っている条件句があり、表示される結果を決定または制限するためにページアイテムの値を使用します...次のようになります。

SELECT
  ...
FROM ...
WHERE ...
AND (:P2_STARTDATE IS NULL OR TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date)

ページアイテムの値を入力するといつでもP2_STARTDATE比較が行われると思いますが、ページアイテムに値を入力しないとNULL、ブール演算は評価に対してTRUEを返すはずP2_STARTDATE IS NULLです.. .

このクエリでは、0.5M 行を検索するときに実行時間が 45 秒以上かかりますが、これは許容できません。私の理論をテストするために、次の変更を書きました。

SELECT
  ...
FROM ...
WHERE deleted_flag = 'N'
AND (:P2_STARTDATE IS NULL) -- comment the rest of the evaluation....

すぐに NULL と評価され、約 1 秒で同じ結果セット 0.5M+ が返されます。値を設定すると、結果セットは明らかに空になります。

問題は、Oracle APEX がその式を TRUE に迅速に評価するようにするにはどうすればよいかということです。ヒント、回避策、または解決策を提供していただきありがとうございます。

4

2 に答える 2

1

SQL エンジンが OR で短絡評価を使用していると想定するのが安全かどうかはわかりません。

これを試して:

AND (:P2_STARTDATE IS NULL 
     OR 
      (:P2_STARTDATE IS NOT NULL 
       AND TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date)
    )
于 2012-11-28T00:57:17.513 に答える
0

クエリの 2 番目の部分が検索可能であるとは思いません。インデックスを使用することはできません。さらに、あなたの例は、実際の結果セットの検索とは何の関係もありません。

1 つの方法は、(このクエリの外側で) バインドされた変数を正しいデータ型に変換して、クエリが creation_date のインデックスを使用できるようにすることです (creation_date にインデックスがありますよね?)

SELECT
  ...
FROM ...
WHERE ...
AND :P2_STARTDATE IS NULL OR creation_date > :newdatevariable;

いずれにせよ、そこから関数 to_date を取得し、定数を渡します。

于 2012-11-22T19:27:35.090 に答える