私はイベントとその発生日を追跡するテーブルを持っています。引いたときにヌル日付ですべてのイベント390K行の252kを日付、NULLおよびインデックス
はので、私は問題を抱えています: は、いくつかのケースでは、イベントが
迅速な統計(でもまだ発生しましたが、既に登録されていない)、日付がnullで発生しましたユーザーの要求に基づくデータ: 1.ユーザーはまだ発生していないイベントをプルしたい場合があります。 (ユーザーは*を入力します) 2.ユーザーは、特定の日付を超えて発生したイベントをプルする可能性があります。 3.ユーザーは、特定の日付を超えて発生したイベント+まだ発生していないイベントをプルすることができます。
私は、
select
even_id,
event_registered_date,
event_name,
event_occurred_date
from
events_table
where
NVL(event_occurred_date, to_date('2033-01-01','yyyy-mm-dd')) >= coalesce(to_date(replace(:p1, '*', NULL),'yyyy-mm-dd'),event_occurred_date,to_date('2033-01-01','yyyy-mm-dd'))
...--other filter conditions are here
のようなもの
このSQLの中で最もコストのかかる部分は日付フィルタであるが、動的SQLクエリを構築しています。私は関数ベースのインデックスtrunc(event_occurred_date)
を作成しようとしましたが、null値も含めてtrunc(NVL(event_occurred_date,to_date('2033-01-01','yyyy-mm-dd')))
まだ全テーブルスキャンを使用しています。
私はこれを解決するより繊細な方法があると確信していますが、私はそれを見ません。事前に おかげ
を追加しました: 私はちょうどテーブルの所有者に話を聞いた、と彼らはイベントの少なくとも半分は、任意の時点でevent_occurred_dateためヌルを持つことになると教えてくれました。多分これは分析するのに役立ちます 実行計画は:
null値の日付値をデフォルト値(2033-01-01のようにNVLで動的に設定する)に設定していないのはなぜですか?それはあなたの問題のほとんどに良い解決策のようです。 –
もう1つの解決策は、クエリを2つの部分に分割することです.1つは日付がヌルで自然に遅くなる(見た目のフィルタがなく、データの大部分を占めるため、インデックスはオプションではない)特定の日付のイベントを照会するための索引を使用するNULLではありません。 –
残念ながら、私はテーブルにデータが取り込まれる方法には影響しません。だから私はそれをそのまま使用しなければなりません。 2行に分割することについては、私は1つのSQLクエリを使用することができ、私がupperを提供している部分は、私がより大きな選択で使用するJOINの1つです。だからこれも助けにならないでしょう。あなたのアドバイスありがとう – user2858200