kayıt ekleme süresini kıslatma

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

kayıt ekleme süresini kıslatma

Mesaj gönderen y.kulac »

s.a.
firebird 2.04 veritabanı kullanıyorum.
şu an itibariyle 190.000 kayıt girildi.

tabloda adisoyadi,yil,kupeno2 alanlarını indexledim.

ben bu tabloya ard arda 100 adet kayıt girmek için şu kodu kullanıyorum.

Kod: Tümünü seç

progressbar1.Visible:= true;
progressbar1.max:= strtointdef(Edit2.Text,0);
 ibtable1.Open;
 ibdataset1.close;
 ibdataset1.SelectSQL.Clear;
 ibdataset1.SelectSQL.Add('Select ID,UYENO,TCKIMLIK,ADISOYADI,KOY,BIRLIKUYENO,KUPENO,KUPENO2,CINSI,ISLEMYILI,ILCEADI,ILCENO From KUPE');
 ibdataset1.SelectSQL.Add('Where UYENO = '''+Edit3.text+'''');
 ibdataset1.SelectSQL.Add('and ILCENO = '''+frmAna.Label20.Caption+'''');
 ibdataset1.Open;
 ibdataset1.Last;

 kontrol := strtointdef(Edit2.Text,0);
 kupeno:= strtofloat(Edit1.Text);
 sayi:=1;
  while sayi <= kontrol do
  begin
     Edit6.Text:= '';
     Edit6.Text:= floattostr(kupeno);
     Edit6.Text:= Formatfloat('000000000000',strtofloatdef(edit6.Text,0));
     ibdataset1.Append;
     ibdataset1.Edit;
     ibdataset1UYENO.AsInteger:= strtoint(Edit3.Text);
     ibdataset1TCKIMLIK.AsString:= Edit4.Text;
     ibdataset1ADISOYADI.AsString:= Edit5.Text;
     ibdataset1BIRLIKUYENO.AsString:= Edit7.Text;
     ibdataset1KOY.AsString:= Edit8.Text;
     ibdataset1KUPENO.AsString:= ibtable1KUPE_KODU.AsString+ibtable1IL_KODU.AsString+Edit6.Text;
     ibdataset1KUPENO2.Value:= kupeno;
     ibdataset1CINSI.AsString:= combobox1.Text;
     ibdataset1ISLEMYILI.AsInteger:= strtoint(Combobox2.Text);
     ibdataset1ILCEADI.AsString := frmAna.Label26.Caption;
     ibdataset1ILCENO.AsInteger := strtoint(frmAna.Label20.Caption);
     ibdataset1.Post;
     sayi:=sayi+1;
     kupeno:=kupeno+1;
     progressbar1.Position:= sayi;
     end;
yani burada while ile bir döngü oluşturdum ve ard arda 100 adet kayıt ekliyorum.
ama kayıt sayısı arttıkça 3 - 4 dk lık bir zamanda ancak 100 kayıt ekleyebiliyor. 500.000 civarı kayıt girilmesi planlanıyor.
kayıt ekleme zamanını en minumuma nasıl indirebilirim.

iyi çalışmalar
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: kayıt ekleme süresini kıslatma

Mesaj gönderen emin_as »

Anlayamadigim nokta, kayit girmeden önce neden bazi kayitlari yükleme geregi duydugun.
ibdatasetteki selectsql e where ilceno='-1' gibi olmadik bir where ekle, sıfır kayıt döndürür. Daha sonra yeni kayıt eklerken, append degil direk insert ile kayıt ekle.
Ibdataset yerine direk storedprocedure yazip, parametre olarak bilgileri gönderebilirsin.

Sanırım farkında olmadan ve kullanmadıgın halde epey bir kayıt yüklüyorsun, bunlar performansı olumsuz ekler. Ayrıca 100 tane ekledikten sonra transaction lari commit edip, daha sonra tekrar bos bir dataset getirip, kayit eklemeye devam edebilirsin.
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

Re: kayıt ekleme süresini kıslatma

Mesaj gönderen y.kulac »

bunun nedeni şudur.
daha önce ilgili üyenin küpelenmiş hayvanı var.
bu nedenle ilgili üyenin küpelenmiş hayvanlarını listeleme yaptırıyorum.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: kayıt ekleme süresini kıslatma

Mesaj gönderen Kuri_YJ »

Selamlar,

Ne yapmak istediğini kod'dan okumayalım da sen bize tam olarak ne yapmak istediğini söyle biz de sana yön vermeye çalışalım.

Mesela benim kafama (Senin koduna bakarken) Neden bir SP yapılmamış da Delphi'de yapılmış sorusu geldi. Ayrıca, Dataset'i açıp, LAST etmek neden gerekli? Fetch zamanı gittikçe artar,

Kolay gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

Re: kayıt ekleme süresini kıslatma

Mesaj gönderen y.kulac »

yapmak istediğim şudur.

kupe isimli bir tablom var.
yusuf kulaç isimli bir üye var. bu üyenin hayvanları küpelenince, küpe nolayırla birlikte tabloya eklettiriyorum.

birde uye isimli bir tablom var.
kupe tablosuna kayıt ekletirken, ilgili üyenin bazı bilgilerini, uye tablosundan alsırıyorum.
kupe numaraları otomatik hazırlanıyor. ben bu üyeye 100 küpe ekle dedğim zaman, art arda 100 kayıt tabloya ekleniyor.
işte ben bu 100 kaydı bir döngüyle ekletiyorum.
ama kayıt sayısı arttıkça yavaşlama oluyor. bunu minumuma indirgemek istiyorum.
iyi çalışmalar.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: kayıt ekleme süresini kıslatma

Mesaj gönderen Kuri_YJ »

Selamlar,

Eğer küpe numarası başlangıcı belli kolayca ve beklemeden halledebilirsin, cart diye de kayıtları oluşturur.

2 Yöntem izleyebilirsin,
1.si Delphi tarafında yaparsın,
2.si Stored Procedure yazarsın,

Ben olsam şu şekilde dizayn ederdim,

Bir adet ekran ve bu ekranda MAL SAHİP'lerini listelerdim (Bir Grid). Daha sonra bu grid üzerinde istenilen kaydı Çift Tıkladığımda yada bir buton koyardım bu butona bastığımda ekrana o mal sahibi hakkında bilgi getirirdim ve Küpe Numarası Başlangıcını gösterirdim. Küpe numarasının kaldığı en son numarayı da bu MAL SAHİBİ'nin üzerinde tutardım. Neyse sonra yine aynı ekranda kaç adet küpe oluşturulacağının bilgisini isteyebilirsin.

MAL SAHİBİ'nin ID'sini, Küpe Başlangıç Numarasını ve Kaç Adet oluşturulacağı bilgisini bir Stored Procedure'e Parametre olarak geçerim ve INSERT'lerimin hepsini o stored procedure içerisinde bir döngü ile hallederim. Böylece, Client ile Server arasındaki FETCH ve FETCH trafiğini minimuma indirirdim ve Server kendi içerisinde yapacağı için işleri, şakır şukur halledecektir muhtemelen siz anlayamayacaksınız bile kayıtların yapıldığını.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla