私はテーブル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):
2番目のクエリ(遅い1):
遅いものはビューを完全に破って新しいSQLを作成します。これは、Oracleがこれをどのように最適化できるのか、非常に奇妙です。
1.最新の検索方法を使用してください。 http://stackoverflow.com/questions/10786087/how-to-get-the-latest-employee-record-in-oracle/10786828#10786828 2.クエリについては「explain plain」を参照してください。 3.はい、ビューはあまり最適化されていません。 – Mike
'currency'にインデックスがありますが、' order'テーブルの 'id'にはインデックスがありませんか?どのくらい速く 'select * from order = id '=' xxxx ''が実行されますか? – mathguy
@mathguyええ、 'id'はインデックスです。結果は1秒以内に出てくるでしょう。 – GMsoF