# Analiz Raporu #1190

Hedef: sorgu 0x2FD5B060B5EA5C2B · dönem 2026-10-03 → 2026-10-09

Veritabanı: DB-10 · Güven: medium · Model: gemma4:12b (gemma4) · Prompt v11

## Özet
Sorgu performansı, sistem tabloları üzerindeki gizli dönüşümler (implicit conversion) ve SARG'a olmayan (non-sargable) ifadeler nedeniyle olumsuz etkilenmektedir.

## Uyarılar
- İstem modelin context sınırına dayandı (12.645 token; context 16.384 − üretim sınırı 4.328): 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ı: "Bilgi tabanı" kırpıldı (5.321 / 19.786 karakter çıkarıldı), "Benzer sorgular (QDS profilleri, aynı ortam)" çıkarıldı (27.048 karakter). Tam bağlam için LLM profilinin bağlam boyunu artırın (şu an 16.384 token).
- Güven high → medium: tablo, kolon ve index bilgisi (metadata) yok.

## Kök nedenler
- sys.sysobjvalues tablosu üzerindeki değerlerin dönüştürülmesi sırasında meydana gelen gizli tip dönüşümleri (implicit conversion) nedeniyle tahmin hataları ve performans kaybı yaşanmaktadır. (F1, F2)
- Sorgu içerisindeki 'v.boundary_id = pf.fanout - 1' ve 'v.boundary_id = st.FirstData - 1' ifadeleri SARG'a uygun değildir, bu durum indeks kullanımını kısıtlamaktadır. (F4, F5)
- sys.sysrowsets tablosundaki 'Clustered Index Scan' işlemi planın %31.6'lık kısmını oluşturarak performans darboğazı yaratmaktadır. (F3)

