Advantage'den MsSQL'e Veri Aktarım Hızı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Advantage'den MsSQL'e Veri Aktarım Hızı
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.
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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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.
-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Ş

Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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?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ü.
Ayrıca verileri SQL komutları ile çekip yine INSERT INTO sql komutu ile yazıyorum. Yazdıklarını biraz daha açarmısın?
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...
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...
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Hocam ben geç kaldımundefined yazdı:...OPENROWSET() fonksiyonu yardımı ile herhangi bir OLEDB/ODBC kaynağından veri...


Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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ğindesorgusu ile Access tablosu sorgulanıyor. Buna ek olarak kendim deneyerek C:\prog\data klasöründeki musteri.db paradox tablosunu aynı şekildesorgusu ile okuyabildim. Buna ek olarak kendi musteri tabloma paradox tablodan kayıtları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.

Kod: Tümünü seç
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';'';
Employees)
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
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
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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.
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.
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;
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.