Parametreli Stored Procedure Kullanımı ve Performans

Aralık 22, 2011

Genellikle tüm uygulamalarımızda eğer veri tabanı olarak mssql kullanılıyor ise stored procedureleri hepimiz kullanırız ,  iş hayatında gördüğüm kadarıyla özellikle yeni başlayan arkadaşlar stored procedure’ler ile sadece ekleme , silme ve güncelleme işlemleri yaptırmaktalar.Bugünkü konum stored procedure’lere parametre gönderip sorgu sonucunu almak ve .net tarafından klasik yöntemlerle tablo sorgulamakla stored procedure ile sorgulayıp sorgu sonucunu almak arasındaki performans farkları olacak.Anlaşılır bir yol izlemek için konuyu oldukça basit bir örnek üzerinde anlatıyor olacağım.İlk olarak tek tablodan oluşacak veri tabanımızı local makinemizde oluşturalım veri tabanımızın adı TScope tek tablomuzun adı  ise Musteriler

 

 

 

 

Tablomuzun alanları bu şekildedir ID alanımızı identity olarak belirleyelim.Klasik sorgulama yöntemleri ile  stored procedure kullanarak sorgulayıp sorgu sonucunu almak arasındaki performans farkını anlayabilmek için şöyle bir senaryo izleyeceğiz sorgulamaların süresini biraz artıra bilmek için veri tabanımıza 15000 müşteri kaydı girelim daha sonra bu kayıtların hepsini uygulamamızın arayüzünde listBox kontrolünde kullanıcıya listeleyelim.Veri tabanımıza müşteri kaydı girmek için şu kodu çalıştıralım

 

 

 

 

 

 

Bu kadar kaydı tek tek elle giremeyeceğimiz için Gokhan Akgol ad ve soyadını sabit tutarak yanlarına o an döngü değerini yazdıralım  Gokhan1, Gokhan2, Gokhan3 gibi bir sonuc alıcaz.Sıra geldi bu tabloyu sorgulayacak stored proceduremizi yazmaya çok basit olarak yeni bir tane procedure oluşturalım veri tabanmızda ve şu kodları yazalım

 

 

 

 

 

MusterileriGetir adında bir tane procedure oluşturuyoruz tüm tabloyu sorgulayacağımız için içerisinde sadece 1 tane select cümlesi yer alıyor bu şekilde stored procedure’mizide ekleyelim.Veri tabanımızı oluşturduk sorgulayacağımız verileride ekledik stored procedure’mizide yazdıktan sonra Visual Studio’da bir win app. açalım uygulamamızın arayüzünde 2 şer tane button , label ve listBox bulunuyor olacak buton’ların ilk inden stored procedure ile sorgu sonucunu alıp ekrana getireceğiz 2. butonumuzda ise klasik sorgulama işlemi yapıp sonucu ekrana getireceğiz.Uygulamamızda kullanığımız using’ler

 

 

 

 

Global olarak ConnectionString’imizi ve zamanı hesaplamak için Stopwatch sınıfımızı tanımlayalım

 

 

 

 

Stored Procedure’mizi kullarak sorgulayacağımız 1. buton’un altındaki kodlarımızı yazalım

 

 

 

 

Global olarak tanımladığımız Stopwatch nesnemizi Start() method’u ile çalışmasını sağlıyoruz daha sonra using blog’u içerisinde SqlConnection’umuzu oluşturup bağlantımızı açalım.SqlCommand nesnesini oluşturduğumuz zaman normalde sorgumuzu yazdığımız kısma veri tabanında oluşturduğumuz stored procedure’mizin adını yazalım hemen 1 satır altında CommandType’imizin StoredProcedure olduğunu belirtiyoruz.Daha sonra sorgu sonucunu SqlDataReader nesnemize alıp listBox ‘ a satır satır müşteri adını ve soyadını yazdırıyoruz  GetString(index) ile SqlDataReader’ın içerisindeki verilere ulaşabiliriz.Burada dikkatinizi listBox’ın beginUpdate ve EndUpdate methodları çekmiş olabilir bu method’ları listBox ‘a çok fazla veri basacağımız zaman daha hızlı olması için kullanıyoruz.Son olarakta sw.Stop(); diyerek işimizin bittiğini Stopwatch nesnemizin değişkenine bildiriyoruz ve elimizde olşan zamanı milisecond cinsinden label’a yazdırıyoruz.Hemen 2. buton’umuzun kodlarınada bakalım

 

 

 

 

2. Buton’umuzda tek yaptığımız değişiklik veri tabanındaki stored procedure’yi kullanmayarak sorgumuzu burada yazmak ve DataTable nesnemize aktarmak olmuştur daha sonra döngü yardımı ile 2. listBox’ımıza yazdırdık.Yaptıklarımızı birde uygulama üstünde görelim ve sorgulama sürelerini karşılaştıralım.

 

 

 

 

Çok basit olarak 2 sorgulama arasındaki zaman farkını label’lara yazdırdık ve 15000 kayıtta hızları ortada,  bu kadar veri çok büyük iş akışlarını göz önüne aldığımız zaman fazlada sayılmaz aslında çünkü günümüz uygulamalarındaki veri tabanlarını düşündüğümüz zaman çok çok daha fazla tablo , alan ve veri ile karşı karşıya kalıyoruz bu açıdan bakıldığı zaman stored procedure’lerin önemi daha’da artıyor.Son olarak stored procedure’lere nasıl parametre gönderdiğimize bakalım

 

 

 

 

Stored Procedure’mizi bu şekilde tekrardan düzenleyelim @id procedure tarafında aldığımız parametremiz @id değerini tablomuzdaki ID alanına eşitliyoruz kod tarafında ise kullanımı şu şekilde

 

 

 

 

MusterileriGetir stored procedure’mizi tekrar’dan düzenlediğimiz için SqlCommand içerisinde onu kullanıyoruz ve CommandType’ımızın StoredProcedure olduğunuda belirttikten sonra stored procedure’imize parametre gönderebilmek için SqlParameter nesnesi oluşturuyoruz @id olarak değişkenimizi tanımlıyoruz daha sonra Value değerinden istediğimiz müşteri id sini procedure’mize parametre olarak gönderiyoruz bu sorgu sonucunda bize 100 id’ye sahip kullanıcının bilgileri gelecektir.Burada stored procedure’mizin adı MusteriGetir olsa daha açıklayıcı olacaktır bir önceki procedure üzerinde değişiklik yaptığımız için aynı ismi kullandık.İyi çalışmalar.

 

 

Kaynak Kodları Buradan İndirebilirsiniz

posted in C# by gokhan

Follow comments via the RSS Feed | Yorum yapın | Trackback URL

Leave Your Comment

*

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org