Konu oldukça basit.5 alanlı ve 1 milyon kayıtlık bir veritabanımız var.Amaç bu veritabanındaki verileri okuyup bir tabloya en hızlı şekilde hangi yöntemle aktarabiliriz bunun testini yapıcaz...
Malzemeler :
SQL Server 2005
Vb.Net 2010 Prof.
(Veritabanı)5 Alanlı 1 Milyon Adet Kayıt
Bir adet Datagridview
Bir adet zaman ölçer
Bir adet buton
Yukarıdaki kişisel bilgiler uydurmadır.
TEST-1 (ADO)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 15,1 saniyede işlem bitmektedir.
Bu testte oldukça eski olan ADODB yolunu kullandık.Adapter işlemi için OLEDBAdepter kullandık.Veri sağlayıcı olarak da yine OLEDB kullandık.Birde direkt OLEDB yolunu kullanarak bir deneyelim.
TEST-2 (OLEDB)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 12,8 saniyede işlem bitmektedir.
Bu testte OLEDB yolunu kullanarak ADODB ye göre yaklaşık 2 saniye kadar bir performans artışı sağladık.Birde SQLConnection yoluna bakalım.
TEST-3 (SQLCONNECTİON)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 13,1 saniyede işlem bitmektedir.
Bu testte SQLConnection yolunu kullandık ancak OLEDB yoluna göre 0,3 saniyelik önemsiz bir fark görülmekte.Önemsiz diyorum çünkü bu değerler ortalama değerler ve zaman zaman OLEDB nin önüne geçtiğide oldu.
Performansı etkileyen bir konuda Datatablo nesneleridir.Mesela "Dataset" nesnesi bu uygulama için pek uygun değil.Çünkü yukarıda yazılmış olan Tablo.Tables(0) kodundan da anlaşılacağı üzere aslında dataset nesnesi bir tablo için değil birden çok tablo üzerinde aynı anda çalışmayı sağlayan bir nesnesir.
TEST-4 (DATATABLE)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 10,5 saniyede işlem bitmektedir.
Datatable kullanmak Dataset öğesine göre bize yaklaşık 3 saniyelik bir kazanç sağladı.
TEST-5 (DATAREADER)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 11,1 saniyede işlem bitmektedir.
Bu teste Dataadapter yerine Datareader kullandık.Ama yaklaşık yarım saniyelik bir parformans düşüşü yaşandı.Ancak burda farklı olarak Tablo.Load(rs) kodunu kullandığımızı görüyorsunuz çünkü datareader için "fill" özelliği bulunmamaktadır.Yani demek istediğim bu yavaşlama Datareader dan mı yoksa Tablo.Load dan mı belli değil.Bu sebeple kendi Fill yöntemimizi kendimiz oluşturmaya çalışalım...
TEST-6 (DATAREADER-2)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 11,4 saniyede işlem bitmektedir.
Bu yöntem aslında tartışmalı.Sonuçta performansta gözle görülür bir fark yok.Yalnız burda asıl sorun verilerin tabloya aktarımı esnasında meydana gelen performans düşüşü.Çünkü hem fill yönteminde hemde yukarıda yaptığımız örnekte veriler tablolara tek tek aktarılmakta.Burda denediğimiz tablo yapıları bir datagrid olmasa ve sanal tablo yapıları da olsalar sonuçta klasik tabloların bazı özelliklerini taşımaktalar.Dolayısı ile tablolara veri yüklenirken bu özellikler çalışmakta ve milisaniyelik gereksiz işlemler bile 1 milyonluk kayıtta birkaç saniyeye çıkmaktadır.O zaman bize asıl lazım olan şey üzerinde hiçbir özellik bulunmayan ve içerisinde ham verileri taşıyabilecek klasik tablo yapılarından uzak taslak bir tablo kullanmak.Bu sayede hiç zaman kaybı yaşamadan verileri daha hızlı tabloya aktarabiliriz.Bir değişken topluluğu ile tablo şeklinde bir nesne inşa edersek o zaman tüm verileri onun üzerine daha hızlı aktarabiliriz.
TEST-7 (ARRAYLİST)
Çalışan programlar stabil tutularak 10 Adet denemenin ardından ortalama olarak 3,9 saniyede işlem bitmektedir.
Bu testte bir Arraylist ile taslak bir tablo hazırlayarak gerçekten 7 saniyeye yakın oldukça iyi bir farkla performans artışı sağladık.