SQL Server'da Performans Sorunlarını Tespit Etmenin Pratik Yolları
Merhaba,
SQL Server performans sorunları genellikle sürpriz yapar: uygulama bir gecede yavaşlar, raporlar saatlerce çalışır, kullanıcılar şikayet eder ve geliştirici ekip sorunu nerede arayacağını bilemez. Bu yazıda sistematik bir yaklaşımla performans darboğazını nasıl bulacağınızı ele alacağız arkadaşlar.
Önce Semptomu Doğru Tanımlayın
Performans sorunu geniş bir kavram. CPU yüzde yüzde mi koşuyor? Disk okuma yazma mı yoğun? Belirli bir sorgu mu yavaş, yoksa tüm sistem mi genel yavaşladı? Bekleme istatistikleri bu soruların cevabını veriyor. sys.dm_os_wait_stats görünümü SQL Server'ın en çok nerede beklediğini söylüyor. CXPACKET bekleme tipi paralel sorgu sorununa, PAGEIOLATCH disk I/O sorununa, LCK_M kilitleme sorununa işaret ediyor. Semptoma göre araştırma yönünü belirlemek zaman kazandırıyor.
En Yavaş Sorguları Bulma
sys.dm_exec_query_stats dinamik yönetim görünümü en yüksek CPU veya süre tüketen sorguları sıralıyor. Bu görünümdeki total_worker_time sütununu execution_count'a böldüğünüzde ortalama CPU maliyetini görürsünüz. total_elapsed_time / execution_count ise ortalama çalışma süresini veriyor. Bu iki metriği birlikte değerlendirerek optimize etmeye en çok değer yaratacak sorguları önceliklendirebilirsiniz. Query Store açıksa bir önceki sürüm ile karşılaştırmalı performans analizi de yapabilirsiniz, bu özellikle son deployment sonrası gerilemeyi bulmak için çok kullanışlı.
Sorgu Planını Okumak
Yavaş sorguyu buldunuz. Şimdi ne yapacaksınız? Execution plan sorgunun nasıl çalıştığını adım adım gösteriyor. SSMS'de sorguyu seçip Include Actual Execution Plan ile çalıştırın. Kalın ok çizgileri büyük veri akışına işaret ediyor, bunları takip edin. Yüksek maliyet yüzdesine sahip operatörlere odaklanın. Table Scan ya da Index Scan gördüğünüzde eksik ya da uygunsuz indeks var demek. Index Seek çok daha verimli. Nested Loop, Hash Match ve Merge Join join operatörleri var; hangisi kullanılmış ve neden, bunu anlamak join optimizasyonu için kritik.
İndeks Stratejisi
Eksik indeksler performans sorunlarının büyük bölümünü oluşturuyor. sys.dm_db_missing_index_details görünümü SQL Server'ın kendi tespit ettiği eksik indeksleri listeler. Bu görünümde improvement_measure sütunu yüksek olanlara bakın. Ama tüm öneri verilen indeksleri oluşturmayın: her indeks yazma işlemini yavaşlatır ve disk alanı tüketir. Çok benzer indeksler birleştirilebilir. Öte yandan kullanılmayan indeksler sys.dm_db_index_usage_stats görünümünden tespit edilebilir; hiç kullanılmayan indeksleri kaldırmak bakım maliyetini düşürür.
Blocking ve Deadlock Analizi
Kilitleme sorunları sıklıkla gözden kaçıyor. sys.dm_exec_requests görünümünde blocking_session_id sıfırdan farklı olan satırlar bloke edilmiş oturumları gösteriyor. Kök nedeni bulmak için bloklayan oturumun beklediği nesneyi ve çalıştırdığı sorguyu inceleyin. Deadlock'ları izlemek için Extended Events ya da SQL Server Audit kullanın. Deadlock XML'ini parse ederek hangi iki işlemin birbirini beklediğini görebilirsiniz. Uzun süren işlemleri küçük transactionlara bölmek, okuma işlemlerinde READ COMMITTED SNAPSHOT izolasyon seviyesini kullanmak kilitleme sorunlarını önemli ölçüde azaltıyor.
Proaktif İzleme
Performans sorununu yaşandıktan sonra aramak reaktif bir yaklaşım. Proaktif izleme için birkaç temel araç var. SQL Server Agent ile periyodik istatistik toplama işleri kurabilirsiniz. DMV verilerini bir monitoring tablosuna yazarak trend analizi yapabilirsiniz. Ticari araçlardan SolarWinds DPA ya da SentryOne gibi çözümler baseline oluşturup anomali tespiti yapabiliyor. Açık kaynak alternatif olarak sp_WhoIsActive prosedürü anlık aktiviteyi izlemek için çok kullanışlı, yazarı Adam Machanic tarafından ücretsiz sunuluyor. Temel metrikleri düzenli kayıt altına almak, bir sorun çıktığında normal ile anormal arasındaki farkı hızla görmenizi sağlıyor.
İyi Günler Dilerim,
Bu yazıyı paylaş: