dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/sqlserver/#28
Runbook #28
sqlserver
PerformanceSEV1 · CRITICAL OUTAGE15-30 dakika / 15-30 minssysadmin / CONTROL SERVER / VIEW SERVER STATE

SQL Server High CPU: Diagnose Queries, Compilations and Plan Regressions

Separates currently running from historical CPU-heavy queries and responds safely to plan regressions, compilations and stale statistics.

Related Metrics:M27
Related Scripts:S42S43S54S60
#cpu#query-store#plan-regression#compilations

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Symptom & Signals

- M27: SQL Server süreci CPU'yu uzun süre yüksek kullanıyor; sorgu gecikmesi ve uygulama zaman aşımı artıyor.

- CPU baskısı **işletim sistemi geneli mi, yoksa sqlservr süreci mi?** Önce bunu ayırın. Tek bir anlık sıçrama alarm için yeterli değildir.

2. Business & Technical Impact

İstekler kuyruklanır, yanıt süreleri uzar; CPU'ya duyarlı işler ve aynı sunucudaki diğer uygulamalar etkilenebilir.

3. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. CPU'yu şu anda kullanan oturumları belirleyin (`cpu_time` isteğin başlangıcından beri kümülatiftir; hız değildir):
sql
SELECT TOP (20) r.session_id, r.status, r.command,
       r.cpu_time AS request_cpu_ms, r.total_elapsed_time AS elapsed_ms,
       r.logical_reads, r.wait_type,
       DB_NAME(r.database_id) AS database_name,
       s.login_name, s.host_name,
       SUBSTRING(t.text, r.statement_start_offset/2 + 1,
         (CASE WHEN r.statement_end_offset = -1 THEN DATALENGTH(t.text)
               ELSE r.statement_end_offset END - r.statement_start_offset)/2 + 1) AS statement_text
FROM sys.dm_exec_requests AS r
JOIN sys.dm_exec_sessions AS s ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE r.session_id <> @@SPID AND s.is_user_process = 1
ORDER BY r.cpu_time DESC;
🟢 Read-Only2. S42 ile plan cache'teki toplam CPU tüketicilerini kontrol edin. **Cache verisi kalıcı geçmiş değildir**; yeniden başlatma/plan eviction sonrası kaybolur. Query Store açıksa sorgunun önceki planını, süre/CPU trendini ve plan değişim zamanını karşılaştırın (S60). S43 eksik indeks DMV önerilerini doğrudan uygulamayın; S54 ile istatistik güncelliğini karşılaştırın.
🟢 Read-Only3. Eşlik eden nedenleri ayırın: `SQL Compilations/sec`/`Batch Requests/sec` artışı için `mssql-plan-cache-compilations`; `SOS_SCHEDULER_YIELD` beklemesi CPU doygunluğuyla uyumlu olabilir ama tek başına kanıt değildir. Yedekleme, CHECKDB, indeks bakımı veya yeni deployment zamanlarını kontrol edin.

4. Remediation & Action Plan

🟡 Reversible1. Tek bir sorgu yeni deployment ile kötüleştiyse uygulama sahibine bildirip trafiği azaltın veya deployment'ı geri alın. Query Store'da **önceden iyi çalıştığı doğrulanmış** planı, plan zorlamasının kısıtlarını inceleyerek değerlendirin; önce Query Store plan regresyonunu kanıtlayın.
🟡 Reversible2. S54'ün gösterdiği sorunlu tablo için dar kapsamlı istatistik güncellemesi planlayın (bakım yükü yaratır):
sql
UPDATE STATISTICS dbo.OrnekTablo (OrnekIstatistik) WITH FULLSCAN;

İsimleri gerçek nesnelerle değiştirin; büyük tabloda FULLSCAN pahalıdır, gerekiyorsa örneklem kullanın.

🔴 HIGH RISK / IRREVERSIBLE3. Tek bir kontrol dışı sorgu üretimi engelliyorsa **oturum sahibinin onayıyla** sonlandırın; açık transaction geri alınabilir ve rollback uzun sürebilir:
sql
KILL 123;  -- 123 yerine doğrulanmış session_id
KILL 123 WITH STATUSONLY;  -- rollback varsa ilerlemesini sorgular

4. **Kalıcı çözüm:** Sorgu/indeks tasarımını düzeltin, uygulamada parametreli sorgu kullanın, uygun olduğunda Query Store regresyon takibi kurun. `MAXDOP` ve `cost threshold for parallelism` değerlerini tek CPU grafiğine bakarak sunucu genelinde değiştirmeyin.

5. **Yapmayın:** `DBCC FREEPROCCACHE` ile tüm planları silmek derleme fırtınası yaratır; CPU sorununa genel çözüm değildir.

5. Verification & Health Checks

- SQL Server ve işletim sistemi CPU'su baseline'a döndü, M27 değerlendirme penceresi boyunca normale indi.

- Uygulamanın p95/p99 gecikmesi ve hata oranı düzeldi; Query Store'da aynı sorgunun CPU/çalıştırma süresi azaldı.

6. Rollback & Contingency Plan

- Deployment veya Query Store plan zorlama değişikliği varsa önceki duruma dönün; `KILL` geri alınamaz, işlem geri sarılır.

- İstatistik güncellemesini doğrudan geri alamazsınız; gerekirse eski planı Query Store üzerinden kontrollü geri yükleyin. Örnek bir planı zorlamadan önce üretim onayı alın.

More SQLSERVER Runbooks