2011-01-26 7 views
1

私はこのクエリを可能な限り最適化しようとしています。私のテスト・テーブルでは、これは私が望むものとまったく同じですが、ライブ・テーブルでは、実行に非常に時間がかかります。Oracle/SQL - このユニオン/グループ/カウントクエリを最適化するための助けが必要

select THING_, 
      count(case STATUS_ when '_Good_' then 1 end) as GOOD, 
      count(case STATUS_ when '_Bad_' then 1 end) as BAD, 
      count(case STATUS_ when '_Bad_' then 1 end)/count(case STATUS_ when '_Good_' then 1 end) * 100 as FAIL_PERCENT 
    from  
       (
       select  THING_, 
          STATUS_, 
        from <good table> 
        where TIMESTAMP_ > (sysdate - 1) and 
          STATUS_ = '_Good_' and 
          upper(THING_) like '%TEST%' 

       UNION ALL   

       select  THING_, 
          STATUS_, 
        from <bad table> 
        where TIMESTAMP_ > (sysdate - 1) and 
          STATUS_ = '_Bad_' and 
          THING_THING_ like '%TEST%' 
       ) u 
    group by THING_ 

は、私はそれは、自己は私が何をしたいのか説明にする必要がありますクエリを見て、と思いますが、追加情報が必要とされていない場合、または場合は、私が知っていると私はいくつかのサンプル表を掲載しますしてください。

ありがとうございます!

+1

「良いテーブル」と「悪いテーブル」は実際のテーブルであり、eではありません。 g。ビュー、ネストされたクエリなど? – Quassnoi

+0

実テーブルです。 – dscl

+1

テスト環境と本番環境の実行計画を生成します –

答えて

0

(1)常にSQLのパフォーマンスを診断する際に、あなたの最初のステップを発行する必要があります実行計画を見ると

(2)書かれたクエリに問題がある可能性がSYSDATEが評価されていない機能があるので、ということです(実行計画が決定された後)、オプティマイザはタイムスタンプ列のヒストグラムを使用して索引の効用を評価することはできません。私はそれが悪いオプティマイザの決定につながるのを見ました。あなたが最初に日付を計算する方法を考え出すことができれば、バインドやリテラルとしてクエリに入力することができます。これは実際にはちょっとしたことですが、役立つかもしれません。

(3)クエリを構造化するためのより良い方法は、それぞれのテーブルの集約クエリ間の結合(完全な外部結合など)である可能性があります。

SELECT COALESCE(g.thing_,b.thing_), COALESCE(good_count,0), COALESCE(bad_count,0) 
    FROM (SELECT thing_,count(*) good_count from good_table WHERE ... GROUP BY thing_) g 
     FULL OUTER JOIN 
     (SELECT thing_,count(*) bad_count from bad_table WHERE ... GROUP BY thing_) b 
     ON b.thing_ = g.thing_ 

は(言っている、あなたにも「良い」または「悪い」を示すためにステータス列を持っている。しかし、多分私はoverinterpretingていたときに、2つの別々のテーブルを持っていることを一種の奇妙なようです。)

2

両方のテーブルで複合インデックスを(STATUS_, TIMESTAMP_)に作成します。

0

分析機能を使用しようとしましたか?実行時間が短縮されることがあります。ここに例があります:

select distinct col1, col2, col3 
(Select col1, 
     count(col2) over (partition by col1) col2, 
     count(col3) over (partition by col1) col3 
from table 
) 

そのようなものです。

関連する問題