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