Firebird DB Çok Yavaş Sorgularım Yardım Lütfen
Firebird DB Çok Yavaş Sorgularım Yardım Lütfen
Merhabalar Arkadaşlar Uzun Süredir Netleştiremediğim Bir çok denememde yanıldığım sorguların program'da yavaş çekme problemini uzun süredir yaşamaktayım indexleme araştırmalarım sonucunda bir kaç adım attım fakat bir türlü randıman alamadım lütfen bu konuda bana destek olun sizden örneklemeler çözümler beklıyorum hoşcakalın. şimdiden çok teşekkürler.
- greenegitim
- Üye
- Mesajlar: 713
- Kayıt: 28 Nis 2011 10:33
- Konum: İstanbul
Re: Firebird DB Çok Yavaş Sorgularım Yardım Lütfen
Mücadele güzelleştirir!
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Firebird DB Çok Yavaş Sorgularım Yardım Lütfen
Bu durum biraz da sorgularınızla alakalı bir durumdur. Mesela Kart ve Hareket toplamı alan iki sorgu arasında dağlar kadar fark vardır.
Mesela borç ve alacak toplamlarını bulan bir sorgu
aşağıdaki şekle dönüştürülmelidir.
Üstelik burada HAREKET tablosunda KART_ID alanına göre eklenmiş bir indeks sorguyu daha da hızlandıracaktır. Kısacası sadece indeks tek başına çözüm değildir, sorgu içi döngüyü de minimum düzeyde tutacak sorgular yazmalısınız.
Özetle aradaki farkı belirtmek gerekirse, üstteki sorguda hem borç hem de alacak alanları için her kart için 2 kere toplama işlemi yapılmaktadır. Tabi indeks yoksa bütün HAREKET tablosu baştan sona taranacaktır bu daha da feci bir durumdur. İndeks eklense bile bu yöntem hantal bir yöntemdir. Alttaki sorguda ise (group by KART_ID) öncelikle her kart için toplamlar hesaplanmış daha sonra hesaplanan değerler ilgili kartlara (left join ile) ilişkilendirerek liste alınmıştır.
Mesela borç ve alacak toplamlarını bulan bir sorgu
Kod: Tümünü seç
select
ana.KODU, ana.ADI,
(select sum(BORC) from HAREKET where KART_ID=ana.ID) as BORC,
(select sum(ALACAK) from HAREKET where KART_ID=ana.ID) as ALACAK
from KART as ana
Kod: Tümünü seç
select
ana.KODU, ana.ADI, alt.BORC, alt.ALACAK from KART as ana
left join
(select KART_ID, sum(BORC) as BORC, sum(ALACAK) as ALACAK from HAREKET group by KART_ID) as alt
on alt.KART_ID=ana.ID
Özetle aradaki farkı belirtmek gerekirse, üstteki sorguda hem borç hem de alacak alanları için her kart için 2 kere toplama işlemi yapılmaktadır. Tabi indeks yoksa bütün HAREKET tablosu baştan sona taranacaktır bu daha da feci bir durumdur. İndeks eklense bile bu yöntem hantal bir yöntemdir. Alttaki sorguda ise (group by KART_ID) öncelikle her kart için toplamlar hesaplanmış daha sonra hesaplanan değerler ilgili kartlara (left join ile) ilişkilendirerek liste alınmıştır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Firebird DB Çok Yavaş Sorgularım Yardım Lütfen
Saban Bey Öncelikle Çok Teşekkürler İlginiz İçin
1.Sorgularım 2. Şemada Anlattığınız Gibi Bir Çok Sorguyu Tek Bir Satırda Bulusturuyorum. Bu Durum Geçerliliğini Koruyor .
2. Firebird'de İndexleme Mantığı Konusunda Epeyce Cahilim Arkadaşların Verdiği Linklerdende Araştırmalarımı Yaptım .
Bunlardan Yola Çıkarak İndexlemenin Herhangi Bir Mantığının Olmadığını Söylüyor Çoğu Kişiler ve Bende 1000 Gecik Varyasyon Denedim . Fakat
Sonuc Alamadım Ne yazikki Sorgularım bir tablodan bir ürünü çağırmam 5 sn sürüyor 2 veya 3 farklı tablodan veri çekmeye kalktığımda ise 1.30 2 dk
arasında bir zaman alıyor ( örneğin 100 adet ürün ismini bir tablodan cağrıorum ürün fiyatını ayrı bir tablodan cağrıorum ürün adetini ayrı bir tablodan
çağırıorum ) bu durumda gerçekten sistemim tabiri caizse felc gecirior .
1.Sorgularım 2. Şemada Anlattığınız Gibi Bir Çok Sorguyu Tek Bir Satırda Bulusturuyorum. Bu Durum Geçerliliğini Koruyor .
2. Firebird'de İndexleme Mantığı Konusunda Epeyce Cahilim Arkadaşların Verdiği Linklerdende Araştırmalarımı Yaptım .
Bunlardan Yola Çıkarak İndexlemenin Herhangi Bir Mantığının Olmadığını Söylüyor Çoğu Kişiler ve Bende 1000 Gecik Varyasyon Denedim . Fakat
Sonuc Alamadım Ne yazikki Sorgularım bir tablodan bir ürünü çağırmam 5 sn sürüyor 2 veya 3 farklı tablodan veri çekmeye kalktığımda ise 1.30 2 dk
arasında bir zaman alıyor ( örneğin 100 adet ürün ismini bir tablodan cağrıorum ürün fiyatını ayrı bir tablodan cağrıorum ürün adetini ayrı bir tablodan
çağırıorum ) bu durumda gerçekten sistemim tabiri caizse felc gecirior .
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Firebird DB Çok Yavaş Sorgularım Yardım Lütfen
Mesela yukarıda iki yapıya nispeten arada kalmış bir başka teknik de alttaki gibidir. Bu teknik, ilk teknikten hızlı ama ikinci teknikten yavaş çalışır.
İndeksleme aslında çok önemli. Temel kıyas ve gruplama yaptığınız alanlarda muhakkak indeks tanımlı olmalı ama söylediğim gibi yazılan sorgulara göre de performans değişmektedir.
Kod: Tümünü seç
select
ana.ID, max(ana.KODU) as KODU, max(ana.ADI) as ADI, sum(alt.BORC) as BORC, sum(alt.ALACAK) as ALACAK
from KART as ana
left join HAREKET as alt on alt.KART_ID=ana.ID
group by ana.ID
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .