Locate çok yavaş çalışıyor, neden

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Locate çok yavaş çalışıyor, neden

Mesaj gönderen amatorkaan »

Yaklaşık 80.000 kayıtlı bir vt. var. Edit ile aşağıdaki şekilde arama yaptırıyorum. Ancak çok yavaş işliyor. Her harfi yazdıktan sonra 2-3 saniye bekletiyor. Bunu hızlandırmak için ne tavsiye edersiniz?

Kod: Tümünü seç

Table1.Locate('AdSoyad',Edit1.Text,[loCaseInsensitive]);
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen pasa_yasar »

Indexleri tanımladınız mı
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen amatorkaan »

Evet arama yaptığım alanlar indexli... Bilgisayarım intel i7, 6gb ram. Buna rağmen hızı çok düşük.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen mrmarman »

Merhaba.

- Veritabanı üzerine çalışmanızı yine yapın buna engel yok ama; veritabanından önce, arama şeklinizi optimize etmeyi tercih etmek isterseniz buna ilişkin bir fikrimi paylaşayım.

- Her tuşa basışta veritabanına başvurmak yerine, tuş basma işleminden sonra bir gecikme planlayarak veritabanına daha az erişim yapmaya gayret gösterirseniz yavaş dahi olsa kabul edilebilir bir bekleme olacaktır.

Örnek hazırladım bir deneyin isterseniz.

(1) Bir timer koyduk, interval 1000 yani 1 saniyelik aralıklarla kontrol ediyor.
(2) Edit'in her tuş basmasında zamana xZamaniGeldi isimli global bir değişkene 2 saniyeyi temsil edecek şekilde değer atıyoruz.
(3) Her timer olayında bu (2) ataması yaptığımız değerden (1) eksiltiyoruz. Eğer bir tuşa daha basılırsa yine (2) değerini atayarak EDIT tuş basma eylemi sona erene veya (2) saniyelik bir ara verme işlemine kadar veritabanı aramasına geçilmesini engellemiş oluyoruz. :idea:
(4) xZamaniGeldi (0) değeri aldığı an arama yapılır, (-1) olduğu zamanlar zaten timer içeriğinde hiçbir kod çalışmaz. Bir yavaşlama veya ayağa dolaşacak bir engelleme olmaz. Sadeve xZamaniGeldi değeri 0 ve daha büyük değer olursa bu satırlar çalışır.

(*) xAranacak diye bir string değişken koyduk, çünkü farklı EDIT'lerden de arama yapmak isterseniz xAranacak ortak paydası işinize yarayacaktır. Aksi halde onu devre dışı bırakıp direkt Edit1.Text gibi statik bir değer de gösterebilirsiniz.

(*) Zaman aralığını daha küçük zaman dilimlerine göre de ayarlayabilirsiniz. O zaman Timer intervalini atıyorum 250 ( 1/4 saniyedir ) ayarlarsanız xZamaniGeldi değerine hep 4 veya 8 verip daha kısa zamanda devreye girmesine eşlik edebilirsiniz.

Kod: Tümünü seç

var
  xZamaniGeldi : Integer;
  xAranacak    : String;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  xAranacak    := TEdit(Sender).Text;// + Key;
  xZamaniGeldi := 2;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if xZamaniGeldi >= 0 then dec(xZamaniGeldi);

  if xZamaniGeldi = 0 then
  begin
    // Burada veritabanı locate işlemi yapıyoruz... 
    Table1.Locate('AdSoyad', xAranacak, [loCaseInsensitive]);
    xAranacak := '';
  end;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen xozcanx »

Merhaba,

Muharrem Hocamız sanırım antreman yapmakta döktürmüş yine :)

Table kullanmak yerine "Query" kullanarak SQL ile hızlı arama sonuçları elde edebilirsiniz.

Kod: Tümünü seç

Query1.Active := False;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM TABLO_ADIN WHERE AdSoyad LIKE ' + QuotedStr('%' + Edit1.Text + '%'));
Query1.Active := True;
Burada yapılan işlem nedir derseniz.

ilk satırda Query’yi Kapatıyoruz daha sonra SQL cümlesini Clerar diyerek içini temizliyoruz ve ardından yeni arama yapmak için

Kod: Tümünü seç

SQL.Add()

ile kullanacağımız cümleyi ekliyoruz. Son olarak kapattığımız Query'yi Tekrar açıyoruz.
Bütün hepsi bukadar.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen mrmarman »

Antreman derken .. :)

ilk cümlem neydi :
"- Veritabanı üzerine çalışmanızı yine yapın buna engel yok ama; veritabanından önce, arama şeklinizi optimize etmeyi tercih etmek isterseniz buna ilişkin bir fikrimi paylaşayım."

- SQL illaki daha hızlı çözüm üretir, buna ek veritabanına gereksiz başvuruyu azaltırsan ekstra hız kazanırsın. Altını çizdiğimiz konu bundan öte değil... :idea:
Resim
Resim ....Resim
varyemez
Üye
Mesajlar: 262
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen varyemez »

Ben de bir şey diyeyim. (kambersiz düğün olmazmış)
Jedi nin bir editi var , istediğiniz tabloya , source a bağlıyorsunuz.. adı tam aklımda değil ama JvDBSeArchEdit gibi birşey olmalı
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen freeman35 »

locate yerine lookup daha hızlı olabilir. locate cursor u konumlandırır, lookup bunu yapmaz o yüzden daha hızlı çalışır.
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen xxxjedixxx »

Mevcut yapını bozmadan uygulayabileceğin pratik yöntem;

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
  SorguTimer.Interval := 1500;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  SorguTimer.Enabled := False;
  SorguTimer.Enabled := True;
// burada timer'ın sayacını reset'liyoruz.
end;

procedure TForm1.SorguTimerTimer(Sender: TObject);
begin
  SorguTimer.Enabled := False;
  Table1.Locate('AdSoyad',Edit1.Text,[loCaseInsensitive]);
end;
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen amatorkaan »

Arkadaşlar ilginiz için teşekkür ederim. Hepinizin çözümlerini tek tek uyguladım. mrmarman hocamın çözümü kullandığım programa çok iyi geldi. Çok fark etti. Eskiden imleç 2-3 saniye donuyordu. Şu anda rahat yazılıyor, zaten kullanıcı yazıncaya kadar da aranan yere konumlanıyor. Ancak Timer'in intervalini ben 100'e düşürünce en ideal haline geldi.

Bir de Table yerine Query kullanmanın hızı yükselttiğini çok yerde okudum ve hep bu savunuluyor. Ancak ben başka zamanlarda da denediğim halde hızda pozitif bir değişiklik görmedim.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen xxxjedixxx »

Benim yazdığım kod sizin yaptığınızın daha pratik ve sade haliydi.

Ayrıca TQuery, TAdoQuery'den daha performanslıdır. Bizzat test etmiş biri olarak söylüyorum. Fakat TQuery kullandığınız zaman BDE komponentlerini kullanıcıya kurmak gerekiyor. Bu yüzden setup yapmadan kullanmak için ADOQuery daha pratik geliyor.

AdoQuery'de performans sorunu ile ilgili olarak;
Formun OnCreate'ine

Query1.LockType := ltReadOnly;

yapıp denermisiniz. Bende çok faydalı olmuştu.
Kullanıcı avatarı
amatorkaan
Üye
Mesajlar: 12
Kayıt: 26 Mar 2014 09:53

Re: Locate çok yavaş çalışıyor, neden

Mesaj gönderen amatorkaan »

Varyemez nikli kardeşimin çözümü de çok iyi... Componentin ismi JvDBFindEdit. Arama yapılacak alana bağlandıktan sonra yazılan ifadeyi buluyor. Ancak bu editin içi boşken tablonun en üst satırına gelmesi için OnChange olayına şu kod yazılırsa daha güzel olur:

Kod: Tümünü seç

if JvDBFindEdit1.Text = '' then
Table1.First;
Cevapla