Advantage'den MsSQL'e Veri Aktarım Hızı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Advantage'den MsSQL'e Veri Aktarım Hızı

Mesaj gönderen cappy2005 »

Merhaba,

Advantage veritabanında bulunan ve 46300 satır kayıt içeren bir tabloyu MsSQL varitabanına aktarıyorum. Advantage bileşeni ile Advantagedaki tabloyu okuyup bir döngü içinde ve adoQuery ile MsSQL tablosuna yazıyorum arada hiçbir işlem yapmıyorum. Tüm işlemin sona ermesi yani 46300 satırı okuma ve yazma 3 dk. 18 sn. sürüyor.

Öncelikle bu tür fazla kayıtla uğraşan arkadaşlara sormak istiyorum bu süre normal mi? İkincisi ise bu süreyi nasıl daha aşağıya çekebilirim. Ayrıca okunan ve yazılan alanları minimuma çektim ve önce okuma işlemini bitirip daha sonra bir while döngüsü içinde okunmuş olan verileri yazıyorum. Tavsiyeleriniz ne olur? Bu sistemi daha da hızlandırmak nasıl mümkün olur.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Ben de SQLServer'da bu tür bir işlerle çok uğraştım ve bir öneride bulunayım.

-Eğer MSSQL'e aktardığın tablada triggerların varsa bunları disable yapmalısın. Trigger'la ilgili yapılacak işlemlerin yoksa ne mutlu yoksa bunun için servis yazmalısın. Tabi işlemden sonra bu triggerları aktif duruma getirmeyi sakın ihmal etme. Bu işlem hızda çok etkili.
(önce alter table [tabloadı] disable trigger [trigger adı] ile pasif yap
kayıt aktarımından sonra alter table [tabloadı] enable trigger [trigger adı] ile aktif yap)

Bana kullanmak nasip olmadı ama Bulk Insert denen çok hızlı bir yöntem var. Bunun nasıl kullanıldığını bilmiyorum, az uğraştım olmayınca da sıkılıp bıraktım. Sanırım bulk insert metodu için önce özel bir biçimde .txt dosyası çıkarıp sonra bu dosya direk MSSQL'e atılabiliyorMUŞ :) . Duyan ya da bilen varsa katkısını bekliyoruz.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

hızlı veri akışını için verileri MSSQL'e native bir bağlantı kurup verileri SQL komutu şeklinde yüklersen daha hızlı olur kanaatindeyim. Benzer şekilde oracle'a 350.000 kayıt girdim. 1 dakika felan sürdü.
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Mesaj gönderen cappy2005 »

mkysoft yazdı:hızlı veri akışını için verileri MSSQL'e native bir bağlantı kurup verileri SQL komutu şeklinde yüklersen daha hızlı olur kanaatindeyim. Benzer şekilde oracle'a 350.000 kayıt girdim. 1 dakika felan sürdü.
350.000 satır için 1 dk. çok iyi ben 46.300 satır için 3dk. bekliyorum. Tamolarak bahsettiğin native bağlantı nedir?

Ayrıca verileri SQL komutları ile çekip yine INSERT INTO sql komutu ile yazıyorum. Yazdıklarını biraz daha açarmısın?
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

INSERT INTO sql komutu ile yazıyorum.
bu kısım tamam. Native bağlantı dediğim ise ADO yada BDE kullanmadan direk dll yardımı ile bağlantı kurman. Mesala Oracle için ODAK, MySQL için Zeos kullanılabiliyor. Zeosda MSSQL desteğide var ama hiç denemedim.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Ara programa gerek duymadan, MSSQL'de bulunan OPENROWSET() fonksiyonu yardımı ile herhangi bir OLEDB/ODBC kaynağından veri import edebilirsin. Çok daha hızlı olacağını sanıyorum.
Eğer çok adımlı bir işlem ise stored procedure yazabilirsin. Eğer sadece direk kopyalama yapacaksan tek query ile bu işi halledebileceğini sanıyorum.
Kolay gelsin...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

undefined yazdı:...OPENROWSET() fonksiyonu yardımı ile herhangi bir OLEDB/ODBC kaynağından veri...
Hocam ben geç kaldım :) . Bu ne güzel bir özellikmiş öyle. Neyse hayırlısı olsun. Demekki yeteri kadar araştırmamışım o da benim cezam olsun :wink:
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Eğer Advantage ODBC sürücüleri yüklü ise SQL sorgusu ile direk aktarman OPENROWSET veya OPENDATASOURCE ile mümkündür. Mesela SQL Query Analyzer programından jet veya odbc sürücüleri kullanılarak Access veya Paradox tabloları sorgulanabiliyor. Bu sorguyu insert into biçimine dönüştürürsen herhalde en hızlı aktarmayı yöntemini kullanmış olacaksındır :) . Mesela SQL Server örneğinde

Kod: Tümünü seç

SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
        'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';'';
        Employees)
sorgusu ile Access tablosu sorgulanıyor. Buna ek olarak kendim deneyerek C:\prog\data klasöründeki musteri.db paradox tablosunu aynı şekilde

Kod: Tümünü seç

select * from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source="C:\prog\data";Extended Properties=Paradox 7.x;Persist Security Info=False')...musteri
sorgusu ile okuyabildim. Buna ek olarak kendi musteri tabloma paradox tablodan kayıtları

Kod: Tümünü seç

insert into (No,Ad,Soyad)
select mus.No,mus.Ad,mus.Soyad from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source="C:\prog\data";Extended Properties=Paradox 7.x;Persist Security Info=False')...musteri as mus
sorgusu ile istediğimiz alanlara göre tüm kayıtları ekleyebiliriz.

Not:Jet bağlantısı üzerinden paradox tablosu açılışı biraz yavaş olmaktadır. Bu gibi harici bağlantıların açılışı yavaş olabilir ama kayıt aktarma işlemi çok hızlı olmaktadır.

İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Mesaj gönderen cappy2005 »

Yardım için teşekkürler arkadaşlar ama ben Bulk insert metodunu kullanmaya çalışıyorum sanki o daha çok işimi görecek gibi, Advantage ODBC sürücüleri yüklü ve 187.300 satırı 12 sn. gibi bir sürede okuyor ardından şunu yapmaya çalışıyorum.

Kod: Tümünü seç

procedure TForm1.InsertMsSQL;
begin
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('BULK INSERT cappy.dbo.[BulkTest]');
    SQL.Add('FROM ''C:\test.txt''');
    SQL.Add('WITH {FIELDTERMINATOR = ''---'',ROWTERMINATOR = ''\n'',CODEPAGE = ''RAW''}');
    ExecSQL;
  end;
end;
ancak burada "Söz dizimi hatası veya erişim ihlali" şeklinde bir hata alıyorum. Bağlantıyı sa ile yapıyorum ve tüm yetkilerin verirldiğini denetledim. Söz dizilimini kontrol ettim onda da bir sorun görünmüyor.Sizin bir fikriniz var mı?

Ayrıca Advantage ODBC driver ile 187.300 kayıt okuma süresi 12 sn ancak bu işlem olurken ekrandada görsel bişeyler olması için bir label'a "RecordCount / RecNo" şeklinde o an işlenen satırı yazdırıyorum. Bu işlemi görebilmek için mecburen kodlar arasında Application.ProcessMessage kullanmak durumunda kalıyorum o zaman bu okuma zamanın 12 sn'den 54 sn'ye çıkıyor.Bunun için neler önerirsiniz. Yani hem işlemi görsel olarak göstereyim hemde arada bu kadar uzun bir bekleme zamanı olmasın istiyorum.
Cevapla