Bir dosyadaki verileri(~100MB) database’e atmak gibi basit bir operasyon yapmam gerekiyordu. Dosya “tab delimited” bir dosya ve yaklaşım 45 civarı da kolon var ve kolonlarda dolu. En basit ve ilk akla gelen yöntem satır satır bu kayıtları database’e atmak olacaktır. Ancak bu kadar çok veriyi atarken oluşabilecek “time-out”lardan dolayı, hangi kayıdın atıldığı ya da atılmadığını yönetmek sonra daha zor olacaktır.Ki bu kadar büyük bir dosyayıda satır satır okumak IO olarakta, dikkat edilmediğinde gereksiz bir maliyet. Satır satır database’e kayıt etmekte database server’ı gereksiz yere yoracaktır zaten.
Bu operasyon bir kereliğine yapılmayacak ve başka zamanlarda da çalışabilecek bir yapı gerektirdiğinden Windows servis şeklinde tasarladık. Import edilen kayıtlardaki bir “flag”e göre, ya silme,ya güncelleme,ya da ekleme işlemi yapılacak.
Tüm bunları göz önüne aldığımızda, dosyadan parça parça okuyup, okunan bu verileri “batch insert” şeklinde database’e atmak en mantıklı yöntem. Kaçar kaçar atılacağını bir kaç deneme ile en optimumu bularak ayarlayabilirsiniz. Ancak burada da bir sorun var. Veri sayısı çok fazla olduğundan bu işlem uzun sürecektir. Hem bundan dolayı,hemde bağlantı sorunlarından dolayı database’den bu işlemler sırasında hatalar almak mümkün. “Import” edilen verinin bir bütünlük sağlıyor olması ve ya hepsinin aktarılıyor ya da hiç birinin aktarılmıyor olması gerekliliğinden dolayı da bu hataları yönetebilmek oldukça zor. Bundan dolayı “import” işlemini 2 aşamalı olarak tasarladık. İlk aşamada parça parça okunan dosyadaki veriler temp bir tabloya aktarılmakta. Daha sonra bütün işi database server’ın üstüne yıkarak, bu “temp” tablodaki verileri dosyadaki flag bilgilerine göre orjinal tabloya aktarıyoruz.(Flag,A ise yeni kayıt,M ise update,D ise sil gibi) Zaman performansı olarak bu şekilde doruk noktasına ulaşabiliyoruz 😀
~100MB’lık veri yapısı bu uygulamada yaklaşık olarak 500.000 satıra denk gelmekteydi.(45 kolon ve kolonlar dolu) Bu bağlamda 500.000 kayıdın bir “transaction”da başka bir tabloya atılması ne kadar doğru bilemeyeceğim ama doğru index yapıları ile bu iş çok kolay olmakta.Burada doğru index yapılarının altını çizmek isterim flaglere ya da başka şeylere göre sorgulama gereği duyduğumuzda mutlaka o kolonlara index koymamız gerekmekte.
Büyük boyutlu dosyaları database’e atmak konusunda fikirleriniz,yöntemleriniz var ise paylaşırsanız çok sevinirim.