Merhabalar,
Ürünler diye bir tablom var. urunid primary index. Ayrıca urunkodu,fisno alaninida indexledim.
Sorgu yaptigimda bu indexlerden sadece istedigim index i kullanmayi nasil yapabilirim? Suanda indexlerin hic birisini kullanmuyor. NATURAL seklinde görünüyor.
İşin ilginc tarafi ayni tablo ve ayni sorguda baska bir musterimin databasein de kontrol ettigimde bunda urunkodu index'ini secip ona göre sorgulama yapiyor.
Firebird de sorgularda indexli alani secmek
-
- Üye
- Mesajlar: 189
- Kayıt: 30 Eyl 2013 10:17
Re: Firebird de sorgularda indexli alani secmek
Selamlar,
Bu işleme Forced Index veya Force Query Plan deniyor. Firebird'de PLAN olarak bulabilirsin.
Sebebini söyleyeyim. Şimdi RDBMS'lerde, eğer veriler yeteri kadar fazla değilse, Natural Order'ı kullanır. Yani Index sayfasını bul, belleğe yükle aramayı yap, kayda konumlan yerine kayıtları yükle ve tara daha az maliyetli bir işlem olacağından bunu tercih ederler.
INDEX SELECTIVITY diye bir şey vardır. Arada sırada bunu kendiniz manuel olarak Database'lerde refresh edebilirsiniz. Hatta buna ilişkin kodlar var, benim kullandığım bir Procedure'u gönderiyorum. Bu Tüm Indexleri bulup, Indexlerin Selectivitysini günceller.
Benim yaptığım denemelerde, bazen Naturel Order tercihi daha iyi sonuçlar verdi. Tabi bu kullandığınız tablolardaki kayıt sayıları ile alakalı bir durum. Bunu gözardı etmemelisiniz ve genelde Firebird bu konuda gayet iyi. Hatta bir keresinde ben zorla bu planı kullan demiştim ama sonuç Naturel Order'a göre daha yavaş oldu. Daha sonra Sorguma göre Index yapılanmasını değiştirdim o zaman doğru indexi seçip sonucu yapıştırdı.
Kolay Gelsin
Adnan
Bu işleme Forced Index veya Force Query Plan deniyor. Firebird'de PLAN olarak bulabilirsin.
Sebebini söyleyeyim. Şimdi RDBMS'lerde, eğer veriler yeteri kadar fazla değilse, Natural Order'ı kullanır. Yani Index sayfasını bul, belleğe yükle aramayı yap, kayda konumlan yerine kayıtları yükle ve tara daha az maliyetli bir işlem olacağından bunu tercih ederler.
INDEX SELECTIVITY diye bir şey vardır. Arada sırada bunu kendiniz manuel olarak Database'lerde refresh edebilirsiniz. Hatta buna ilişkin kodlar var, benim kullandığım bir Procedure'u gönderiyorum. Bu Tüm Indexleri bulup, Indexlerin Selectivitysini günceller.
Kod: Tümünü seç
SET TERM ^^ ;
CREATE PROCEDURE SP_RECALC_INDEX_SEL
AS
DECLARE VARIABLE INDEX_NAME VARCHAR(31);
BEGIN
FOR SELECT RDB$INDEX_NAME FROM RDB$INDICES
INTO :INDEX_NAME
DO
BEGIN
EXECUTE STATEMENT 'SET STATISTICS INDEX ' || :INDEX_NAME || ';' ;
END
END ^^
SET TERM ; ^^
Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/