Selamlar,
Firebird'ün Index kullanımı gayet iyidir. Hatta bir keresinde öyle bir plan çıkartmıştı ki, adeta bana küfretmişti. Yani böyle index olmaz olsun der gibiydi
O yüzden iç içe selectlerde değil, senin WHERE koşulunda kullandığın şekillerde Index oluştur.
Ayrıca kombine indexler yerine tekil indexler oluşturman, akıllı Firebird Index seçicisi için avantaj oluşturur.
Örnekleyecek olursak,
Senin ASC ve DESC indexlerin var (hareket tablosu için)
Hareket tablosuna şu şekilde 3 tane index ekle bakalım ne olacak.
TCKIMLIKNO (ASCENDING)
CALISMABASLAMATARIHI (DESC)
CALISMABITISTARIHI (ASC)
bu 3 indexi ekledikten sonra selectini çek bakalım ne olacak.
Bu örneği INDEX kullanımlarındaki farkı göstermek için söyledim.
Gelelim farklı SELECT mantığına.
Şöyle bir Index oluşturup, WHERE koşulunu aşağıdaki gibi düzelt bakalım.
Index : TCKIMLIKNO + CALISMABITISTARIHI (DESC)
Kod: Tümünü seç
SELECT p.adi, h.gorevi, EXTRACT(year FROM dogumtarihi) dogumyili, h.calismabaslamatarihi, h.gorevi
FROM personel p
left OUTER JOIN hareket h ON (p.tckimlikno = h.tckimlikno AND (h.id = (SELECT FIRST 1 id FROM hareket hm WHERE hm.tckimlikno = h.tckimlikno ORDER BY calismabitistarihi DESC)))
Yukarıdaki SELECT cümlesi, bitiş tarihine göre en son hareketini getirir.
Bunlara da alternatif başka bir çözüm olabilir. Bu da TRIGGER'dan yardım alarak. Herhangi bir şekilde, HAREKET tablondaçalışma bitirildiğinde, dönüp ilgili personel tablosuna SON_HAREKET_ID gibi bir fielda, son yaptığı hareket ID'sini atabilirsin.
Bu durumda çekeceğin SELECT cümlesi hem basitleşir hem de sistemi yormazsın.
Kod: Tümünü seç
SELECT p.adi, h.gorevi, EXTRACT(year FROM dogumtarihi) dogumyili, h.calismabaslamatarihi, h.gorevi
FROM personel p
left OUTER JOIN hareket h ON p.SON_HAREKET_ID = h.id
SELECT cümlesi yukarıdaki gibi olur
Kolay Gelsin