## Bulgular
| Id | Ciddiyet | Kural | Başlık | Kanıt |
|---|---|---|---|---|
| F1 | Medium | IMPLICIT_CONVERSION | Örtük tip dönüşümü (implicit conversion) | Cardinality Estimate: CONVERT(datetime2(7),[DB-10].[sys].[sysobjvalues].[value],0) |
| F2 | Medium | IMPLICIT_CONVERSION | Örtük tip dönüşümü (implicit conversion) | Cardinality Estimate: CONVERT(nvarchar(100),[DB-10].[sys].[sysobjvalues].[value],0) |
| F3 | Low | COST_HOTSPOT | Maliyet odağı: planın en pahalı operatörü | NodeId 44 Clustered Index Scan sys.sysrowsets.clust: planın %31,6'i bu operatörde (tahmini 80 satır; sorgunun ort. CPU'su 1.517,5 ms). Diğer kurallar bu operatör için bilinen bir desen bulmadı. Tablo/index taranıyor: koşulu karşılayan index yok ya da koşul seçici değil; tablo büyük tablo eşiğinin altında olsa da planın en pahalı adımı bu. Residual predicate: [DB-10].[sys].[sysrowsets].[idmajor] as [rs].[idmajor]=[DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysrowse…. |
| F4 | Low | NON_SARGABLE | Kolon üzerinde fonksiyon/ifade (sargable değil) | Satır 7: v.boundary_id = pf.fanout - 1 |
| F5 | Low | NON_SARGABLE | Kolon üzerinde fonksiyon/ifade (sargable değil) | Satır 9: v.boundary_id = st.FirstData - 1 |

## Plan özeti
```
Plan tipi: tahmini; statement sayısı 1; toplam maliyet 0,9; tahmini satır 1,5
CE sürümü: 170; DOP: ?; paralel değil: MaxDOPSetToOne
Memory grant (KB): istenen 544 (tahmini plan; verilen/kullanılan yalnız actual planda)
Operatörler (maliyet sırasıyla):
- [44] Clustered Index Scan sys.sysrowsets.clust — %31,597 maliyet, tahmini 80 satır; residual: [DB-10].[sys].[sysrowsets].[idmajor] as [rs].[idmajor]=[DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysrowsets].[idminor] as [rs].[idminor]=[DB-10].[sys].[sysidxstats].[indid] as [i].[indid] AND ([DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(4) OR [DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(3) OR [DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(2) OR CONVERT(bit,[DB-10].[sys].[sysrowsets].[status] as [rs].[status]&(65536),0)=(1) AND [DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(1))
- [91] Clustered Index Scan sys.sysrowsets.clust — %31,597 maliyet, tahmini 1,6 satır; residual: [DB-10].[sys].[sysrowsets].[idmajor] as [rs].[idmajor]=[DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysrowsets].[idminor] as [rs].[idminor]=[DB-10].[sys].[sysidxstats].[indid] as [i].[indid] AND [DB-10].[sys].[sysrowsets].[numpart] as [rs].[numpart]=[DB-10].[sys].[sysclsobjs].[intprop] as [f].[intprop] AND ([DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(4) OR [DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(3) OR [DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(2) OR CONVERT(bit,[DB-10].[sys].[sysrowsets].[status] as [rs].[status]&(65536),0)=(1) AND [DB-10].[sys].[sysrowsets].[ownertype] as [rs].[ownertype]=(1))
- [89] Nested Loops — %12,558 maliyet, tahmini 1,6 satır
- [42] Nested Loops — %11,331 maliyet, tahmini 80 satır
- [27] Clustered Index Seek sys.syssingleobjrefs.clst — %2,415 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND (7) AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]
- [25] Clustered Index Seek sys.sysschobjs.clst — %1,469 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id]; residual: [DB-10].[sys].[sysschobjs].[nsclass] as [o].[nsclass]=(0) AND [DB-10].[sys].[sysschobjs].[pclass] as [o].[pclass]=(1) AND CONVERT(bit,[DB-10].[sys].[sysschobjs].[status] as [o].[status]&(1),0)=(0) AND (CONVERT(char(2),CASE WHEN [DB-10].[sys].[sysschobjs].[type] as [o].[type]='ET' THEN 'U' ELSE [DB-10].[sys].[sysschobjs].[type] as [o].[type] END,0)='V' OR CONVERT(char(2),CASE WHEN [DB-10].[sys].[sysschobjs].[type] as [o].[type]='ET' THEN 'U' ELSE [DB-10].[sys].[sysschobjs].[type] as [o].[type] END,0)='U')
- [40] Sort — %1,351 maliyet, tahmini 80 satır
- [23] Clustered Index Scan sys.sysidxstats.clst — %0,913 maliyet, tahmini 16,5 satır; residual: ([DB-10].[sys].[sysidxstats].[status] as [i].[status]&(1))<>(0) AND ([DB-10].[sys].[sysidxstats].[status] as [i].[status]&(67108864))=(0) AND CONVERT(bit,[DB-10].[sys].[sysidxstats].[status] as [i].[status]&(256),0)=(0)
- [26] Clustered Index Seek sys.sysschobjs.clst — %0,616 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysschobjs].[id] as [o].[id]
- [28] Index Spool — %0,392 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]
- [76] Index Spool — %0,392 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid] AND [DB-10].[sys].[sysclsobjs].[intprop] as [f].[intprop]
- [58] Clustered Index Seek sys.sysiscols.clst — %0,375 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]; residual: [DB-10].[sys].[sysiscols].[tinyprop2] as [isc].[tinyprop2]=(1) AND (([DB-10].[sys].[sysiscols].[status] as [isc].[status]&(2))<(0) OR ([DB-10].[sys].[sysiscols].[status] as [isc].[status]&(2))>(0))
- [67] Clustered Index Seek sys.sysobjvalues.clst — %0,374 maliyet, tahmini 1 satır; seek: (30) AND [DB-10].[sys].[sysclsobjs].[id] as [f].[id] AND (1)
- [71] Clustered Index Seek sys.sysobjvalues.clst — %0,374 maliyet, tahmini 1 satır; seek: (30) AND [DB-10].[sys].[sysclsobjs].[id] as [f].[id] AND [DB-10].[sys].[sysclsobjs].[intprop] as [f].[intprop]-(1)
- [75] Clustered Index Seek sys.sysobjvalues.clst — %0,374 maliyet, tahmini 1 satır; seek: (30) AND [DB-10].[sys].[sysclsobjs].[id] as [f].[id] AND [Expr1135]-(1)
- [51] Clustered Index Seek sys.sysidxstats.clst — %0,374 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]; residual: ([DB-10].[sys].[sysidxstats].[status] as [idxstats].[status]&(67108864))=(0)
- [54] Clustered Index Seek sys.sysschobjs.clst — %0,374 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id]
- [60] Clustered Index Seek sys.syscolpars.clst — %0,374 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND (0) AND [DB-10].[sys].[sysiscols].[intprop] as [isc].[intprop]
- [61] Clustered Index Seek sys.sysobjvalues.clst — %0,374 maliyet, tahmini 1 satır; seek: (119) AND [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[syscolpars].[colid] as [c].[colid]
- [63] Clustered Index Scan sys.systypedsubobjs.clst — %0,37 maliyet, tahmini 1,4 satır; residual: [DB-10].[sys].[systypedsubobjs].[subid]=(1) AND [DB-10].[sys].[systypedsubobjs].[class]=(30)
- [18] Clustered Index Seek sys.sysclsobjs.clst — %0,365 maliyet, tahmini 1 satır; seek: (31); residual: [DB-10].[sys].[sysclsobjs].[type] as [o].[type]='PS'
- [19] Clustered Index Seek sys.syssingleobjrefs.clst — %0,365 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysclsobjs].[id] as [o].[id] AND (31) AND (0)
- [20] Clustered Index Seek sys.sysclsobjs.clst — %0,365 maliyet, tahmini 1 satır; seek: (30) AND [DB-10].[sys].[syssingleobjrefs].[indepid] as [r].[indepid]
- [37] Clustered Index Seek sys.sysidxstats.clst — %0,365 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]; residual: [DB-10].[sys].[sysidxstats].[indid]<(256000) AND ([DB-10].[sys].[sysidxstats].[status]&(1))=(1) AND ([DB-10].[sys].[sysidxstats].[status]&(67108864))=(0) AND ([DB-10].[sys].[sysidxstats].[type]<(5) OR [DB-10].[sys].[sysidxstats].[type]>(5)) AND ([DB-10].[sys].[sysidxstats].[type]<(6) OR [DB-10].[sys].[sysidxstats].[type]>(6))
- [85] Clustered Index Seek sys.sysidxstats.clst — %0,365 maliyet, tahmini 1 satır; seek: [DB-10].[sys].[sysidxstats].[id] as [i].[id] AND [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]; residual: [DB-10].[sys].[sysidxstats].[indid]<(256000) AND ([DB-10].[sys].[sysidxstats].[status]&(1))=(1) AND ([DB-10].[sys].[sysidxstats].[status]&(67108864))=(0) AND ([DB-10].[sys].[sysidxstats].[type]<(5) OR [DB-10].[sys].[sysidxstats].[type]>(5)) AND ([DB-10].[sys].[sysidxstats].[type]<(6) OR [DB-10].[sys].[sysidxstats].[type]>(6))
- [21] Filter — %0,097 maliyet, tahmini 16,5 satır; residual: has_access('CO',[DB-10].[sys].[sysidxstats].[id] as [i].[id])=(1)
- [39] Stream Aggregate — %0,01 maliyet, tahmini 77,2 satır
- [45] Table-valued function PARTITIONCOUNTS — %0,009 maliyet, tahmini 1 satır
- [13] Nested Loops — %0,008 maliyet, tahmini 16,5 satır
- [14] Nested Loops — %0,008 maliyet, tahmini 16,5 satır
- [24] Filter — %0,007 maliyet, tahmini 1 satır; residual: has_access('CO',[DB-10].[sys].[sysschobjs].[id] as [o].[id])=(1)
- [11] Nested Loops — %0,007 maliyet, tahmini 15,4 satır
- [9] Nested Loops — %0,007 maliyet, tahmini 15,4 satır
- [31] Stream Aggregate — %0,005 maliyet, tahmini 1 satır
- [8] Filter — %0,003 maliyet, tahmini 1,5 satır; residual: [DB-10].[sys].[sysclsobjs].[id] as [o].[id]=CASE WHEN [Expr1274]<>(0) THEN (0) ELSE isnull([DB-10].[sys].[syssingleobjrefs].[indepid] as [ds].[indepid],(1)-([DB-10].[sys].[sysidxstats].[status] as [i].[status]&(256))/(256)) END
- [57] Filter — %0,002 maliyet, tahmini 1 satır; residual: has_access('CO',[DB-10].[sys].[sysiscols].[idmajor] as [isc].[idmajor])=(1)
- [5] Nested Loops — %0,001 maliyet, tahmini 1,5 satır; residual: [DB-10].[sys].[systypedsubobjs].[idmajor]=[DB-10].[sys].[sysclsobjs].[id] as [f].[id]
- [41] Compute Scalar — %0,001 maliyet, tahmini 80 satır
- [52] Nested Loops — %0,001 maliyet, tahmini 1 satır; residual: [Expr1286]=(0) OR [Expr1287]=(0) OR [DB-10].[sys].[sysiscols].[idminor] as [isc].[idminor]=(1)
- [49] Nested Loops — %0,001 maliyet, tahmini 1 satır
- [32] Concatenation — %0,001 maliyet, tahmini 78,2 satır
- [6] Nested Loops — %0,001 maliyet, tahmini 1,5 satır
- [3] Nested Loops — %0,001 maliyet, tahmini 1,5 satır
- [1] Nested Loops — %0,001 maliyet, tahmini 1,5 satır
- [48] Nested Loops — %0,001 maliyet, tahmini 1,4 satır
- [55] Nested Loops — %0,001 maliyet, tahmini 1 satır
- [2] Nested Loops — %0,001 maliyet, tahmini 1,5 satır
- [4] Nested Loops — %0,001 maliyet, tahmini 1,5 satır
- [7] Nested Loops — %0,001 maliyet, tahmini 1,5 satır
- [17] Nested Loops — %0,001 maliyet, tahmini 1 satır
- [34] Nested Loops — %0 maliyet, tahmini 1 satır
- [82] Nested Loops — %0 maliyet, tahmini 1 satır
- [16] Nested Loops — %0 maliyet, tahmini 1 satır
- [36] Filter — %0 maliyet, tahmini 1 satır; residual: [DB-10].[sys].[sysidxstats].[indid]<>(0) OR objectproperty([DB-10].[sys].[sysidxstats].[id],'TableIsMemoryOptimized')=(0)
- [84] Filter — %0 maliyet, tahmini 1 satır; residual: [DB-10].[sys].[sysidxstats].[indid]<>(0) OR objectproperty([DB-10].[sys].[sysidxstats].[id],'TableIsMemoryOptimized')=(0)
- [47] Stream Aggregate — %0 maliyet, tahmini 1 satır
- [87] Stream Aggregate — %0 maliyet, tahmini 1 satır
- [92] Table-valued function PARTITIONCOUNTS — %0 maliyet, tahmini 1 satır
- [65] Stream Aggregate — %0 maliyet, tahmini 1 satır
- [69] Stream Aggregate — %0 maliyet, tahmini 1 satır
- [73] Stream Aggregate — %0 maliyet, tahmini 1 satır
- [10] Compute Scalar — %0 maliyet, tahmini 15,4 satır
- [59] Filter — %0 maliyet, tahmini 1 satır; residual: has_access('CO',[DB-10].[sys].[syscolpars].[id] as [c].[id])=(1)
- [38] Table-valued function PARTITIONCOUNTS — %0 maliyet, tahmini 1 satır
- [86] Table-valued function PARTITIONCOUNTS — %0 maliyet, tahmini 1 satır
- [29] Compute Scalar — %0 maliyet, tahmini 1 satır
- [77] Assert — %0 maliyet, tahmini 1 satır; residual: CASE WHEN [Expr1268]>(1) THEN (0) ELSE NULL END
- [78] Stream Aggregate — %0 maliyet, tahmini 1 satır
- [64] Assert — %0 maliyet, tahmini 1 satır; residual: CASE WHEN [Expr1262]>(1) THEN (0) ELSE NULL END
- [68] Assert — %0 maliyet, tahmini 1 satır; residual: CASE WHEN [Expr1264]>(1) THEN (0) ELSE NULL END
- [72] Assert — %0 maliyet, tahmini 1 satır; residual: CASE WHEN [Expr1266]>(1) THEN (0) ELSE NULL END
- [46] Assert — %0 maliyet, tahmini 1 satır; residual: CASE WHEN [Expr1260]>(1) THEN (0) ELSE NULL END
- [81] Filter — %0 maliyet, tahmini 1 satır; residual: PARTITIONCOUNTS.[partition_number]=[DB-10].[sys].[sysclsobjs].[intprop] as [f].[intprop]
- [62] Compute Scalar — %0 maliyet, tahmini 1,4 satır
- [56] Compute Scalar — %0 maliyet, tahmini 1 satır
- [66] Compute Scalar — %0 maliyet, tahmini 1 satır
- [70] Compute Scalar — %0 maliyet, tahmini 1 satır
- [74] Compute Scalar — %0 maliyet, tahmini 1 satır
- [53] Compute Scalar — %0 maliyet, tahmini 1 satır
- [79] Concatenation — %0 maliyet, tahmini 2 satır
- [15] Compute Scalar — %0 maliyet, tahmini 1 satır
- [0] Compute Scalar — %0 maliyet, tahmini 1,5 satır
- [30] Compute Scalar — %0 maliyet, tahmini 1 satır
- [33] Filter — %0 maliyet, tahmini 1 satır; residual: [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]<(256000)
- [80] Filter — %0 maliyet, tahmini 1 satır; residual: [DB-10].[sys].[sysidxstats].[indid] as [i].[indid]<(256000)
- [88] Compute Scalar — %0 maliyet, tahmini 1,6 satır
Uyarılar:
- PlanAffectingConvert: Cardinality Estimate: CONVERT(datetime2(7),[DB-10].[sys].[sysobjvalues].[value],0)
- PlanAffectingConvert: Cardinality Estimate: CONVERT(nvarchar(100),[DB-10].[sys].[sysobjvalues].[value],0)
- PlanAffectingConvert: Cardinality Estimate: CONVERT(datetime2(7),[DB-10].[sys].[sysobjvalues].[value],0)
- PlanAffectingConvert: Cardinality Estimate: CONVERT(nvarchar(100),[DB-10].[sys].[sysobjvalues].[value],0)
- PlanAffectingConvert: Cardinality Estimate: CONVERT(datetime2(7),[DB-10].[sys].[sysobjvalues].[value],0)
- PlanAffectingConvert: Cardinality Estimate: CONVERT(nvarchar(100),[DB-10].[sys].[sysobjvalues].[value],0)
```

## T-SQL refactor — güvenilir öneri üretilemedi — Invalid
Doğrulama: Model SQL'i doğrulamadan geçmedi; hatalı sorgu kopyalanmasın diye gösterilmiyor. Bulgular ve kök nedenler neyin düzeltilmesi gerektiğini anlatır.
Refactor geçersiz (onarım sonrası da)
nvarchar(100) dönüşümünün style'ı değişti (orijinal 121, refactor 111/yok): style değerin nasıl okunacağını belirler (ör. binary için 1 = "0x…" hex metin, 0 = karakter baytları); sonuç değişir.
sys.index_columns orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.columns orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.partition_parameters orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.partition_range_values orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.dm_db_partition_stats orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.indexes orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.objects orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.partition_schemes orijinal sorguda da metadata'da yoktu; doğrulanamadı.
sys.partition_functions orijinal sorguda da metadata'da yoktu; doğrulanamadı.
Onarım yanıtı geçersiz: Invalid JSON: Expected end of string, but instead reached end of data. Path: $.refactor.sql | LineNumber: 26 | BytePositionInLine: 1039.
Modelin önerdiği değişiklikler (SQL reddedildi):
- F4 ve F5 için: 'v.boundary_id = pf.fanout - 1' ve 'v.boundary_id = st.FirstData - 1' ifadeleri parantez içine alınarak hesaplamanın dışarıda (veya daha açık bir şekilde) değerlendirilmesi için optimize edildi.
- F1 ve F2 için: Dönüştürme işlemlerinde standart SQL kodları kullanıldı ve mümkün olan yerlerde açık tür tanımlamaları korundu.

## Benzer profiller
Bu desen 6 sunucu/DB'de 10 sorguda da görülüyor (vektör benzerliği; en yakınları LLM bağlamına da girdi):
- Profile SQL-1/DB-9 0x2FD5B060B5EA5C2B — uzaklık 0.000
- Profile SQL-1/DB-11 0x2FD5B060B5EA5C2B — uzaklık 0.000
- Profile SQL-1/DB-12 0x2FD5B060B5EA5C2B — uzaklık 0.000
- Profile SQL-1/DB-3 0x2FD5B060B5EA5C2B — uzaklık 0.028
- Profile SQL-1/DB-1 0x2FD5B060B5EA5C2B — uzaklık 0.028
- Profile SQL-1/DB-3 0xDF02CFCA45E44360 — uzaklık 0.049
- Profile SQL-1/DB-1 0x853B37A87E85CAF4 — uzaklık 0.143
- Profile SQL-1/DB-11 0x853B37A87E85CAF4 — uzaklık 0.143
- Profile SQL-1/DB-10 0xA673F514EC281201 — uzaklık 0.159
- Profile SQL-1/DB-3 0xFC8A6F2626E4CF76 — uzaklık 0.161

## Analizi güçlendirecek ek bilgiler
- 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.
