Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  Sorgu* analizinde kullanılan tabirlerden olup, ilgili bilgiye erişebilmek için tablonun baştan sona tarandığını ifade eder. Bunu görünce "bu tabloya bi index tanımlamak lazım ya" denilir.

Örneğin,
SELECT * FROM kisi WHERE ad = 'Ahmet Keskin';
gibi bir sorguda, ad alanında "Ahmet Keskin" yazan kayıtları bulmak için veritabanı bütün kayıtları taramak zorundadır. Eğer ad alanı için aşağıdaki gibi tanımlanmış bir index olsaydı;
CREATE INDEX index_kisi_ad ON kisi(ad);
veritabanı çok daha az kayıda bakarak Ahmetlerin listesini alabilecekti.

Şimdi de soyadı Keskin olan kişileri listelemek istediğimizi düşünelim. Yukarıdaki SQL'in LIKE versiyonunu yazmamız gerekecek. Yani;
SELECT * FROM kisi WHERE ad LIKE '% Keskin';
Bu sorgu yoğun bir çalışmayla soyadı Keskin olan kişilerin listesini getirecektir. Yoğun bir çalışma çünkü, ne yazık ki, yukarıda tanımladığımız index bu sorguda işe yaramayacaktır. Yukarıdaki index ad alanının tamamı için tanımlanmıştı, yarısından geriye kalan kısım için değil.

Neyse ki indexler fonksiyonlar üzerinde de tanımlanabilir. Bu problemi çözmek için aşağıdaki index tanımını yaparız;
CREATE INDEX index_kisi_ad_reverse ON kisi(reverse(ad));
Bu index ad alanınının değerlerinin tersi üzerinde oluşturulmuştur, yani reverse(ad). Böylece yukarıdaki sorguyu aşağıdaki gibi yazabiliriz;
SELECT * FROM kisi WHERE reverse(ad) LIKE reverse('% Keskin')
Bu sorgu indexlenmiş data üzerinde, hızlı bir şekilde soyadı Keskin olan kişileri listeleyecektir.

Fonksiyonlar (daha doğrusu ifadeler) üzerinde index tanımlamak, bildiğim kadarıyla, MySQL'de olamıyor, Oracle, SQL Server ve PostgreSQL'de oluyor.

Not: Oracle ve SQL Server'de reverse fonksiyonu tanımlı, PostgreSQL'de değil. PostgreSQL'de aşağıdaki şekilde tanımlayabilirsiniz:
create or replace function reverse(text) returns text as '
return reverse($_[0]);
' language plperl;

fizikci
17 Ekim 2006 19:56 ~ 17 Ekim 2006 21:15
2.  Mümkün olduğunca bu tür durumlardan kaçınmak gerekir. Oracle için konuşmak gerekirse, bir tabloya bağlı index olması durumunda bile table full scan yapılabilir.Eğer istenilen veri kümesi, tablonun belirli bir bölümünden fazla ise, önce index e gidip onu okumak, sonra da alınan bilgi ile diskten veriyi çekmek maliyetli olabilir. Oracle kendi içinde bulunan CBO(cost based optimizer) ile buna karar verir. Bu karar için tablonun öncelikle analiz edilmesi, CBO'nun tablo hakkında bazı bilgilere sahip olması sağlanmalıdır.
mennan
17 Ekim 2006 20:53
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
© 2005, Bilişim Kulübü. (1203 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen