SQL Server Kullanım Performansı

Eyl 06, 2013

Burada MS SQL sunucu versiyonundan bağımsız olarak ilişkisel veritabanları üzerinde çalışan uygulamaların sorgu performansını yükseltmeye yönelik bazı önemli noktalar vurgulanacaktır. Çok büyük verilerin olduğu veri evleri veya büyük analiz işlemleri için ise OLAP denen farklı yapılar kullanılması gerekmektedir, bu kavramın performansının çok daha farklı olduğu ve bu dokümanın konusu dışında kaldığı unutulmamalıdır.

  • SQL sunucusu veri dosyaları, sunucu sistemin sayfalama dosyası ( pagefile) ile farklı disk bölümlerinde bulunmalıdır. SQL veri dosyaları mümkünse SAN depolama ünitelerindeki RAID mimarisine sahip daha performanslı disklerde saklanmalıdır.

  • SQL sunucusunun kullanabileceği RAM boyutunun değiştirilmesi de performansı etkileyecektir. 4 GB'tan fazla RAM kullanabilmek için AWE özelliği etkinleştirilebilir. RAM miktarı ihtiyaca göre dinamik belirlenebileceği gibi, SQL sunucusuna rezerve de edilebilir.

  • İmleç (Cursor) çok fazla sistem kaynağı tükettiği için olabildiğince kullanılmamalıdır. Bunun yerine döngüler gibi alternatifler kullanılabilirse daha iyi olacaktır; fakat imleç kullanımı gerekli ise, tek yönde ilerleme yapılacaksa fast forward türünde imleç açmak performansı etkileyecektir. Ayrıca imlecin çalıştığı tabloda ekleme veya güncelleme yapılmayacaksa read only tipinden açılarak tabloya kilit koymaması sonucunda da işlemlerin hızlanması söz konusudur. Aynı imleç birkaç saklı yordam içinden de kullanılabilirse local değil global tanımlanmış olmalıdır. 

  • Sorgularda olabildiğince SQL sunucusu özellikleri kullanılarak verimin arttırılması önemlidir. Aşağıdaki iki ifade de aynı işi yapmasına karşın ikinci sorgu daha performanslıdır.

    select ID from tablo1 group by ID
    select distinct ID from tablo1
  • Sorgulardaki belirli bir verinin belirli bir küme içinde olup olmadığını kontrol etmek istersek IN yerine EXISTS kullanmak daha performanslı olacaktır. Aşağıdaki iki ifade de aynı işi yapmasına karşın ikinci sorgu daha performanslıdır.

    select ID from tablo1 where ID IN  (Select ID from tablo2)
    select ID from tablo1 where exists (Select ID from tablo2 where ID = tablo1.ID)


  • Sorgularda geçici tablo kullanmak yerine türetilmiş (derived) tablo kullanmak daha performanslıdır. Aşağıdaki ikinci sorgu örneği daha hızlı çalışacaktır. 

     select ID INTO #gecici from tablo1            select ID from #gecici
     select ID from (select ID from tablo1)derivedtbl


  • Yapılacak işlemler için, olabildiğince saklı yordam (stored procedure), görüntü (view), indeks (index) gibi SQL sunucusu özelliklerini kullanmak daha verimli olacaktır; çünkü SQL sunucusu bu yapıların kullanımı durumunda kendi içinde optimizasyon yapabilmektedir.

  • SQL sunucusunda yazılan saklı yordamların başında set nocount on denmesi de performansı etkileyecektir. Bu sayede, işlemler sonucunda kaç satırın etkilendiği bilgisi ekrana yazılmayarak işlem hızlanacaktır. 

  • SQL sunucusunda oluşturulan indeksler sürekli verileri değişmeyen tablolar için yapılmalıdır. Sürekli verilerinn güncellendiği bir tablodaki indeks, performansı arttırmaktan fazla azaltabilir; çünkü her bilgi güncellemesinde SQL sunucusu yeniden indeks oluşturmaya çalışacaktır.

  • Büyük veri taşıyan tablolardan yapılacak sorgular işlemleri oldukça yavaşlatabilir. Mümkünse bu sorgular en az sayıda olmalıdır. Örneğin; büyük bir tabloya yapılacak eklemeler öncesinde kaydın tabloda olup olmadığının kontrolü yapılıyorsa, bu kontrol yapılmayıp işlem bitince tekrarlamaların ayrıca yok edilmesi performansı etkileyebilecek bir yöntemdir.

  • SQL sunucusundaki indekslerin bazen yeniden oluşturulması gerekebilir. Bu durumda dbcc indexdefrag komutu kullanılabilir.

  • SQL sunucusunun performansını izlemek için SQL Profiler veya Performance Monitor gibi grafik izleme arayüzleri kullanılabileceği gibi aşağıdaki komutlar da kullanılabilir

    sp_configure
    dbcc sqlperf(waitstats)
    dbcc sqlperf(lrustats)
    dbcc sqlperf(umsstats)
    sp_who
    sp_lock
    sp_trace_create
    sp_trace_setevent
    sp_trace_setfilter
    sp_trace_setstatus
    sp_trace_generateevent
    sqldiag
    Sorgularla birlikte SET STATISTICS IO, SET STATISTICS TIME kullanımı vb..
    Dbcc showfilestats
    Dbcc memobjlist
    Dbcc memorystatus
    Sp_blockinfo