2016-09-06 16 views
0

でWITH句で複数の副選択を最適化します。は、私のようなクエリが持っているオラクル

私は WITH句を使用して、一度prsテーブルを照会することができるのだろうか?どのようにしてクエリを書くことができますか?

各テーブルには何百万というレコードがあるため、それらを結合するとクエリが非常に遅くなることに言及します。

+0

あなたの実行計画を見ることなく、野生の推測だけが可能です。両方のクエリについて[実行計画](http://stackoverflow.com/questions/34975406/how-to-describe-performance-issue-in-relational-database?answertab=active#tab-top)を送信してください(サブクエリと結合して)。あなたの観察の1つの説明は、(両方のテーブルで可能なFTSを使用して)ハッシュ結合に切り替えるということです。もう1つの説明は、スカラーサブクエリのキャッシングから得られる利益です(qsn.fk_prsの数が比較的少ない場合)。 –

答えて

1

あなたのクエリはこのように書き句で使用して:

with abc as (select id, 
        display_name , 
        address , 
        tel 
       from prs) 
select 
    qsn.code, 
    abc.display_name, 
    abc.address, 
    abc.tel 
from qsn 
inner join abc 
on qsn.fk_prs = abc.id 
where qsn.register_date between :x1 and :x2 ; 

PS:テストされていません。

1

使用参加:

select qsn.code, prs.display_name, prs.address, prs.tel 
from qsn 
left join prs on prs.id = qsn.fk_prs 
where qsn.register_date between :x1 and :x2 
+0

私がそれらに参加するときに言及したように、クエリの実行時間は悪化します! –

+0

@AmirPashazadeh - 'prs.id'だけでなく、' qsn.fk_prs'にインデックスがありますか?あなたがしない場合は、それを追加し、それが役立つかどうかを確認してください。 – mathguy

+0

はいインデックスはありますが、 'id'、' display_name'、 'address'、' tel'の組み合わせのインデックスはありません。私は常にANSI JOINSを使用しますが、問合せコストは(説明プランを使用して41000から64000に増加します) –

関連する問題