Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Optimierung einer Orakelabfrage

Erstens ist distinct nicht erforderlich . Die Abfrage kann wie folgt geschrieben werden:

select * 
  from example@sqldat.com 
 where column1 in (
          select column2 
            from example@sqldat.com 
           where column3 > 0
                  ) 
order by column1

Zweitens gibt es (mindestens) zwei weitere Möglichkeiten, es zu schreiben. Entweder mit JOIN :

select t1.* 
  from example@sqldat.com t1
  join example@sqldat.com t2
 where t2.column2 = t1.column1
   and t2.column3 > 0 
group by
       t1.id, t1.column1, ... 

order by t1.column1

oder (meine Präferenz) mit EXISTS :

select t1.* 
  from example@sqldat.com t1 
 where exists
       ( select *
           from example@sqldat.com 
          where t2.column2 = t1.column1
            and t2.column3 > 0
                  ) 
order by column1

In jedem Fall sollten Sie die Ausführungspläne für alle überprüfen.

Ich würde erwarten, dass die Leistung am besten ist, wenn Sie einen Index für table1.column1 haben und für table2 , entweder ein Index auf column2 oder ein zusammengesetzter Index auf (column3, column2)