2016-04-02 35 views
-1

varsayalım aşağıdaki sorgu var:ORACLE SQL ENDEKSİ PERFORMANS

select name 
from friends 
where upper(name) like UPPER('%ESC%') and age = 20; 

dizine alınması için en iyi yolu nedir? CREATE INDEX fr ON friends (AGE);

CREATE INDEX fr ON friends (AGE,UPPER(NAME));

    1. teşekkür ederiz.

  • cevap

    1

    En iyi yol nedir? Her ikisi de sorgu için çok küçük bir avantaj olsa da, hemen hemen eşdeğerdir.

    Yüksek düzeyde, like deseninin joker karakterle başlamasından dolayı yalnızca age dizinini değiştirebilirsiniz. Yani, Oracle, endeksin ilk sütunu olan age olduğunda doğru yaştaki herkesi bulmak için dizini kullanabilir.

    Tek bir uyarı. Oracle, ilk dizininiz varsa upper(name) işlevini uygulayamayacak kadar akıllı olabilir, çünkü değer zaten dizinde. Oracle, age = 20 için dizindeki tüm girdileri taramaya gerek duyardı, ancak where maddesinin veri sayfalarına gitmesi gerekmeyecekti. Bu bir tasarruf olabilir - ama genellikle çok büyük değil.

    sorgu olsaydı: Oracle doğrudan endekste uygun satırları aramak çünkü

    where upper(name) between 'ESC' and 'FSC' and age = 20; 
    

    Sonra ilk endeks daha iyi olurdu.

    1

    Bu sorguda size yardımcı olacak bir dizin bulunamadı. AGE oldukça seçici görünebilir. Yüzden fazla farklı değer var (ağaç ve binaları arkadaş olarak kabul edebileceğimizi varsayalım). Dolayısıyla, AGE üzerinde yapılan bir araştırmanın tüm olası kayıtların% 1'ini aradığı görünebilir. Bununla birlikte, AGE eşit olarak dağıtılmıyor: AGE=20'daki bir filtrenin, AGE=99'dan daha fazla kayıt döndürme olasılığı vardır.

    UPPER (NAME) için, like UPPER('%ESC%')'da kısıtlama yapıyorsunuz. CESC, ESCOBAR ve FRANCESCA gibi eşleşir. Yani sorgu, her adı AGE=20 olarak değerlendirmek zorundadır. friends (AGE,UPPER(NAME)) üzerinde bir dizininiz varsa, tüm WHERE yan tümcesi, makul derecede verimli olabilecek bir Dizin Aralığı Taraması kullanılarak değerlendirilebilir. Yalnızca AGE'daki dizin, bu noktada bir tablonun okunmasına neden olur.

    Her iki yöntem de, sorguyu tüm kaydı almak için tabloyu okumalıdır, çünküUPPER(NAME) ürününü döndürmek istemezsiniz. AGE=20'da çok sayıda endeksli okumaya sahip ortak bir isim öğesi için çok sayıda isabet alırsanız, bunlar pahalı olur. Tüm tabloyu okuyan Tam Tablo Tarama, FRIENDS çok geniş bir tablodur (çok sayıda sütun) olmadıkça daha verimli olabilir.

    Performans ayarlama işlemi, satış dışı bırakma sorunudur. Eğer ARKADAŞLARINIZDA çok fazla kayıt ve ve iyi bir yayılımınız varsa, AGE ve UPPER (NAME) üzerinde çok fazla sorgulamak istiyorsanız o zaman friends (AGE,UPPER(NAME)) üzerindeki bir dizin onu sürdürmenin ek yüküne değer olabilir. Ama eğer küçük bir masa ya da tüm arkadaşlarınız üniversite yaşlarındaysa, büyük ihtimalle herhangi bir endeksle uğraşmamanız gerekir.

    Kısacası, burada bir çok değişken var: yapabileceğiniz tek şey çeşitli seçenekleri kıyaslamak ve sizin için en iyi olanı görmek.