6 Ağustos 2013 Salı

Entity Framework Vs Sql Execute Vs Linq To Sql Insert 100.000 Data Performans Test

entity framework linq to sql

Merhaba arkadaşlar bu yazımda basit bir tablo yapısına entity framework, linq to sql ve sql query string execute metodunu kullanarak 100.000 adet kayıt işleyip performanslarını karşılaştıracağız.


Geliştirme ortamı : Visual Studio 2010

Programlama dili: C#

Sql Server Versiyonu: 2005

.Net Framework Versiyonu : 4

Kullanılan Bilgisayar : Hp pavillion dv7 2270us

İlk olarak sqlclient isimuzayında bulunan SqlConnection ve SqlCommand nesnesini kullanarak klasik string sql insert cümlesi oluşturup veritabanımıza execute ederek işlem yapacağız. 


Kullandığımız Kodlar:


        static void sqlexecute(string kod)
        {
            Console.WriteLine(kod + " İşlemi Başlatmak için Herhangi Bir Tuşa Basınız.");
            Console.ReadKey();
            Console.WriteLine(kod + " İşlem Başlangıcı : {0}", DateTime.Now.ToLongTimeString());
            SqlConnection cnn = new SqlConnection("Data Source=NSSOFTWAREPC;Initial Catalog=testdb;Integrated Security=True;MultipleActiveResultSets=True");
            cnn.Open();
//bir sqlconnection nesnesi oluşturduk ve bağlantıyı açtık.
            long t1 = DateTime.Now.Ticks; //işlem başlamadan önce o anın zaman değerini long bir değişkene atadık.
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cnn;
            int i = 0;
            for (i = 0; i < 100000; i++) //100000 lik döngü
            {
                cmd.CommandText = "Insert Into Persons(Name,Surname,BirthDate,PersonelGroup) values('"+ string.Format("{0}. ad", i) +"','"+ string.Format("{0}. soyad", i) +"','"+ string.Format("{0:00}/{1:00}/{2}",DateTime.Now.Month ,DateTime.Now.Day,DateTime.Now.Year)   +"',2  )";

                cmd.ExecuteNonQuery();
//sql command nesnesi oluşturduk ve nesnemizin connection nesnesini belirttik daha sonra insert işlemi için kullanacağımız sql stringi oluşturduk ve command nesnemizin commandtext özelliğine aktardık ve son olarak command nesnemizin ExecuteNonQuery() metodunu kullanarak komutların  veritabanına gönderilmesini sağladık
            }

            Console.WriteLine(kod + " Eklenen Kayıt Sayısı : {0}", i);
            long t2 = DateTime.Now.Ticks; // işlem sonundaki zaman değerini long değişkenimize atadık.

            TimeSpan ts = new TimeSpan(t2 - t1); //timespan nesnesi oluşturup tick değerini atadık.
            cnn.Close();
            Console.WriteLine(kod + " İşlem Süresi :  {0:00}:{1:00}:{2:00}.{3:000}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            Console.WriteLine(kod + " İşlem Bitişi : {0}", DateTime.Now.ToLongTimeString());
            Console.ReadKey();
        }



İşlem Sonucu : 

100.000 adet kayıt veritabanına işlendi 

Süre: 00:01:06.356   bir dakika altı saniye üçyüzellialtı milisaniye.


Şimdi Entity Framework kullanarak işlem yapalım.

Kullandığımız Kodlar:


     static void entity(string kod)
        {
            Console.WriteLine(kod + " İşlemi Başlatmak için Herhangi Bir Tuşa Basınız.");
            Console.ReadKey();
            Console.WriteLine(kod + " İşlem Başlangıcı : {0}", DateTime.Now.ToLongTimeString());

            testdbEntities testentity = new testdbEntities();
            testentity.Connection.Open();
//entity nesnemize ait connection bağlantımızı açıyoruz.
            long t1 = DateTime.Now.Ticks;

            int i = 0;
            for (i = 0; i < 100000; i++)
            {
                Persons pe = new Persons() { BirthDate = DateTime.Now, Name = string.Format("{0}. ad", i), Surname = string.Format("{0}. soyad", i), PersonelGroup = 2 };   //yeni bir persons oluşturup değerleri atıyoruz.
                testentity.Persons.AddObject(pe);
//AddObject(entity) metodunu kullanarak entity kalıbımıza yeni persons u ekliyoruz.
                testentity.SaveChanges();
//yapılan değişişlikleri veritabanına gönderiyoruz
            }

            Console.WriteLine(kod + " Eklenen Kayıt Sayısı : {0}", i);
            long t2 = DateTime.Now.Ticks;

            TimeSpan ts = new TimeSpan(t2 - t1);
            testentity.Connection.Close();
            Console.WriteLine(kod + " İşlem Süresi :  {0:00}:{1:00}:{2:00}.{3:000}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            Console.WriteLine(kod + " İşlem Bitişi : {0}", DateTime.Now.ToLongTimeString());
            Console.ReadKey();
        }


İşlem Sonucu : 

100.000 adet kayıt veritabanına işlendi 

Süre: 00:02:32.010   iki dakika otuziki saniye on milisaniye.


Şimdi Linq To  Sql kullanarak işlem yapalım.

Kullandığımız Kodlar:


 static void linqtosql(string kod)
        {
            Console.WriteLine(kod + " İşlemi Başlatmak için Herhangi Bir Tuşa Basınız.");
            Console.ReadKey();
            Console.WriteLine(kod + " İşlem Başlangıcı : {0}", DateTime.Now.ToLongTimeString());

            DataClasses1DataContext ds = new DataClasses1DataContext();
            ds.Connection.Open();

            long t1 = DateTime.Now.Ticks;

            int i = 0;
            for (i = 0; i < 100000; i++)
            {
                Person pe = new Person() { BirthDate = DateTime.Now, Name = string.Format("{0}. ad", i), Surname = string.Format("{0}. soyad", i), PersonelGroup = 2 };
                ds.Persons.InsertOnSubmit(pe);
                ds.SubmitChanges();
            }

            Console.WriteLine(kod + " Eklenen Kayıt Sayısı : {0}", i);
            long t2 = DateTime.Now.Ticks;

            TimeSpan ts = new TimeSpan(t2 - t1);
            ds.Connection.Close();
            Console.WriteLine(kod + " İşlem Süresi :  {0:00}:{1:00}:{2:00}.{3:000}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            Console.WriteLine(kod + " İşlem Bitişi : {0}", DateTime.Now.ToLongTimeString());
            Console.ReadKey();
        }


İşlem Sonucu : 
100.000 adet kayıt veritabanına işlenemedi  (vakit kalmadı)
işlenen kayıt sayısı 53.000.
İşlem Başlama Zamanı: 16:58:55
53.000 adet kayıt işlemi bitiş saati: 17:17:23
yaklaşık 28 dakika oldu ve hala 53.000 adet kayıt yapılmıştı.

ÖNEMLİ NOT: HER İŞLEMDEN SONRA VERİTABANINDAKİ KAYITLAR SİLİNMİŞ VE ŞARTLARIN EŞİT OLMASI SAĞLANMAYA ÇALIŞILMIŞTIR

SONUÇ:

Sonuç olarak klasik sql cümlesiyle yapılan işlem entity framework e göre 2 kat daha hızlı, linq to sql e göre 60 kat daha hızlı işlem yaptı. Evet yapısal olarak orm araçları programcıya birçok kolaylık sağlamasına rağmen performans olarak daha yavaş. Bunun sebebi orm araçları veritbanı işlemleri kontrollü bir şekilde gerçekleştirdiği için ve OOP kalıbında işlem yaptıktan sonra veritabanına bu değişiklikleri gerçekleştirdiği için bir performans kaybı oluşmaktadır. Ancak projelerin geliştirilmesi ve projelerdeki hata kontrolü güncellenebilirlik proje süresi konusunda ORM araçları daha sağlıklı ve daha hızlı geliştirme olanaklarını bize sağlamaktadır.
Umarım bu yazımda veritabanı kayıt işleminde kullanılan araçların performans değerleriyle ilgili fikir oluşmasını sağlamışımdır.
Son Olarak Colsole çıktısını paylaşmak istiyorum.

.Net Developer
Malik Bakacak

1 yorum:

  1. test için tşk. ne kadar performans farkının olduğunu öğrendik.

    YanıtlaSil