2017-09-18 8 views
0

に参加し、私持っている次のSQLクエリ:Oracleは、最適化

select dres.colA, 
     dres.colP, 
     dres.ID, 
     dre.ID, 
     dre.colED, 
     dre.VID, 
     vpp.VID, 
     vpp.colDESC 
from table1 dres 
    left join table2 dre on dres.ID = dre.ID 
    left join table3 vpp on vpp.VID = dre.VID  
where dre.START_TIME >= date '2017-01-01'; 

クエリがより良い仕事ができる(またはなっているはずです)どのように任意の提案を持っていますか?以下のような 何か:

...where dres.ID in (select * from table2 
        where VID in (select * from table3)).... 
+0

結合最適化のための適切なインデックスを持っていることを確認してください。副選択に基づくin節の使用は、通常は – scaisEdge

+0

を結合するよりもパフォーマンスが低く、数百万の行?私はそうは思わない...ネストされたループのみを引き起こす – Thomas

+0

行数が必要であり、プランを説明する – Thomas

答えて

1

まず、あなたのwhere句は内部結合に外部結合が変化します。だから、としてクエリを書くことで起動します。起動する

select dres.colA, dres.colP, dres.ID, 
     dre.ID, dre.colED, dre.VID, 
     vpp.VID, vpp.colDESC 
from table1 dres join 
    table2 dre 
    on dres.ID = dre.ID join 
    table3 vpp 
    on vpp.VID = dre.VID  
where dre.START_TIME >= date '2017-01-01'; 

場所はtable2(id, vid, start_time, colED)table3(vid, colDESC)上のインデックスです。

別のインデックス作成戦略が機能する可能性があります:table2(start_time, id, vid, colED)。これにより、where節で索引を使用できるようになります。しかし、その特定のwhere節は高度に選択的ではないかもしれません。

+0

あなたはちょうど左の結合から結合に変わった? – 4est

+0

@ 4est。 。 。特定のインデックスを推奨します。 –

+0

index私は知っている....私は何が良くなるだろうと思っている:参加するか、どこに選択を入れなさいか? – 4est