Kayıt aktarımındaki süre

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

S.A.
Devartın IBDAC componentlerini kullanarak 2 dane IBCConnection ve bunlara bağlı 2 Tane IBCTablem var
bir tableden diğerine 100.000 adet veri aktarımı yapıyorum. Aktarım yapılan tableye DBGridEh bağlı, ancak tableyi aktarımdan önce DisableControls yapıyorum. Aktarımı While Not Table.Eof do begin döngüsü içinde yapıyorum. Bir de Progresbar ile aktarım adedini gösteren Edit var. Aktarılan alan adedi 18. Aktarımda Transaction commit yok. Aktarım süresi 1 saat. 33 dk. Bu süre çok değil mi ?
Teşekkürler.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen mussimsek »

A.S.

IBTable pek kullanışlı bir component değildir. IBDataset veya IBQuery componenti ile deneyin.

Kolay gelsin.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Mustafa hocam Devart'ta IBDataset yok ama Query ile de denedim yine aynı hızda.
İlk 10.000 kayıttta gayet hızlı fakat giderek yavaşlıyor işlem...
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Sorun benim Veritabanındaki kodlamadaymış arkadaşlar(bunu unutmuşum), hareket dosyasındaki değişimlerde(insert, update, delete) borç, ödeme ve bakiye alanlarında sum işlemi yaptığı için yavaş çalışıyormuş
Teşekkürler.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen Kuri_YJ »

Selamlar,

Bir de aklınızda bulunsun, birkaç bin kayıtta bir Commit Edin. Ayrıca progressbarı her kayıtta bir position'ını değiştirmeyin. Ekrana döndüğünüzde sizi inanılmaz yavaşlatır. İşlemi atıyorum her %10'da bir Progressbarı refresh edin.

100,000 defa refresh etmek yerine toplamda 10 veya 20 defa refresh edin. Ben genelde %5 kullanırım. Yani bu tür bulk işlemlerde her kayıt için progressbarı refresh etmem, kayıt sayısını oranlarım, her bir %5'lik bölüm bitirildiğinde refresh ederim.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Kuri_YJ teşekkür ederim.
Toplu aktarım/kayıt için artık dataset/table yerine döngü içinde sql ile "insert into ........" kullanıyorum hız bakımından çok fark ediyor ve direk veritabanına yazıyor.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen Kuri_YJ »

Selamlar,

Eğer Firebird kullanıyorsanız, IBSQL isimli bir tane nesne var onu kullanın. O normal IBQuery'den de hızlı. Şu sırayı takip ederseniz daha hızlı sonuçlar elde edersiniz.

IBSQL Kullanın,
Sadece 1 defa prepare edin
Parametrelerin sırasını bilirseniz o sırada atamalarını yaparsınız. Bu ne demek, şu demek. Örnek ile açıklayayım.

Kod: Tümünü seç


  myIBSQL.SQL.Text := 'INSERT INTO TABLOM (STRINGALAN, TARIHALAN, INTEGERALAN) VALUES (:P1, :P2, :P3)' ;
  
  myIBSQL.Prepare ;
  for intI:=1 to 1000 do
  begin
    myIBSQL.Parameters[0].AsString := STRING_DEGISKENIM ;
    myIBSQL.Parameters[1].AsDateTime := TARIH_DEGISKENIM ;
    myIBSQL.Parameters[3].AsInteger := INTEGER_DEGISKENIM ;
    myIBSQL.ExecSQL ; // Duzelttiğim satır :) 
  end ;

Burada, ParamByName kullanırsanız daha yavaşlatır. Çünkü ParamByName dediğinizde, elinde fieldlara veya paremetereler arasında arayıp bulduğunda değişken atamalarını gerçekleştirir. Ama Parameters[] derseniz, doğrudan değişkene erişmiş olursunuz. Bu da belirli bir miktar hızlanma sağlar. Normalde bu farkedilecek bir ayrım değildir. Atıyorum bu size 1 mili saniye kazandırsa, bir şeyi bir milyon kez tekrarladığınızda bu 1 mili saniye, 1000 saniyeye tekabül eder ;)

Yani, hem prepare'den, hem parametre erişimlerinde 1 mili saniye kurtarsanız işin rengi değişir..

Umarım açıklayıcı olmuştur.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Buna göre insert into sql kodunu sadece bir defa yazıp, parametreli kısmı döngü içinde kullanıyoruz, peki
myIBSQL.execute kodunu nereye yazacağız, döngü içine mi yoksa dışına mı
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Kayıt aktarımındaki süre

Mesaj gönderen freeman35 »

sana kalmış bir şey
if intI mod 10 = 0 then begin execute; sql.clear; end;
her 10 eklemeden sonra execute eder, sayı sana kalmış. Burda unutmaman gereken döngü bittiğinde ilk önce sql oluşturulduysa son kez execute etmek ve transaction ı commit etmek.
herkesin yoğurt yeme şekli farklı olacağından ben muhtelif yerlere hata kotrolü koymadan duramam, uzun işlemlerde hata olasılığı hep gözönünde olmalı.
Ayrıca bunu neden illaki server dan terminale veriyi çekip ardındanda tekrar yazması için veriyi servre'a gönderiyorsun ? ben olsam bir stored procedure yazarım, buna sadece parametreleri gönderirim, bana sadece hata ouşursa exception döndürtürdüm

hata benim :S yukarıda yazdığım mantığı, bir script oluşturup, yani alt alta insert cümlelerini value ları eklemek(parametre olarak değil) sureti ile oluşturulursa kullanılabilir.
Adnan'ın yazdığı kodda, benim yazdığım satır sadece commit için kullanılabilir. her satırdan sonra commit edilirse transaction mantığının bir anlamı kalmaz, Transaction commit, veri bloğu oluşturup, bunu esas olan bütün veriye blok halinde işlemek için kullanılır, her post un arkasından commit yapmak, kurguda yanlış yapmak olur.
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 !!!
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen Kuri_YJ »

Selamlar Düzeltmeyi yapıyorum :) Yanlışlık var :)
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Düzeltmeyi bekliyorum :)
50 kayıtta bir execute yapsak sıkıntı olurmu ?
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen Kuri_YJ »

ohooo çoktan yaptım source'a tekrar bakın.

Execute öyle 50 kayıtta bir filan olmaz, her kayıt işi için 1 kere execute edin, transactionın commitini belli aralıklarla yapın.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Teşekkür ediyorum, A.R.O.
Bende zaten her kayıtta execute yapmıştım
Peki 50 kayıtta bir commit uygun mudur ?
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen Kuri_YJ »

Selamlar,

Commit'i bence Yuzdelik dilimlere göre yapın. Yani duruma göre, commit yapın. 100,000 kayıt için %10'dan desek, her 10,000 Kayıtta bir yapmış olursunuz. 50,000 için her 5,000 kayıtta bir yapmış olursunuz. 50 kayıtta bir, bulk işlemlerde çok efektif olmaz. Dediğim gibi yüzdelik dilimlere göre yaptırırsınız. %5 veya %10'da bir commit yaparsınız. Ben öyle tercih ediyorum.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Kayıt aktarımındaki süre

Mesaj gönderen White Rose »

Teşekkürler arkadaşlar, kayıt işlemi şimdi daha iyi. :bravo:
Cevapla