Firebird Veri Tabanındaki Aramada Yavaşlık

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
baloglurecep
Üye
Mesajlar: 248
Kayıt: 21 Tem 2006 03:59
İletişim:

Firebird Veri Tabanındaki Aramada Yavaşlık

Mesaj gönderen baloglurecep » 18 Mar 2020 12:47

Merhaba arkadaşlar... Uzun yıllar önce yazdığımız halen kullanılan bir programdaki müşteri arama alanındaki yavaşlık beni üzmeye başladı. Veri tabanındaki ilgili tabloda aktif,pasif 5000 e yakın müşteri var. Arama alanı sadece tek tablo üzerinde yapılmakta. Yalnız alana göre arama yapmak yerine arama alanına girilen bilgiyi tablodaki neredeyse tüm alanda arıyorum. Kullanıcıya kolaylık olsun istiyorum. 5000 kayıtta yavaşlık olmaması lazım. Kodları arama alanının change eventsina ekledim . Filitre adında procedure oluşturup onu kullandım. Kullanıcı arama alanına bir karakter girdiğinde tablodaki belirlediğim alanlarda o karakteri arıyor. Bu işlem gözle görülür derecede yavaş oluyor. Hele bir de ağ üzerinden terminal makineden yapıldığında bir harfe tıklandığında imleç donuyor birkaç saniye geçiyor karakter yazılıp filitre sonucu listede görünüyor. Nerede yanlış yaptığımı bulamadım. Öneri ve tavsiyelerinize ihtiyacım var.

Kod: Tümünü seç

procedure TFORM_MENU.MUSTERI_FILTRE(Butonn:String);
begin
if not(visible) then exit;
 
 
IF ORDER='' THEN ORDER:=' musteriler.Adi_soyadi';
 
with dm.musteri_Query do
 Begin
 Close;
 SelectSQL.Clear;
 SelectSQL.Add('select  musteriler.*, ');
 SelectSQL.Add('(musteriler.satis+musteriler.taksitlisatis) AS TOPLAM_SATIS ,');
 SelectSQL.Add('(musteriler.odemeler + musteriler.odemeler_taksit) AS TOPLAM_ODEMELER,');
 SelectSQL.Add('(musteriler.satis+musteriler.taksitlisatis - musteriler.odemeler - musteriler.odemeler_taksit) AS TOPLAM_BAKIYE');
 SelectSQL.Add('from musteriler ');
 SelectSQL.Add('where musteriler.gizle = 0');
 
if bsSkinCheckRadioBox1.Checked then SelectSQL.Add(' AND (musteriler.satis+musteriler.taksitlisatis - musteriler.odemeler-musteriler.odemeler_taksit)>0');
 
 IF Butonn='' THEN
    BEGIN
    if (trim(bsSkinEdit2.Text)<>'') THEN
      BEGIN
      SelectSQL.Add('and ((musteriler.telefon1 like '+
        QuotedStr('%'+bsSkinEdit2.Text+'%')+') OR (musteriler.telefon like '+
        QuotedStr('%'+bsSkinEdit2.Text+'%')+')OR (musteriler.adi_soyadi like '+
        QuotedStr('%'+bsSkinEdit2.Text+'%')+') or (musteriler.adres like '+
        QuotedStr('%'+bsSkinEdit2.Text+'%')+') or (musteriler.defter_no like '+
        QuotedStr('%'+bsSkinEdit2.Text+'%')+'))');
      END;
 
 
 if bsSkinComboBox1.Text<>'HEPSİ' then
   BEGIN
   if bsSkinComboBox1.Text='BOŞ OLANLAR' then
     SelectSQL.ADD('AND (GRUP='+QuotedStr('')+' OR GRUP IS NULL )')
   else
    SelectSQL.ADD('AND GRUP='+QuotedStr(bsSkinComboBox1.Items[bsSkinComboBox1.ItemIndex]));
   END;
 
 END
ELSE IF Butonn<>'TUMU' THEN SelectSQL.Add('and musteriler.adi_soyadi like '+QuotedStr(Butonn+'%'));
 
 SelectSQL.Add('ORDER BY '+ORDER);
 
 open;
 
 end;
 
bilgiler.Caption:='Kayıt sayısı :'+inttostr(dm.musteri_Query.RecordCount);
end;

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: Firebird Veri Tabanındaki Aramada Yavaşlık

Mesaj gönderen ertank » 18 Mar 2020 09:13

Merhaba,

