Analiz #1189
BittiHedef: sorgu 0x6C906FE3084F4D2D · DB-11 · dönem 2026-10-03 → 2026-10-09
Çalıştırma
- Model
- gemma4:12b (gemma4)Kurum içi
- Prompt şablonu
- #16
- Token (giriş / çıkış)
- 20.004 / 1.725
- Süre
- 145,0 sn
- Onarım
- 1
- Kural bulgusu
- 2
- Getirim (bağlama giren)
- KB 2 · profil 5 · vaka 0
Özet
güven: OrtaSorgunun yavaşlığına neden olan temel sorunlar, eksik bir indeks nedeniyle oluşan geçici indeks oluşturma (Index Spool) ve her dış satır için tekrar edilen maliyetli alt sorgu işlemleridir.
- İstem modelin context sınırına dayandı (9.079 token; context 12.288 − üretim sınırı 3.225): istemin başı (sistem kuralları) kesilmiş olabilir; karakter/token ölçümü alınmadı. Profilin context değerini büyütün ya da Analysis.CharsPerToken'ı düşürün.
- Bağlam bütçesi yetmedi; analiz eksik bağlamla yapıldı: "Benzer sorgular (QDS profilleri, aynı ortam)" kırpıldı (5.664 / 11.543 karakter çıkarıldı). Tam bağlam için LLM profilinin bağlam boyunu artırın (şu an 12.288 token).
- Güven high → medium: tablo, kolon ve index bilgisi (metadata) yok.
Kök nedenler
- QUERY_STORE_PLAN_IN_MEM tablosunda eksik olan (query_id, plan_id) indekslemesi nedeniyle optimizer her çalışma sırasında bu bilgileri içeren geçici bir indeks inşa etmektedir (Eager Index Spool). F1
- Alt sorgu (subquery) kullanımı nedeniyle, dış sorgudaki her bir satır için QUERY_STORE_RUNTIME_STATS_IN_MEM ve QUERY_STORE_RUNTIME_STATS_V2_IN_MEM gibi tabloları içeren maliyetli alt ağaçlar tekrar tekrar çalıştırılmaktadır. F2
Bulgular
2 bulgu| Id | Ciddiyet | Kural | Başlık | Kanıt |
|---|---|---|---|---|
| F1 | yüksek | INDEX_SPOOL | Geçici index (Eager Index Spool) — kalıcı index eksik | Optimizer QUERY_STORE_PLAN_IN_MEM için sorgu sırasında geçici index kuruyor (her çalıştırmada yeniden; maliyet payı %100): NodeId 15: anahtar [query_id, plan_id], 54.469 kez aranıyor, 1.000 satır okunup kuruluyor. Kalıcı index adayı: QUERY_STORE_PLAN_IN_MEM (query_id, plan_id); mevcut index'lerle örtüşme kontrol edilmeli. |
| F2 | yüksek | REPEATED_SUBTREE | Dış satır başına tekrar çalışan pahalı alt ağaç | NodeId 18 Row Count Spool alt ağacı 194.561 kez çalışıyor (dış tarafın her satırı için), maliyet payı %100; tablolar: QUERY_STORE_RUNTIME_STATS_IN_MEM, QUERY_STORE_RUNTIME_STATS_V2_IN_MEM, sys.plan_persist_runtime_stats, sys.plan_persist_runtime_stats_v2; en pahalı iç operatör Table-valued function (NodeId 25, %14,3). SELECT listesindeki ilişkili alt sorguysa JOIN/OUTER APPLY'a çevirmek ya da çalıştığı satır sayısını azaltmak değerlendirilmeli. |
Plan özeti
Plan tipi: tahmini; statement sayısı 1; toplam maliyet 1,271; tahmini satır 54.469 CE sürümü: 170; DOP: ?; paralel değil: MaxDOPSetToOne Memory grant (KB): istenen 672 (tahmini plan; verilen/kullanılan yalnız actual planda) Operatörler (maliyet sırasıyla):
Benzer vakalar
LLM bağlamına girdi; örnektir, kanıt değildirBağlama benzer vaka girmedi.
Analizi güçlendirecek ek bilgiler
isteğe bağlı; verilirse yeniden analiz edin- Plan tahmini (estimated): actual plan verilirse gerçek satır ve çalışma sayılarıyla tahmin hataları doğrulanır; kurallar şu an optimizer tahminlerine dayanıyor.
- Sorgu parametreli ve değerleri bilinmiyor: yavaş çalışmanın parametre değerleri (ya da değerleri içeren actual plan) kardinalite tahmin hatasını ve parametre hassasiyetini açıklar.
Öneriler
Korpusa ve LLM bağlamına bu analizin İngilizce çevirisi girer; onaylanmadan vaka korpusa girmez.
Korpusa yalnız onaylanmış ya da uygulanıp sahada izi görülen çözüm girer; aynı sorgunun yalnız en son onaylanan analizi korpusta kalır.
Korpusa girerse yaklaşık 61 sorgunun benzer vaka listesine girebilir.
Yeni index: QUERY_STORE_PLAN_IN_MEM (query_id, plan_id)
doğrulanmadı karar bekliyorTablo metadata'da yok: QUERY_STORE_PLAN_IN_MEM (harici sorgu ya da farklı DB); kolonlar, tipler ve mevcut index'ler doğrulanamadı, script üretilmedi.
Uygulanabilir script yok: öneriyi onaylayın ya da gerekçeyle reddedin (karar vaka hafızasına girer); "Uygulandı" kaydı tutulmaz.
T-SQL refactor — model önerisi
uyarılı karar bekliyorEşdeğerlik: test edilemedi — bu DB için Test DB eşlemesi yok (Envanter > eşdeğerlik testi DB'si) sys.query_store_plan orijinal sorguda da metadata'da yoktu; doğrulanamadı. sys.query_store_runtime_stats orijinal sorguda da metadata'da yoktu; doğrulanamadı.
test edilemedi — bu DB için Test DB eşlemesi yok (Envanter > eşdeğerlik testi DB'si)
Refactor Test DB'de orijinal sorguyla aynı parametrelerle çalıştırılır ve sonuçlar karşılaştırılır; satır içeriği Test sunucusundan çıkmaz.
| Orijinal | Öneri |
|---|---|
| SELECT 1, N'DB-11', p.plan_id, p.query_id, p.query_plan_hash, p.is_forced_plan, p.compatibility_level, | SELECT 1, N'DB-11', p.plan_id, p.query_id, p.query_plan_hash, p.is_forced_plan, p.compatibility_level, |
| CONVERT(datetime, SWITCHOFFSET(p.last_compile_start_time, 0)), CONVERT(datetime, SWITCHOFFSET(p.last_execution_time, 0)), | CONVERT(datetime, SWITCHOFFSET(p.last_compile_start_time, 0)), CONVERT(datetime, SWITCHOFFSET(p.last_execution_time, 0)), |
| p.force_failure_count, p.last_force_failure_reason_desc | p.force_failure_count, p.last_force_failure_reason_desc |
| FROM sys.query_store_plan AS p | FROM sys.query_store_plan AS p |
| WHERE p.is_forced_plan = 1 | WHERE p.is_forced_plan = 1 |
| OR p.query_id IN (SELECT pp.query_id FROM sys.query_store_plan AS pp | OR p.query_id IN (SELECT sub.query_id FROM (SELECT pp.query_id FROM sys.query_store_plan AS pp |
| JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = pp.plan_id | JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = pp.plan_id |
| WHERE rs.runtime_stats_interval_id > @Arg1 AND rs.runtime_stats_interval_id <= @Arg2) | WHERE rs.runtime_stats_interval_id > @Arg1 AND rs.runtime_stats_interval_id <= @Arg2 |
| GROUP BY pp.query_id) AS sub) |
- Alt sorgudaki GROUP BY kullanımı, orijinal sorgudaki (eğer varsa) mükerrer satır yapısını değiştirebilir; ancak query_id üzerinde benzersiz sonuç beklenmektedir.
SELECT 1, N'DB-11', p.plan_id, p.query_id, p.query_plan_hash, p.is_forced_plan, p.compatibility_level,
CONVERT(datetime, SWITCHOFFSET(p.last_compile_start_time, 0)), CONVERT(datetime, SWITCHOFFSET(p.last_execution_time, 0)),
p.force_failure_count, p.last_force_failure_reason_desc
FROM sys.query_store_plan AS p
WHERE p.is_forced_plan = 1
OR p.query_id IN (SELECT sub.query_id FROM (SELECT pp.query_id FROM sys.query_store_plan AS pp
JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = pp.plan_id
WHERE rs.runtime_stats_interval_id > @Arg1 AND rs.runtime_stats_interval_id <= @Arg2
GROUP BY pp.query_id) AS sub)Asistana sor
yalnız bu analizin kanıtıylaBu analiz hakkında soru sorun: cevap yalnız bulgulara (F), önerilere (R), sorgu, plan ve metadata'ya dayanır; kanıt gösteremeyen cevap gösterilmez.