Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunun için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği.
SQL Server 2022 (16.x) ile başlayarak Kardinalite Tahmini (CE) geri bildirimi, akıllı sorgu işleme özellikleri ailesinin bir parçasıdır ve bu sorunlar yanlış CE modeli varsayımlarından kaynaklandığında yinelenen sorgular için yetersiz sorgu yürütme planlarını giderir. Bu senaryo, Veritabanı Altyapısı'nın eski sürümlerinden yükseltme yaparken varsayılan CE ile ilgili regresyon risklerini azaltmaya yardımcı olur.
Tek bir CE modeli ve varsayım kümesi çok çeşitli müşteri iş yüklerini ve veri dağıtımlarını barındıramadığından, CE geri bildirimleri sorgu çalışma zamanı özelliklerine göre uyarlanabilir bir çözüm sağlar. CE geri bildirimi, sorgu yürütme planı kalitesini geliştirmek için belirli bir sorguya ve veri dağıtımına daha uygun bir model varsayımı tanımlar ve kullanır. Şu anda CE geri bildirimi, tahmini satır sayısıyla gerçek satır sayısının çok farklı olduğu plan işleçlerini belirleyebilir. Önemli model tahmini hataları oluştuğunda ve deneyebileceğiniz uygun bir alternatif model olduğunda geri bildirim uygulanır.
Diğer sorgu geri bildirim özellikleri için bkz . Bellek verme geri bildirimi ve Paralellik derecesi (DOP) geri bildirimi.
Kardinalite tahmini (CE) geri bildirimini anlama
Kardinalite tahmini (CE), Sorgu İyileştirici'nin bir sorgu planının her düzeyinde işlenen toplam satır sayısını nasıl tahmin edebildiğidir. SQL Server'daki kardinalite tahmini, öncelikle dizinler veya istatistikler oluşturulduğunda el ile veya otomatik olarak oluşturulan histogramlardan türetilir. Bazen SQL Server, kardinaliteyi belirlemek için kısıtlama bilgilerini ve sorguların mantıksal yeniden yazmalarını da kullanır.
Veritabanı Altyapısı'nın farklı sürümleri, verilerin nasıl dağıtıldığına ve sorgulandığına bağlı olarak farklı CE modeli varsayımları kullanır. Daha fazla bilgi için bkz. CE sürümleri.
Kardinalite tahmini (CE) geri bildirim uygulaması
Kardinalite tahmini (CE) geri bildirimi, zaman içinde hangi CE modeli varsayımlarının en uygun olduğunu öğrenir ve geçmişteki en doğru varsayımı uygular:
CE geri bildirimi, modelle ilgili varsayımları tanımlar ve yinelenen sorgular için doğru olup olmadığını değerlendirir.
Bir varsayım yanlış görünüyorsa, aynı sorgunun sonraki bir yürütmesi, etkili CE modeli varsayımını ayarlayan ve yardımcı olup olmadığını doğrulayan bir sorgu planıyla test edilir. Plan işleçlerindeki gerçek ve tahmini satırları karşılaştırarak hataları belirleriz. CE geri bildiriminde bulunan model varyantları tüm hataları düzeltemez.
Plan kalitesini artırırsa, eski sorgu planı, Sorgu Deposu ipucu mekanizması aracılığıyla uygulanan tahmin modelini ayarlayan uygun USE HINT sorgu ipucunu kullanan bir sorgu planıyla değiştirilir.
Yalnızca doğrulanmış geri bildirim kalıcıdır. Ayarlanan model varsayımı performans regresyonuyla sonuçlanırsa bu sorgu için CE geri bildirimi kullanılmaz. Bu bağlamda, kullanıcı tarafından iptal edilen bir sorgu da regresyon olarak algılanır.
Kardinalite tahmini (CE) geri bildirim senaryoları
Kardinalite tahmini (CE) geri bildirimi, varsayılan CE (CE120 veya üzeri) kullanılırken yanlış CE modeli varsayımlarından kaynaklanan algılanan regresyon sorunlarını giderir ve farklı model varsayımlarını seçmeli olarak kullanabilir. Senaryolar Arasında Bağıntı, Birleştirme Kapsaması ve İyileştirici satır hedefi yer alır.
Kardinalite tahmini (CE) geri bildirim bağıntısı
Sorgu İyileştirici belirli bir tablo veya görünümdeki koşulların seçiciliğini ya da belirtilen koşulu karşılayan satır sayısını tahmin ettiğinde korelasyon modeli varsayımlarını kullanır. Bu varsayımlar, önermelerin şunlar olabileceği şeklinde olabilir:
Tam bağımsız (CE70 için varsayılan), kardinalite tüm koşul seçimlerinin çarpılmasıyla hesaplanır.
Kısmi bağıntılı (CE120 ve üzeri için varsayılan), kardinalite, üstel geri alma yönteminin bir varyasyonu kullanılarak hesaplanır ve, önermeler seçiciliklerine göre en seçiciden en az seçiciye doğru sıralanır.
Kardinalitenin tüm koşullarda en düşük seçicilik kullanılarak hesaplandığı tam bağıntılı.
Aşağıdaki örnek, veritabanı uyumluluğu 120 veya üzeri olarak ayarlandığında kısmi bağıntı kullanır:
USE AdventureWorks2016_EXT;
GO
SELECT AddressID, AddressLine1, AddressLine2
FROM Person.Address
WHERE StateProvinceID = 79 AND City = N'Redmond';
GO
Veritabanı uyumluluğu 160 olarak ayarlandığında ve varsayılan bağıntı kullanıldığında, CE geri bildirimi, tahmini kardinalitenin gerçek satır sayısına göre hafife alınıp alınmadığına veya fazla tahmin edilmesine bağlı olarak bağıntıyı doğru yöne taşımaya çalışır. Gerçek satır sayısı tahmini kardinaliteden büyükse tam bağıntı kullanın. Gerçek satır sayısı tahmini kardinaliteden küçükse tam bağımsızlığı kullanın.
Daha fazla bilgi için bkz. CE sürümleri.
Kardinalite tahmini (CE) geri bildirim birleştirme kapsaması
Sorgu İyileştirici birleştirme koşullarının ve geçerli filtre koşullarının seçiciliğini tahmin ettiğinde, kapsama modeli varsayımlarını kullanır. Bu varsayımlar şunlardır:
Basit kapsama (CE70 için varsayılan) birleştirme koşullarının tamamen bağıntılı olduğunu varsayar; burada filtre seçiciliği ilk olarak hesaplanır ve ardından birleşim seçiciliği katılır.
Temel kapsama (CE120 ve üzeri için varsayılan) birleştirme önkoşulları ile aşağı akış filtreleri arasında bağıntı olmadığını varsayar; burada birleşim seçiciliği ilk olarak hesaplanır ve ardından filtre seçiciliği dikkate alınır.
Aşağıdaki örnek, veritabanı uyumluluğu 120 veya üzeri olarak ayarlandığında temel kapsamayı kullanır:
USE AdventureWorksDW2016_EXT;
GO
SELECT *
FROM dbo.FactCurrencyRate AS f
INNER JOIN dbo.DimDate AS d ON f.DateKey = d.DateKey
WHERE d.MonthNumberOfYear = 7 AND f.CurrencyKey = 3 AND f.AverageRate > 1;
GO
Daha fazla bilgi için bkz. CE sürümleri.
Kardinalite tahmini (CE) geri bildirimi ve sorgu iyileştirici satır hedefi
Sorgu İyileştiricisi bir yürütme planının kardinalitesini tahmin ettiğinde, genellikle tüm tablolardaki tüm uygun satırların işlenmesi gerektiğini varsayar. Ancak bazı sorgu desenleri Sorgu İyileştiricisi'nin G/Ç'yi azaltmak için daha az sayıda satır döndürecek bir plan aramasına neden olur. Sorgu, çalışma zamanında beklenen bir hedef satır sayısını (satır hedefi) belirtmek için TOP, IN, EXISTS anahtar sözcükleri, FAST sorgu ipucu veya bir SET ROWCOUNT deyimi kullandığında, bu satır hedefi, aşağıdaki örnekte olduğu gibi, sorgu iyileştirme sürecinin bir parçası olarak kullanılır:
USE AdventureWorks2016_EXT;
GO
SELECT TOP 1 soh.*
FROM Sales.SalesOrderHeader AS soh
INNER JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID;
GO
Satır hedefi planı uygulandığında, Sorgu İyileştiricisi satır hedefine ulaşmak için daha az sayıda satırın işlenmesi gerektiğini varsaydığından sorgu planındaki tahmini satır sayısı azalır.
Satır hedefi belirli sorgu desenleri için yararlı bir iyileştirme stratejisi olsa da, veriler düzgün dağıtılmadıysa tahmininden daha fazla sayfa taranabilir ve bu da satır hedefinin verimsiz hale gelmesi anlamına gelir. CE geri bildirimi satır hedefi taramasını devre dışı bırakabilir ve bu verimsizlik algılandığında aramayı etkinleştirebilir.
Yürütme planında CE geri bildirimine özgü bir öznitelik yoktur, ancak Sorgu Deposu ipucu için listelenen bir öznitelik vardır.
QueryStoreStatementHintSource öğesinin CE feedback haline gelmesini arayın.
Kardinalite tahmini (CE) geri bildirimiyle ilgili dikkat edilmesi gerekenler
Kardinalite tahmini (CE) geri bildirimini etkinleştirmek için, sorguyu yürütürken bağlandığınız veritabanı için veritabanı uyumluluk düzeyi 160'ı etkinleştirin. CE geri bildiriminin kullanıldığı her veritabanı için Sorgu Deposu etkinleştirilmelidir ve READ_WRITE modunda olmalıdır.
CE geri bildirimini veritabanı düzeyinde devre dışı bırakmak için
CE_FEEDBACKkullanın. Örneğin, kullanıcı veritabanında:ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK = OFF;CE geri bildirimini sorgu düzeyinde devre dışı bırakmak için sorgu ipucunu
DISABLE_CE_FEEDBACKkullanın.
CE geri bildirim etkinliği query_feedback_analysis ve query_feedback_validation XEvents aracılığıyla görülebilir.
CE geri bildirimi tarafından ayarlanan ipuçları sys.query_store_query_hints katalog görünümü kullanılarak izlenebilir.
Geri bildirim bilgileri sys.query_store_plan_feedback katalog görünümü kullanılarak izlenebilir.
Sorguda Query Store aracılığıyla zorlanmış bir sorgu planı varsa, o sorgu için CE geri bildirimi kullanılmaz.
Sorgu sabit kodlanmış sorgu ipuçlarını kullanıyorsa veya kullanıcı tarafından ayarlanan Sorgu Deposu ipuçlarını kullanıyorsa, bu sorgu için CE geri bildirimi kullanılmaz. Daha fazla bilgi için bkz . Sorgu ipuçları ve Sorgu Deposu ipucu.
SQL Server 2022'den (16.x) başlayarak, ikincil çoğaltmalar için Sorgu Deposu etkinleştirildiğinde, kullanılabilirlik gruplarındaki ikincil çoğaltmalar için CE geri bildirimi çoğaltmaya duyarlı değildir. CE geri bildirimi şu anda yalnızca birincil çoğaltmalardan yararlanır. Yük devretme sırasında birincil veya ikincil kopyalara uygulanan geri bildirim kaybolur. Sorgu Deposu, SQL Server 2025(17.x) ile başlayan ikincil kullanılabilirlik grubu çoğaltmalarında kullanılabilir. Daha fazla bilgi için bkz. ikincil çoğaltmalar için Sorgu Deposu.
Kardinalite tahmini (CE) geri bildirimi için kalıcılık
Şunun için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği.
Kardinalite tahmini (CE) geri bildirimi, satır hedefi iyileştirmesinin kalıcı olması gereken senaryoları algılayabilir ve Sorgu Deposu ipucu biçiminde Sorgu Deposu'nda kalıcı hale getirme yoluyla bu değişikliği koruyabilir. Yeni iyileştirme, sorgunun gelecekteki yürütmeleri için kullanılır. CE geri bildirimi, geri bildirim senaryolarında ayrıntılı olarak belirtildiği gibi satır hedefi optimizasyonu sorgu desenlerinin dışında kalan diğer senaryolarda devam eder. CE geri bildirimi şu anda CE'nin bağıntı modeli tarafından kullanılan önermelerle ilgili seçicilik senaryolarını ve CE'nin kapsama modeli tarafından işlenen önermelerle ilgili birleştirme senaryolarını ele alır.
Bu özellik SQL Server 2022'de (16.x) tanıtıldı, ancak bu performans iyileştirmesi, veritabanı uyumluluk düzeyi 160 veya daha yüksek olduğunda, QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n ipucu 160 ya da üstünde olduğunda ve veritabanı için Sorgu Deposu etkinleştirilip "okuma yazma" modunda olduğunda kullanılabilir.
Kardinalite tahmini (CE) geri bildirimiyle ilgili bilinen sorunlar
| Sorun | Bulunan tarih | Statü | Çözümlenme tarihi |
|---|---|---|---|
| SQL Server 2022 (16.x) için Toplu Güncelleştirme 8'i belirli koşullar altında uyguladıktan sonra, SQL Server performansında yavaşlama. CE geri bildirimi etkinleştirildiğinde, CPU kullanımında beklenmeyen artışlarla birlikte çarpıcı Plan Önbellek bellek kullanımıyla karşılaşabilirsiniz. | Aralık 2023 | Çözümlendi | 22 Nisan 2024 (CU 12) |
Bilinen sorunlar ayrıntıları
SQL Server 2022 için Toplu Güncelleştirme 8'i uyguladıktan sonra belirli koşullar altında SQL Server performansı yavaşlıyor.
SQL Server 2022 (16.x) Toplu Güncelleştirme 8'den başlayarak, SQL Server CPU ve bellek kullanımında beklenmeyen artışlar gösterebilir. Ayrıca, RESOURCE_SEMAPHORE_QUERY_COMPILE beklemelerinde de bir artış gözlemlenebilir. Plan Önbelleği sınırlarına yaklaşan kullanımdaki Plan Önbelleği nesnelerinin sayısında sürekli bir artış gözlemleyebilirsiniz ve ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE, DBCC FREESYSTEMCACHE ya da DBCC FREEPROCCACHE gibi tekniklerle Plan Önbelleği'ni manuel olarak temizlemek yardımcı olmuyor. Bu davranış yalnızca birkaç müşteri tarafından gözlemlenmiştir.
Bu sorun tüm iş yüklerini etkilemez ve oluşturulan farklı planların sayısına ve CE geri bildirim özelliğini etkinleştirebilen planların sayısına bağlıdır. CE geri bildirimi, plan işleçlerini önemli model yanlışlıkları için analiz ederken, bu analiz aşamasında başvuruda bulunulduğu bir planın başvurulabileceği bir senaryo vardır. Bu durum, her zamanki En Son Kullanılan (LRU) algoritması kullanılarak planın bellekten kaldırılmasını engeller. LRU mekanizması, SQL Server'ın plan yok etme politikalarını uygulamasının bir yoludur. Sistem bellek baskısı altındaysa SQL Server da planları bellekten kaldırır. SQL Server yanlış başvurulan planları kaldırmaya çalıştığında, bu planları plan önbelleğinden kaldıramaz ve bu da önbelleğin büyümeye devam etmesine neden olur. Büyüyen önbellek, sonuçta daha fazla CPU ve bellek kullanan ek derlemelere neden olabilir. Daha fazla bilgi için bkz. Plan Cache Internals.
Belirti: Kullanımda olan ve SQL Planlarından veya Nesne Planlarından kirli olarak işaretlenen plan önbelleği girdilerinin sayısı zaman içinde 50.000 veya daha fazla olur. Cpu kullanımında beklenmeyen artışlarla birlikte bu düzeye yaklaşmaya başlayan plan önbelleği girdilerini gözlemlerseniz, sisteminiz bu sorunla karşılaşıyor olabilir. SQL Server 2022 (16.x) Toplu Güncelleştirme 12 ile bir düzeltme sağlanır. Bkz. KB5033663.
Sisteminizin kullandığı plan önbelleği girdilerinin sayısını izlemek için aşağıdaki örnekler, mevcut plan önbelleği girdilerinin sayısının zaman açısından bir noktası olarak kullanılabilir. Örneğin, zaman içinde düzenli aralıklarla kirli olarak işaretlenmiş plan önbelleği girdilerinin sayısını izlemek, bu olayı izlemenin bir yoludur.
SELECT
CASE
WHEN mce.[name] LIKE 'SQL Plan%' THEN 'SQL Plans'
WHEN mce.[name] LIKE 'Object Plan%' THEN 'Object Plans'
ELSE '[All other cache stores]'
END AS PlanType,
COUNT(*) AS [Number of plans marked to be removed]
FROM sys.dm_os_memory_cache_entries AS mce
LEFT OUTER JOIN sys.dm_exec_cached_plans AS ecp
ON mce.memory_object_address = ecp.memory_object_address
WHERE mce.is_dirty = 1
AND ecp.bucketid is NULL
GROUP BY
CASE
WHEN mce.[name] LIKE 'SQL Plan%' THEN 'SQL Plans'
WHEN mce.[name] LIKE 'Object Plan%' THEN 'Object Plans'
ELSE '[All other cache stores]'
END;
Önceki örnekle aynı bilgileri sağlayan ve ek performans ölçümlerini gözlemlemenizi sağlayan başka bir sorgu kümesi. Plan Önbelleği vurum oranları ve derleme sayıları, toplu istekler/saniye sayısına oranla azalış gösterir. Sisteminizi zaman içinde izlemek için aşağıdaki sorgular kullanılabilir. Önbellek İsabet Oranı'nı (beklenmeyen düşüşler), kullanımdaki Önbellek Nesneleri'nin (sayısı azalmadan 50.000'e yaklaşan düzeylere yükselmesi) ve Derlemeler/sn artışı ile karşılaştırıldığında beklenenden daha düşük olan Toplu İstekler/sn oranını gözlemleyin.
--SQL Plan (Adhoc and Prepared plans)
SELECT
CASE
WHEN [counter_name] = 'Cache Hit Ratio' THEN 'Cache Hit Ratio'
WHEN [counter_name] = 'Cache Object Counts' THEN 'Cache Object Counts'
WHEN [counter_name] = 'Cache Objects in use' THEN 'Cache Objects in use'
WHEN [counter_name] = 'Cache Pages' THEN 'Cache Pages'
END AS [SQLServer:Plan Cache (SQL Plans)],
CASE
WHEN [counter_name] = 'Cache Hit Ratio' THEN NULL
ELSE FORMAT(cntr_value, '#,###')
END AS [Counter Value],
CASE
WHEN [counter_name] = 'Cache Hit Ratio' THEN
FORMAT(TRY_CONVERT(DECIMAL(5, 2), (cntr_value * 1.0 / NULLIF((SELECT cntr_value
FROM sys.dm_os_performance_counters WHERE
[object_name] LIKE '%:Plan Cache%' AND [counter_name] = 'Cache Hit Ratio Base'
AND instance_name LIKE 'SQL Plan%'), 0))), '0.00%')
END AS [SQL Plan Cache Hit Ratio]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%:Plan Cache%'
AND [counter_name] IN ('Cache Hit Ratio', 'Cache Object Counts', 'Cache Objects in use', 'Cache Pages')
AND instance_name LIKE 'SQL Plan%'
ORDER BY [counter_name];
--Module/Stored procedure based plans
SELECT
CASE
WHEN [counter_name] = 'Cache Hit Ratio' THEN 'Cache Hit Ratio'
WHEN [counter_name] = 'Cache Object Counts' THEN 'Cache Object Counts'
WHEN [counter_name] = 'Cache Objects in use' THEN 'Cache Objects in use'
WHEN [counter_name] = 'Cache Pages' THEN 'Cache Pages'
END AS [SQLServer:Plan Cache (Object Plans)],
CASE
WHEN [counter_name] = 'Cache Hit Ratio' THEN NULL
ELSE FORMAT(cntr_value, '#,###')
END AS [Counter Value],
CASE
WHEN [counter_name] = 'Cache Hit Ratio' THEN
FORMAT(TRY_CONVERT(DECIMAL(5, 2), (cntr_value * 1.0 / NULLIF((SELECT cntr_value
FROM sys.dm_os_performance_counters WHERE
[object_name] LIKE '%:Plan Cache%' AND [counter_name] = 'Cache Hit Ratio Base'
AND instance_name LIKE 'Object Plan%'), 0))), '0.00%')
END AS [SQL Plan Cache Hit Ratio]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%:Plan Cache%'
AND [counter_name] IN ('Cache Hit Ratio', 'Cache Object Counts', 'Cache Objects in use', 'Cache Pages')
AND instance_name LIKE 'Object Plan%'
ORDER BY [counter_name];
SELECT
CASE
WHEN [counter_name] = 'Batch Requests/sec' THEN 'Batch Requests/sec'
WHEN [counter_name] = 'SQL Compilations/sec' THEN 'SQL Compilations/sec'
END AS [SQLServer:SQL Statistics],
FORMAT(cntr_value, '#,###') AS [Counter Value]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%:SQL Statistics%'
AND counter_name IN ('Batch Requests/sec', 'SQL Compilations/sec'
);
Geçici çözüm
Sisteminiz daha önce açıklanan belirtilerle karşılaşmaya devam ederse, Toplu Güncelleştirme 12 KB5033663 uygulandıktan sonra CE geri bildirim özelliği veritabanı düzeyinde devre dışı bırakılabilir.
Bu sorundan kaynaklanan plan önbelleği belleğini geri kazanmak için SQL Server örneğinin yeniden başlatılması gerekir. Bu yeniden başlatma eylemi, CE geri bildirim özelliği devre dışı bırakıldıktan sonra yapılabilir. CE geri bildirimini veritabanı düzeyinde devre dışı bırakmak için CE_FEEDBACK kullanın. Örneğin, kullanıcı veritabanında:
ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK = OFF;
Geri bildirim ve raporlama sorunları
Geri bildirim veya sorular için e-posta CEFfeedback@microsoft.com