Gönderdiğiniz SQL sadece kayıt araması yapmıyor. Aynı zamanda toplama/çıkarma işlemleri yapıyor. Gruplama yapıyor. Sıralama yapıyor. Bunların hepsini her bir tuşa basmada yapıyor.

1- İlk olarak buton tıklama, ENTER tuşuna basma gibi bir olay sonrasında bu sorguyu çalıştırmanızı tavsiye edebilirim. Sürekli çalıştırmak çok doğru bir yaklaşım diye düşünmüyorum. Zira yazan kişi yanlış yazdığını farkedip, bir kısım yazıyı silip yeniden yazabilir. Birçok kullanıcı aklındaki arama ifadesini yazdıktan sonra oluşan veriye bakacaktır.

2- İkinci olarak, müşterinizde çalışan veritabanını kopyala yapıştır şeklinde kendi bilgisayarınıza aldığınızda aynı yavaşlık sizde de oluşuyor mu? Bunu kontrol etmenizde fayda var. Birçok yavaşlık sorunu yavaş donanım kaynaklı olabiliyor. Örneğin Windows işletim sisteminde çalışan bir FirebirdSQL sunucu çalıştığı bilgisayar güç seçenekleri maksimum performans şeklinde değil ise normalden daha yavaş çalışıyor olacaktır.

3- Veritabanının page_size değerini maksimum yapın. Böylece diskten tek seferde okunacak bilgi miktarı artacaktır. Daha az disk işlemi ile daha fazla veri işleme yapılabilir. Bunu yapmak için veritabanını komut satırı uygulaması "gbak" ile yedekleyip yedek dosyasını geriye açarken "–page 16384" parametresini eklemeniz gerekecektir.

4- Veritabanı ayarlarından sıralama için kullanılan hafıza miktarını belirleyen parametreyi değiştirin. TempCacheLimit parametresi firebird.conf dosayası içindedir. Standart değeri 2.5 versiyon için 8MB diye biliyorum. Bunu 64MB veya biraz daha fazla yapmanızda fayda var. Böylece daha büyük veriler disk işlemine gerek kalmadan hafızada sıralanıp daha hızlı sonuç almanız mümkün olabilir.

5- Müşteriler tablosu ile ilgili indeks bilgilerini paylaşmamışsınız. SQL içinde kullanılan tüm alanları içeren (gizle, telefon1, telefon, adi_soyadi, adres, defter_no, grup ve sıralama yapılmasına izin verilen alanlar) tek bir indeks oluşturmak performansı arttırabilir. FirebirdSQL çok kolon içeren indeksler içinden sadece tek bir kolona ait verileri kullanabilir. Yani telefon ve müşteri adı üzerinden oluşturulmuş iki kolonluk bir indeks sadece telefon üzerinden arama yapan bir sorguda kullanılabilir. Bazı diğer veritabanı sunucuları bunu yapamayabiliyor.

6- Eğer henüz geçiş yapmadı iseniz FirebirdSQL 3.0 sürümüne geçiş yapmayı düşünebilirsiniz. FirebirdSQL 3 ile birlikte sunucu çok çekirdek (core) kullanabiliyor. Hiçbirşey yapmadan tek başına bu yapılsa dahi performans artışı sağlayacaktır. Günümüzde 4-8 çekirdek neredeyse standart oldu ki birçok bilgisayarda daha fazla çekirdek olabiliyor.

Son olarak, bazı işlemleri sunucu tarafında değil istemci tarafında (uygulamanın kendisinde) yapmanız performans artışına fayda edebilir. Örneğin meşhur DevExpress bileşenleri arasından cxGrid kullanarak düz bir şekilde 5000 adet kaydı basit bir "select * from musteriler" şeklinde alıp filtreleme ve tüm diğer işlemleri Grid üzerinde ve Veritabanı erişim bileşeni üzerinde "local" olarak yapmanız mümkün. Tabi bu tasarım ve kod değişikliği gerektiren bir tavsiyedir.

baloglurecep
Üye
Mesajlar: 248
Kayıt: 21 Tem 2006 03:59
İletişim:

Re: Firebird Veri Tabanındaki Aramada Yavaşlık

Mesaj gönderen baloglurecep » 18 Mar 2020 10:26

Ertank bey hocam değerli bilgileriniz için çok teşekkür ederim. Yavaşlık benim bilgisayarda da var. Evet dediğiniz gibi toplama gruplama gibi bazı işlemleri de yaptırıyorum. Ya buton ya da enter tuşuna yazmalıyım kodu. Diğer tavsiyelerinizi de değerlendireceğğim. Tekrar teşekkür eder iyi çalışmalar dilerim

Cevapla