top of page
  • Yazarın fotoÄŸrafıTuncay Tiryaki

In Operatörü, Indexlerden Pek Hoşlanmaz!

Güncelleme tarihi: 23 May 2020


In operatörü ile sorguladığınız bir kolonda index var ise, Oracle bu indexi kullanmayabilir.



In operatörünün kullandığı kolon üzerinde index olduğunda, sorgu çalıştırıldığı zaman Oracle'ın bu indexi kullanacağı düşünülür. Fakat execution plan'a bakıldığında ilgili indexin kullanılmadığı görülebilir.


Bazı durumlarda SQL optimizer indexi kullanmadan sorguyu çalıştırmanın daha hızlı olacağına karar verir. Bu kararlar her zaman doğru karar olmayabilir.



IN içeren SQL'lerde hangi durumlarda index kullanılmaz?


1) Gelecek veri sayısının büyüklüğü:


Aşağıdaki sorguda tabloda 10.000 kayıt olduğunu düşünelim. Yonetici_ID kolonunda da index var. Parantez içindeki değerler karşılığında tablodan örneğin 8.000 kayıt geliyorsa, bu durumda index üzerinden gitmek daha maliyetli olacaktır. Optimizer, table_full_scan yöntemi ile gitmeye karar verebilir.


select * from personel where yonetici_id in (905, 908, 234)

2) Alt sorgu kullanımlarında:


Bazı alt sorguların IN içerisinde yazılmasında optimizer indexi kullanmayabilir. Bu karar verilirken birçok etken göze alınır. Bu yazıda bunun detaylarına değinilmeyecek. Eğer indexi kullanmak istiyorsanız Exists komutu işinize yarayabilir. Alttaki örnekte ilk SQL'de index kullanılmadığı durumlarda, aynı SQL'i 2. örnekteki gibi yazabilirsiniz. Bu durumda indexin kullanılma durumu optimizer bakımından daha öncelikli değerlendirilir.


1)
select * from personel ps
where yonetici_id in (select yn.yonetici_id from yonetici yn);
    
2)
select * from personel ps 
where exists (select 1 from yonetici yn where yn.yonetici_id = ps.yonetici_id);

3) Function kullanımında:


Eğer, indexli kolonunun bir function tarafından bir parametre olarak kullanılıyorsa, Oracle bu durumda yine indexinizi kullanmayabilir. Bu durumlarda ya hint kullanmalısınız, ya da SQL'inizi function'dan kurtarmalısınız.


4) Tablo istatistikleri doÄŸru olmayabilir:


Tablo istatistikleri sadece IN operatörüne özel bir durum değildir. Fakat IN içeren sorgularda genelde alt sorgular bulunduğu için, bu durumla sık karşılaşılır. Tabloların istatistiklerini güncellemeniz hayat kurtarabilir.

40 görüntüleme0 yorum

Son Yazılar

Hepsini Gör

DECODE vs CASE

bottom of page