2016-06-16 4 views
0

私はイベントとその発生日を追跡するテーブルを持っています。引いたときにヌル日付ですべてのイベント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ためヌルを持つことになると教えてくれました。多分これは分析するのに役立ちます 実行計画は: execution plan

+0

null値の日付値をデフォルト値(2033-01-01のようにNVLで動的に設定する)に設定していないのはなぜですか?それはあなたの問題のほとんどに良い解決策のようです。 –

+0

もう1つの解決策は、クエリを2つの部分に分割することです.1つは日付がヌルで自然に遅くなる(見た目のフィルタがなく、データの大部分を占めるため、インデックスはオプションではない)特定の日付のイベントを照会するための索引を使用するNULLではありません。 –

+0

残念ながら、私はテーブルにデータが取り込まれる方法には影響しません。だから私はそれをそのまま使用しなければなりません。 2行に分割することについては、私は1つのSQLクエリを使用することができ、私がupperを提供している部分は、私がより大きな選択で使用するJOINの1つです。だからこれも助けにならないでしょう。あなたのアドバイスありがとう – user2858200

答えて

1

最初のすべてのインデックスを構築した後 - あなたはインデックスを分析した?

あなたが持っていると仮定すると、実行しているクエリの種類については言及していません。 クエリパラメータがNULLを検索している場合、オプティマイザがインデックス範囲スキャンでフルテーブルスキャンを使用することを選択しても驚くことはありません。 最後に、レコードセットの大部分はNULLの日付値を持ちます。

ヒントを使用して、インデックス を強制的に使用することもできます。/* + index(events_table_idx)*/

ただし、データを取得する最も効率的な方法を判断するには、パフォーマンス統計を詳しく調べる必要があります。

+0

result sql selectには 'event_occurred_dateがNULLの部分はありませんが、一般的なパターン: と入力する必要があります。' * 'を入力すると' event_occurred_date'をスキップする必要があります(つまり、 はい、私はインデックスのヒントを指定しようとしましたが、それでもフルテーブルのスキャンを使用していますが、インデックスの範囲スキャンよりも本当に速いと思います。 – user2858200

関連する問題