SELECT * Performans

Bu yazıda SELECT  * ifadesi ile Select , … ifadelerinin arasındaki farka değineceğiz.

Amacımız, tablomuz içerisinde yer alan veriyi en doğru ve en hızlı şekilde çekmektir aslında. Fakat çoğu zaman query ‘lerimiz istediğimiz performansı  verememektedir. Bu gibi durumlarda query ‘lerimizi incelediğimizde; amacının dışında data getirdiği ve sisteme gereksiz yük bindirdiği ortaya çıkmaktadır. Örneğin oluşturulacak ekranın veya hazırlanacak rapor için gerekli olan data yapısı tablodaki 3 kolon içerisindeki veriyi kapsar iken, biz bu gibi durumlarda en çok karşılaştığımız  ve performans kaybına neden olan SELECT *  kalıbını görmekteyiz.

Tablolarımız üzerinde SELECT * ile çektiğimiz  sorgularımızın sonucunda tablo üzerinde yer alan tüm kolon verilerini çekmiş oluruz.

Bir tablo üzerinde 10 adet kolonun olduğunu düşünelim. Bize sadece işlemlerimiz için 3 kolon yeterli iken +7 kolon da gereksiz yere çekilmekte ve sisteme hem I/O , hem CPU hem de Network maliyeti olarak yansımakta. Bunun yanısıra çoğu zaman indeksleri kullanmadığından Table Scan veya Key Lookup gibi Query Optimizer ‘a yük bindirici işlemler ile EXECUTE süresini uzatarak son kullanıcıya geç cevap döndürmektedir.

Sonuç olarak; yapacağımız işlemin algoritmasını çıkartıp, nerede ,ne şekilde ,nasıl ve hangi veriyi kullanacağımızı belirleyip o verileri çekerek işlem maliyetini azaltıp performansımızı daha da arttırabiliriz.

SELECT * ifadesi yerine SELECT < Column_Name1 >, < Column_Name2 > … şeklinde kullanmalıyız.

ÖRNEK :

Aşağıda , AdwentureWorks2012 veritabanı üzerinden  SELECT * ifadesi ve SELECT ifadelerinin örnekleri ve karşılaştırılması yer almaktadır.

1

Şekil 1.0 SELECT * ifadesi Execution Plan

2

Şekil 1.1 SELECT  * ifadesi istatistik değerleri

3

Şekil 1.2 SELECT   ifadesi Execution Plan

4

Şekil 1.3 SELECT   istatistik değerleri

Örneğimizi sayısal değerlere dökecek olursak ;

10 kolonlu tablomuzda 6 adet integer , 3 adet varchar ve 1 adet  datetime veri tipine sahip kolon olduğunu düşünelim ve bize lazım olan kolonlar 2 adet integer ve 1 adet varchar veri tipinde olduğunu düşünecek olursak.

SELECT * ifadesi ile işlemlerimizi gerçekleştirdiğimizde  ;

Data Type

Storage

integer 4 byte
varchar 2 byte + karakter sayısı
datetime 8 byte

Hesaplayacak olursak ;

Bir kerelik Select * ifadesi ile bu tablo üzerinden işlem yaptığımızda ;

İnteger = 4 * 4 = 16 byte

Varchar =  12 * 2 = 24 byte

Datetime =  8 * 1 = 8 byte

Toplam => 16 + 24 + 8 = 48 byte ( sadece bir satır için )

1000 satır için ; 48 * 1000 = 48 000 byte o da ortalama 46.87 KB demektir.

Bu işlemi günde 2000 kişi ortalama 3000 kere EXECUTE ettiğini düşünürsek, maliyeti siz hesaplayın.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: