SELECT * Kullananların Başına Gelenler

Merhaba Arkadaşlar ,

Bu gün ki yazımda sizlere SELECT  * ifadesi ile Select <Column_Name1>,<Column_Name2> … ifadelerinin arasında ki farkı anlatacağım .

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.

Anlaşılacağı üzere tablomuz üzerinde 10 adet kolonun olduğunu düşünelim ve bize sadece işlemlerimiz için 3 kolon yeterli iken +7 kolonda gereksiz yere çekilmekte ve sisteme hem IO , 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 <Column_Name> ifadelerinin örnekleri ve karşılaştırılması yer almaktadır.

SELECT  *
FROM    Sales.SalesTerritory AS st
WHERE   st.[Name] = 'Australia';

 

1

Şekil 1.0 SELECT * ifadesi Execution Plan

2

Şekil 1.1 SELECT  * ifadesi istatistik değerleri

SELECT  [Name] ,
        TerritoryID
FROM    Sales.SalesTerritory AS st
WHERE   st.[Name] = 'Australia';

 

3

Şekil 1.2 SELECT <Column_Name>  ifadesi Execution Plan

4

Şekil 1.3 SELECT <Column_Name>  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 !!!

 

NOT : varchar (10 olarak düşünürsek ve 10 karakter giriliş olsun .. )

 

İyi Çalışmalar.

Leave a Reply

Your email address will not be published. Required fields are marked *