SQL Server veritabanı performans optimizasyonu

SQL Veritabanı Performansını Artırmanın 10 Yolu

SQL Server (Microsoft SQL Server) veritabanı performansını artırmanın en etkili yolu, donanım eklemeden önce sistemin nerede beklediğini ölçmektir. “Sistem yavaşladı” şikâyeti geldiğinde ilk refleks genellikle sunucuya RAM veya CPU eklemek olur. Bu bazen işe yarar, çoğu zaman da problemi birkaç ay erteler. Kalıcı çözüm, yavaşlığın nerede olduğunu ölçmekle başlar.

Aşağıda, sahada en sık karşılaştığımız ve en yüksek getiriyi sağlayan on başlığı sıraladık. Bu adımların çoğu, sunucuya tek bir kuruş harcamadan, sadece doğru ölçüm ve yapılandırmayla uygulanabilir.

10 Yöntemin Özet Tablosu

#YöntemNe Zaman ÖncelikliMaliyet
1Bekleme istatistikleri (wait stats)Her zaman — teşhisin ilk adımıÜcretsiz
2En pahalı sorguları bulmaBelirli saatlerde yavaşlama varsaÜcretsiz
3İndeks düzenlemeTablo taraması / yavaş sorgular çoksaÜcretsiz
4İstatistik güncellemeYanlış sorgu planı seçiliyorsaÜcretsiz
5İndeks bakımını otomatikleştirmeParçalanma oranı yüksekseÜcretsiz (Ola Hallengren)
6tempdb yapılandırmasıYoğun geçici tablo/sıralama kullanımı varsaÜcretsiz
7Bellek (max server memory) sınırlamaAynı sunucuda başka servis varsaÜcretsiz
8Disk ayrımı (veri/log/yedek)Disk G/Ç bekleme süreleri yüksekseDonanım gerektirebilir
9Raporlama yükünü ayırmaOLTP + raporlama aynı sunucudaysaOrta (ek sunucu/replika)
10Sorgu/uygulama tarafı düzeltmeleriKod seviyesinde tekrar eden hatalar varsaGeliştirme emeği

1. Önce ölçün: bekleme istatistikleri (wait stats)

SQL Server, ne beklediğini size söyler. Sunucu diskte mi, kilitte mi, CPU’da mı, bellekte mi bekliyor — bunu bilmeden yapılan her müdahale tahmindir.

SELECT TOP 20
    wait_type,
    wait_time_ms / 1000.0 AS wait_time_sn,
    waiting_tasks_count
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','SLEEP_TASK','BROKER_TASK_STOP',
                        'XE_TIMER_EVENT','SQLTRACE_INCREMENTAL_FLUSH_SLEEP')
ORDER BY wait_time_ms DESC;

PAGEIOLATCH_* yoğunsa disk veya eksik indeks, LCK_M_* yoğunsa kilitlenme, CXPACKET/CXCONSUMER yoğunsa paralellik ayarları, RESOURCE_SEMAPHORE görünüyorsa bellek baskısı sinyali verir. Bu DMV’nin tüm alanlarının resmi tanımı için Microsoft’un sys.dm_os_wait_stats dokümantasyonuna1 başvurabilirsiniz.

2. En pahalı sorguları bulun

Yükün büyük kısmını genellikle birkaç sorgu üretir. Query Store (SQL Server 2016 ve üzeri) bunu görmenin en pratik yoludur; alternatif olarak sys.dm_exec_query_stats üzerinden toplam CPU ve okuma bazında sıralama yapılabilir. Tek bir rapor sorgusunu düzeltmek, bazen tüm sunucuyu rahatlatır.

3. Eksik ve gereksiz indeksleri düzenleyin

Eksik indeks tablo taramalarına, fazla indeks ise her INSERT/UPDATE işleminde ek maliyete yol açar. sys.dm_db_missing_index_details önerilerini körü körüne uygulamayın — bunlar öneri değil, ipucudur. Kullanılmayan indeksleri de sys.dm_db_index_usage_stats ile tespit edip temizleyin.

4. İstatistikleri güncel tutun

Sorgu iyileştirici (query optimizer) kararlarını istatistiklere göre verir. Bayat istatistik, doğru indeks varken bile yanlış plan seçilmesine neden olur. Büyük tablolarda otomatik güncelleme eşiği geç tetiklenebildiği için, planlı istatistik güncellemesi şarttır.

5. İndeks bakımını otomatikleştirin

Parçalanma (fragmentation) oranına göre yeniden düzenleme (reorganize) veya yeniden oluşturma (rebuild) işlemleri, bakım penceresinde otomatik çalışmalıdır. Ola Hallengren bakım çözümü bu iş için yaygın kabul görmüş, ücretsiz ve güvenilir bir standarttır.

6. tempdb’yi doğru yapılandırın

tempdb, sıralama, geçici tablolar ve sürüm deposu için ortak kaynaktır ve darboğaz olmaya çok müsaittir. Çekirdek sayısına uygun sayıda (genelde 4–8) eşit boyutlu veri dosyası, hızlı bir disk ve makul bir başlangıç boyutu ciddi fark yaratır.

7. Bellek ayarlarını elle sınırlayın

max server memory varsayılan değerinde bırakılırsa SQL Server, işletim sistemini sıkıştırabilir. Sunucudaki diğer yüklere yer bırakacak şekilde üst sınır belirlenmelidir. Aynı sunucuda ERP uygulama servisi de çalışıyorsa bu ayar daha da kritiktir.

8. Diskleri ayırın

Veri dosyaları, log dosyaları ve yedekler mümkün olduğunca farklı disk/volume üzerinde olmalıdır. Log yazımı sıralı ve gecikmeye duyarlıdır; veri okumasıyla aynı diski paylaşması performansı doğrudan etkiler. Günümüzde en yüksek getirili tek donanım yatırımı, hâlâ NVMe/SSD’ye geçiştir.

9. Raporlama yükünü ayırın

Ağır analitik raporların işlem (OLTP) veritabanı üzerinde çalışması, gün içinde herkesi etkiler. Read-only replika, gece beslenen bir raporlama veritabanı veya ayrı bir BI katmanı bu yükü ana sistemden çıkarır. ÇAP Teknoloji’nin BI/veri analitiği danışmanlığında tam olarak bu ayrım esas alınır — raporlama, üretim veritabanının performansını hiçbir zaman riske atmamalıdır.

10. Sorgu ve uygulama tarafını gözden geçirin

  • SELECT * yerine yalnızca gerekli kolonlar
  • WHERE koşulunda kolon üzerinde fonksiyon kullanmaktan kaçınma (indeks devre dışı kalır)
  • Parametre veri tipi uyumsuzluğunun yol açtığı örtük dönüşümler (implicit conversion)
  • Satır satır işlem yapan döngüler yerine küme tabanlı (set-based) yazım
  • Uzun süre açık kalan işlemler (transaction)

Sıkça Sorulan Sorular

SQL Server performans sorununu donanım eklemeden çözmek mümkün mü?

Çoğu zaman evet. Sahada karşılaşılan yavaşlıkların büyük kısmı, eksik/gereksiz indeks, bayat istatistik veya yanlış tempdb yapılandırması gibi donanımla ilgisi olmayan nedenlerden kaynaklanır. Donanım yatırımı, ancak ölçüm sonrası darboğazın gerçekten kaynak yetersizliği olduğu doğrulandığında anlamlıdır.

Wait stats analizine ne sıklıkla bakılmalı?

Kritik sistemlerde haftalık bir rutin olarak izlenmesi idealdir. Ayrıca sunucu yeniden başlatıldığında sayaçlar sıfırlandığı için, bir performans sorunu sonrası yapılan analizde “ne zamandan beri” biriktiğine dikkat edilmelidir.

İndeks eklemek her zaman performansı artırır mı?

Hayır. Her ek indeks, okuma performansını iyileştirirken INSERT/UPDATE/DELETE işlemlerine ek maliyet bindirir. Bu yüzden sys.dm_db_missing_index_details önerileri körü körüne değil, gerçek sorgu yüküyle birlikte değerlendirilmelidir.

Küçük bir işletme için bu adımların hepsi gerekli mi?

Hayır, önceliklendirme gerekir. Yukarıdaki özet tablodaki ilk 4 madde (ölçüm, sorgu analizi, indeks, istatistik) hemen her ölçekte en yüksek getiriyi sağlar; disk ayrımı veya ayrı raporlama katmanı gibi adımlar ise veri hacmi ve kullanıcı sayısı arttıkça öncelik kazanır.

Sonuç

Performans çalışması bir kerelik iş değil, döngüdür: ölç → en büyük darboğazı düzelt → tekrar ölç. Tek seferde her şeyi değiştirmek, neyin işe yaradığını anlamanızı da imkânsız hale getirir. Wait stats ve sorgu analizini SQL veritabanınızın sessiz risklerini ele aldığımız yazımızda daha geniş kapsamda inceleyebilirsiniz.

ÇAP Teknoloji olarak SQL Server danışmanlığı hizmetimizde ortamlarınızda bekleme istatistiği ve sorgu bazlı analiz yapıp, önceliklendirilmiş bir iyileştirme planı çıkarıyoruz. Sunucu yatırımı yapmadan önce mevcut sistemin ne kadar hızlanabileceğini görmek isterseniz ücretsiz teklif talep edebilirsiniz.

Kaynaklar:
1. Microsoft Learn, sys.dm_os_wait_stats (Transact-SQL) – SQL Server. learn.microsoft.com