2016-09-05 17 views
0

私はテーブルorderを持っていますが、これは非常に簡単で、orderのデータを格納しています。Oracleビューのテーブルへの結合非常に奇妙な遅い問題

私にはviewがあり、通貨ペアと通貨レートが格納されています。ビューは以下のように作成されます: - currency_rateテーブルから

create or replace view view_currency_rate as (

    select c.* from currency_rate c, (

    select curr_from, curr_to, max(rate_date) max_rate_date from currency_rate 
    where system_rate > 0 
    group by curr_from, curr_to) r 

    where c.curr_from = r.curr_from 
    and c.curr_to = r.curr_to 
    and c.rate_date = r.max_rate_date 
    and c.system_rate > 0 

); 

ここ空想何も、このviewは最新の通貨レート(> curr_to curr_from)を取り込みます。

私が以下のようにすると、注文テーブルにたくさんのレコードがあるため、80k行(すべてのデータ)が読み込まれます。そして、費やされた時間は5秒未満です。

最初のクエリ:

select * from 
VIEW_CURRENCY_RATE c, order a 
where 
c.curr_from = A.CURRENCY; 

私は複数のフィルタを追加したいので、私はそれがより速くなると考えていたので、私はこの追加:

2番目のクエリ:

select * from 
VIEW_CURRENCY_RATE c, order a 
where 
a.id = 'xxxx' 
and c.curr_from = A.CURRENCY; 

そして、1分以上実行します!私は全く何が起こっているのか分かりません。オラクルオプティマイザが間違っていると思ったので、別の方法を見つけようとしました.80Kのデータをかなり高速に取り込むことができるので、データを取得しようとしました。したがって、SQLを次のようにネストしました。

それは遅くも実行されます!アイデアがなくなり、誰でも自分のスクリプトに何が起こるか説明できますか?


私は '計画を説明する' 方法を知っていた後、私は画面をキャプチャ
6 - 9月 - 2016年に更新:

拳クエリ(80Kデータと速い1):

enter image description here

2番目のクエリ(遅い1):

enter image description here


遅いものはビューを完全に破って新しいSQLを作成します。これは、Oracleがこれをどのように最適化できるのか、非常に奇妙です。

+2

1.最新の検索方法を使用してください。 http://stackoverflow.com/questions/10786087/how-to-get-the-latest-employee-record-in-oracle/10786828#10786828 2.クエリについては「explain plain」を参照してください。 3.はい、ビューはあまり最適化されていません。 – Mike

+0

'currency'にインデックスがありますが、' order'テーブルの 'id'にはインデックスがありませんか?どのくらい速く 'select * from order = id '=' xxxx ''が実行されますか? – mathguy

+0

@mathguyええ、 'id'はインデックスです。結果は1秒以内に出てくるでしょう。 – GMsoF

答えて

0

私はマイク・ソリューションを使用しています、私はスクリプトを再書き込み、および根本的な原因は、おそらく別の方法で作業Oracleオプティマイザアルゴリズムに、決定されていないものの、それは、今速く実行されています私は期待しています。

0

2番目のクエリの計画に関連しているようです。ハッシュジョイントの代わりにネストループを使用するためです。 最初に、_hash_join_enableがtrueでない場合はtrueに変更します。真であれば、Oracleオプティマイザには問題があります。テストのために、USE_HASH(tab2 tab1)ヒントを使用します。

よろしく モフセン

+0

両方のプランには少なくとも1つのハッシュ結合があるため、有効にする必要があります。 –

関連する問題