Oracle da join için bir ipucu

Oracle da birkaç tabloyu join ile birleştirmeniz gerekiyorsa, sorgu sonucunun daha hızlı dönmesi için bu tablolardan daha az kayıt sayısı olanı ilk tablo olarak alın.

Örneğin

Tablo1 kayıt sayısı 100000
Tablo2 kayıt sayısı 20000
Tablo3 kayıt sayısı 4000 ise

select *
from Tablo2 t2
join Tablo1 t1 on t1.id = t2.id
left join Tablo3 t3 on t3.id = t2.id

şeklinde bir sorgu daha verimli çalışacaktır.

Tablo3'e left join ile gittiğimiz için daha az kayıt olmasına rağmen ilk tablo olarak onu alamadık. Left - Right joinlerde bu yöntem kullanılamaz.

3 yorum:

Serkan Güneş dedi ki...

Oracle'in Query Optimizer programi otomatik olarak sorgu icin en verimli yontemi sececeginden tablolarin sirasi fark etmez.

Mehmet KIŞ dedi ki...

Query optimizer her zaman en iyi sonucu vermediği gibi(bazen indeksleri bile doğru kullanamıyor, hint ile belirtmek zorunda kalıyoruz), bir defa belirlediği çalışma akışını sorguda önemli bir değişiklik olmadığı sürece her defasında aynen çalıştırıyor. Bu nedenle sorgunun en verimli halini mümkün oldukça kendimiz belirlemek zorunda kalıyoruz, bu test edilebilir bir durum.

Mehmet KIŞ dedi ki...

Verdiğimiz bilgileri tamamlamak adına:

Oracle 7i den itibaren, dbms tablolar hakkında doğru/güncel istatistiklere sahip ise(!), tablo sıralamasını yanlış yapsanız da optimizer yüksek olasılıkla en iyi performansı sağlayacak şekilde sorgu çalışma planını hazırlayabiliyor. Burada sıralamanın önemini şu adresteki örnekten anlayabiliriz: http://heliodias.wordpress.com/2007/10/04/driving-table/

Optimizer'ın çalışma planını hazırlama sırasındaki davranışı ise genelde dba'lar tarafından tanımlanan CURSOR_SHARING parametresi ile belirleniyor; burada varsayılan değer olarak EXACT bulunuyor ve her sorgu için yeniden bir çalışma planı hazırlanması sağlanmış oluyor. Her defasında aynı çalışma planının kullanılması için CURSOR_SHARING parametresinin FORCE olarak ayarlanmış olması gerekiyor, bu durumda sorgular daha hızlı çalıştırılabiliyor.