Kayıt aktarımındaki süre
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Kayıt aktarımındaki süre
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.
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.
Re: Kayıt aktarımındaki süre
A.S.
IBTable pek kullanışlı bir component değildir. IBDataset veya IBQuery componenti ile deneyin.
Kolay gelsin.
IBTable pek kullanışlı bir component değildir. IBDataset veya IBQuery componenti ile deneyin.
Kolay gelsin.
- 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
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...
İlk 10.000 kayıttta gayet hızlı fakat giderek yavaşlıyor işlem...
- 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
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.
Teşekkürler.
Re: Kayıt aktarımındaki süre
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
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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
- 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
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.
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.
Re: Kayıt aktarımındaki süre
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.
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
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 ;

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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
- 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
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ı
myIBSQL.execute kodunu nereye yazacağız, döngü içine mi yoksa dışına mı
Re: Kayıt aktarımındaki süre
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.
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 !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: Kayıt aktarımındaki süre
Selamlar Düzeltmeyi yapıyorum
Yanlışlık var 


Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
- 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
Düzeltmeyi bekliyorum 
50 kayıtta bir execute yapsak sıkıntı olurmu ?

50 kayıtta bir execute yapsak sıkıntı olurmu ?
Re: Kayıt aktarımındaki süre
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.
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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
- 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
Teşekkür ediyorum, A.R.O.
Bende zaten her kayıtta execute yapmıştım
Peki 50 kayıtta bir commit uygun mudur ?
Bende zaten her kayıtta execute yapmıştım
Peki 50 kayıtta bir commit uygun mudur ?
Re: Kayıt aktarımındaki süre
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
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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
- 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
Teşekkürler arkadaşlar, kayıt işlemi şimdi daha iyi. 
