sql >> Databáze >  >> RDS >> Oracle

Optimalizace dotazu Oracle

Za prvé, není třeba distinct . Dotaz lze napsat jako:

select * 
  from table1@dev 
 where column1 in (
          select column2 
            from table2@dev 
           where column3 > 0
                  ) 
order by column1

Za druhé, existují (alespoň) další dva způsoby, jak to napsat. Buď pomocí JOIN :

select t1.* 
  from table1@dev t1
  join table2@dev t2
 where t2.column2 = t1.column1
   and t2.column3 > 0 
group by
       t1.id, t1.column1, ... 

order by t1.column1

nebo (moje preference) s EXISTS :

select t1.* 
  from table1@dev t1 
 where exists
       ( select *
           from table2@dev 
          where t2.column2 = t1.column1
            and t2.column3 > 0
                  ) 
order by column1

V každém případě byste měli zkontrolovat prováděcí plány pro všechny z nich.

Očekával bych, že výkon bude nejlepší, pokud budete mít index na table1.column1 a pro table2 , buď index na column2 nebo složený index na (column3, column2)



  1. Nastavit časové pásmo pro MYSQL NOW()

  2. Převeďte datový typ časového razítka do unixového časového razítka Oracle

  3. MySQL select se zdá být velmi pomalý, ale nenapadá vás, jak to zlepšit?

  4. Jak nainstalovat MySQL na CentOS 7