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.
Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'teki SQL veritabanı
Bu makalede, Sorgu Deposu kullanılarak sorgu ipuçlarının nasıl uygulanacağı özetlenmiştir. Sorgu Deposu ipuçları, uygulama kodunu değiştirmeden sorgu planlarını şekillendirmek için kullanımı kolay bir yöntem sağlar.
- Sorgu Deposu ile yapılandırma ve yönetme hakkında daha fazla bilgi için bkz. Sorgu Deposu kullanarak performansı izleme.
- Sorgu Deposu ile eyleme dönüştürülebilir bilgileri bulma ve performansı ayarlama hakkında bilgi için bkz. Sorgu Deposu ile performansı ayarlama.
- Azure SQL Veritabanı'nda Sorgu Deposu'yu çalıştırma hakkında bilgi için bkz. Azure SQL Veritabanı'nde Sorgu Deposunu çalıştırma.
Caution
SQL Server Sorgu İyileştiricisi genellikle sorgu için en iyi yürütme planını seçtiğinden, deneyimli geliştiriciler ve veritabanı yöneticileri için son çare olarak yalnızca ipuçlarını kullanmanızı öneririz. Daha fazla bilgi için bkz. Sorgu ipuçları.
Sorgu Deposu ipuçlarına genel bakış için bu videoyu izleyin:
Overview
İdeal olarak, Sorgu İyileştiricisi bir sorgu için en uygun yürütme planını seçer.
En uygun plan seçilmediyse, geliştirici veya veritabanı yöneticisi (DBA) belirli koşullar için el ile iyileştirme yapmak isteyebilir. Sorgu ipuçları OPTION yan tümcesi aracılığıyla belirtilir ve sorgu yürütme davranışını etkilemek için kullanılabilir. Sorgu ipuçları, performansla ilgili çeşitli sorunlara yerelleştirilmiş çözümler sağlamaya yardımcı olsa da, özgün sorgu metninin yeniden yazılmasını gerektirir. Veritabanı yöneticileri ve geliştiriciler, sorgu ipucu eklemek için her zaman doğrudan Transact-SQL kodunda değişiklik yapamayabilir. Transact-SQL bir uygulamaya sabit kodlanmış veya uygulama tarafından otomatik olarak oluşturulmuş olabilir. Daha önce, bir geliştiricinin kullanımı karmaşık olabilecek plan kılavuzlarınagüvenmesi gerekebilirdi.
Sorgu Deposu ipuçları, doğrudan sorgu Transact-SQL metni değiştirmeden sorguya sorgu ipucu eklemenizi sağlayarak bu sorunu çözer. Hangi sorgu ipuçlarının uygulanabileceği hakkında bilgi için bkz. Desteklenen sorgu ipuçları.
Sorgu Deposu ipuçları ne zaman kullanılır?
Adından da anlaşılacağı gibi, bu özellik hem genişletir hem de Sorgu Deposu'ya dayanmaktadır. Sorgu Deposu sorguların, yürütme planlarının ve ilişkili çalışma zamanı istatistiklerinin yakalanmasını sağlar. Sorgu Deposu, genel performans ayarlama müşteri deneyimini büyük ölçüde basitleştirir. SQL Server 2016 (13.x) ilk olarak Sorgu Deposu'nu kullanıma sunarken şimdi SQL Server 2022 (16.x), Azure SQL Yönetilen Örneği, Azure SQL Veritabanı ve Microsoft Fabric'teki SQL veritabanında varsayılan olarak etkinleştirilmiştir.
Önce sorgu yürütülür, ardından Query Store tarafından yakalanır. Ardından DBA, sorgu üzerinde bir Sorgu Deposu ipucu oluşturur. Bundan sonra sorgu, Sorgu Deposu ipucu kullanılarak yürütülür.
Sorgu Deposu ipuçlarının sorgu düzeyi performans sorunlarına yardımcı olabileceği örnekler:
- Her yürütmede bir sorguyu yeniden derle.
- Toplu ekleme işlemi için bellek tahsis boyutunu sınırla.
- İstatistikleri güncelleştirirken en yüksek paralellik derecesini sınırlayın.
- İç içe döngü birleşimi yerine Hash birleşimi kullanın.
- Veritabanındaki diğer her şeyi 150 uyumluluk düzeyinde tutarken belirli bir sorgu için uyumluluk düzeyini 110 kullanın.
- Sorgu için
SELECT TOPsatır hedefi iyileştirmeyi devre dışı bırakın.
Sorgu Deposu ipuçlarını kullanmak için:
Değiştirmek istediğiniz sorgu deyiminin Sorgu Deposu
query_idtanımlayın. Bunu çeşitli yollarla yapabilirsiniz:- Sorgu Deposu katalog görünümlerini sorgulama (Transact-SQL).
- SQL Server Management Studio yerleşik Sorgu Deposu raporlarını kullanma.
- Azure SQL Veritabanı için Azure portal Sorgu Performansı İçgörüleri'nin kullanılması.
Sorguya uygulamak istediğiniz
sys.sp_query_store_set_hintsve sorgu ipucu dizesiylequery_idyürütebilirsiniz. Bu dize bir veya daha fazla sorgu ipucu içerebilir. Tam bilgi için bkz. sys.sp_query_store_set_hints.
Sorgu Deposu ipuçları oluşturulduktan sonra kalıcı olur ve yeniden başlatma ve yük devretme işlemlerinden etkilenmez. Sorgu Deposu ipuçları, sabit kodlanmış deyim düzeyi ipuçlarını ve mevcut plan kılavuzu ipuçlarını geçersiz kılar.
Sorgu ipucu sorgu iyileştirme için nelerin mümkün olduğuyla çelişiyorsa, sorgu yürütme engellenmez ve ipucu uygulanmaz. bir ipucunun sorgunun başarısız olmasına neden olacağı durumlarda ipucu yoksayılır ve en son hata ayrıntıları sys.query_store_query_hints'de görüntülenebilir.
Sorgu Deposu ipuçlarını kullanmadan önce
Sorgu Deposu ipuçlarını kullanmaya başlamadan önce aşağıdakileri göz önünde bulundurun.
- Olası yeni Sorgu Deposu ipuçları için sorguları değerlendirmeden önce istatistik bakımını ve dizin bakımını (gerekirse) tamamlayın. İstatistik bakımı ve daha az düzeyde dizin bakımı, aksi takdirde sorgu ipucu gerektiren sorunu çözebilir.
- Sorgu Deposu ipuçlarını kullanmadan önce, sorgu ipucu gerektiren sorunu çözdüğünü görmek için uygulama veritabanınızı en son uyumluluk düzeyinde test edin.
- Örneğin, Sql Server 2022'de (16.x) Uyumluluk düzeyi 160'ın altında Parametre Duyarlı Plan (PSP) iyileştirmesi kullanıma sunulmuştur. Nonuniform veri dağıtımlarını ele almak için sorgu başına birden çok etkin plan kullanır. Ortamınız en son uyumluluk düzeyini kullanamıyorsa, ipucunu
RECOMPILEkullanan Sorgu Deposu ipuçları herhangi bir destekleyici uyumluluk düzeyinde kullanılabilir.
- Örneğin, Sql Server 2022'de (16.x) Uyumluluk düzeyi 160'ın altında Parametre Duyarlı Plan (PSP) iyileştirmesi kullanıma sunulmuştur. Nonuniform veri dağıtımlarını ele almak için sorgu başına birden çok etkin plan kullanır. Ortamınız en son uyumluluk düzeyini kullanamıyorsa, ipucunu
- Sorgu Deposu ipuçları, Veritabanı Altyapısı varsayılan sorgu planı davranışını geçersiz kılar. Sorgu Deposu ipuçlarını yalnızca performansla ilgili sorunları çözmek için gerekli olduğunda kullanmalısınız.
- Veri hacmi ve dağıtım değişiklikleri ve veritabanı geçişleri projeleri sırasında Sorgu Deposu ipuçlarını, deyim düzeyi ipuçlarını, plan kılavuzlarını ve Sorgu Deposu zorlamalı planlarını yeniden değerlendirmeniz gerekir. Veri hacminde ve dağıtımında yapılan değişiklikler Sorgu Deposu ipuçlarının en iyi olmayan yürütme planları oluşturmasına neden olabilir.
Sorgu Deposu ipuçları sistem saklı yordamları
İpuçları oluşturmak veya güncelleştirmek için sys.sp_query_store_set_hintskullanın. İpuçları, N'OPTION (...)'geçerli bir dize biçiminde belirtilir.
- Sorgu Deposu ipucu oluşturduğunuzda, belirli bir
query_idiçin Sorgu Deposu ipucu yoksa yeni bir Sorgu Deposu ipucu oluşturulur. - Sorgu Deposu ipucunu oluşturduğunuzda veya güncelleştirdiğinizde, belirli bir
query_idiçin Sorgu Deposu ipucu zaten varsa, sağlanan son değer ilişkili sorgu için önceden belirtilen değerleri geçersiz kılar. -
query_idyoksa bir hata oluşur.
Sorgu Deposu ipucu olarak desteklenen ipuçlarının tam listesi için bkz. sys.sp_query_store_set_hints.
Bir query_idile bağlantılı ipuçlarını kaldırmak için , sys.sp_query_store_clear_hintskullanın.
Tip
Sorgu karmasıyla eşleşen tüm query_id değerler için ipuçları ayarlamanız veya temizlemeniz gerekebilir.
dbo.sp_query_store_modify_hints_by_query_hash, bunu gerçekleştirmek için döngüde sys.sp_query_store_set_hints veya sys.sp_query_store_clear_hints sistem saklı yordamını çağıran bir örnek saklı yordamdır.
Yürütme Planı XML öznitelikleri
İpuçları uygulandığında, StmtSimple öğesinde XML biçiminde aşağıdaki sonuç kümesi görüntülenir:
| Attribute | Description |
|---|---|
QueryStoreStatementHintText |
Sorguya uygulanan gerçek Sorgu Deposu ipuçları |
QueryStoreStatementHintId |
Sorgu ipucunun benzersiz tanımlayıcısı |
QueryStoreStatementHintSource |
Sorgu Deposu ipucunun kaynağı (örneğin, User) |
Note
Bu XML öğeleri , SET STATISTICS XML ve SET SHOWPLAN_XML Transact-SQL komutlarının çıkışı aracılığıyla kullanılabilir.
Sorgu Mağazası ipuçları ve özelliklerin birlikte çalışabilirliği
- Sorgu Deposu ipuçları diğer sabit kodlanmış deyim düzeyi ipuçlarını ve plan kılavuzlarını geçersiz kılar.
-
ABORT_QUERY_EXECUTIONipucu haricinde, Sorgu Deposu ipuçlarına sahip sorgular her zaman yürütülür. Aksi takdirde hataya neden olabilecek çelişen Sorgu Deposu ipuçları yoksayılır. - Sorgu Deposu ipuçları çelişirse, Veritabanı Altyapısı sorgu yürütmeyi engellemez ve Sorgu Deposu ipucu uygulanmaz.
- Sorgu Deposu ipuçları, basit parametreleştirmeye uygun deyimler için desteklenmez.
- İpucu
RECOMPILE, veritabanı düzeyinde ayarlanmış zorlamalı parametreleme ile uyumlu değildir. Veritabanında zorlama parametreleştirme ayarlanmışsa veRECOMPILEipucu sorgunun Sorgu Deposu'ndaki ipuçlarının bir parçasıysa, Veritabanı AltyapısıRECOMPILEipucunu yoksayar ve belirtilmişse diğer ipuçlarını uygular.- Veritabanı Motoru,
RECOMPILEipucunun yoksayıldığını belirten bir uyarı (hata kodu 12461) gönderir. - Zorlamalı parametreleştirme kullanım örneğiyle ilgili dikkat edilmesi gerekenler hakkında daha fazla bilgi için bkz. Zorlamalı Parametreleştirme Kullanma Yönergeleri.
- Veritabanı Motoru,
- El ile oluşturulan Sorgu Deposu ipuçları Sorgu Deposu temizlemesinden muaf tutulur. İpucu ve sorgu, otomatik saklama yakalama politikası tarafından temizlenmez.
- Sorgular kullanıcılar tarafından el ile kaldırılabilir. Bu, ilişkili Sorgu Deposu ipucunu da kaldırır.
- CE Geri Bildirim tarafından otomatik olarak oluşturulan Sorgu Deposu ipuçları, yakalama politikasının otomatik saklama süresine tabi olarak temizlenebilir.
- DOP geri bildirim ve bellek tahsis geri bildirimi, Sorgu Deposu ipuçlarını kullanmadan sorgu davranışını şekillendirir. Sorgular otomatik saklama yakalama ilkesi tarafından temizlendiğinde DOP geri bildirimi ve bellek verme geri bildirim verileri de temizlenir.
- CE geri bildirimi manuel olarak uygulanan aynı Query Store ipucunu oluşturursanız, ipucuna sahip sorgu artık otomatik tutma politikası tarafından temizlenemez.
Sorgu Mağazası ipuçları ve sekonder replikalar
İkincil çoğaltmalar için Sorgu Deposu etkinleştirilmediği sürece Sorgu Deposu ipuçlarının ikincil çoğaltmalar üzerinde hiçbir etkisi yoktur. Daha fazla bilgi için bkz. Okunabilir ikincil öğeler için Sorgu Deposu.
- SQL Server 2022 (16.x) ve önceki sürümlerde Sorgu Deposu ipuçları yalnızca birincil çoğaltmaya uygulanabilir.
- SQL Server 2025 (17.x) ve sonraki sürümlerinde, ikincil çoğaltmalar için Sorgu Deposu etkinleştirildiğinde, kullanılabilirlik gruplarındaki ikincil çoğaltmalara Sorgu Deposu ipuçları uygulanabilir. Tam platform desteği için bkz. Okunabilir ikincil öğeler için Sorgu Deposu.
Sorgu Deposu'nun ikincil çoğaltmalarda desteklendiği yer:
- İkincil çoğaltmalar için Sorgu Deposu etkinleştirildiğinde yalnızca belirli bir çoğaltma grubunda geçerli olacak bir Sorgu Deposu ipucu ekleyebilirsiniz. Bunu yapmak için
@replica_group_idçağırırken parametresini kullanın. Buna karşılık, sys.sp_query_store_clear_query_hints kullanarak belirli bir çoğaltma grubundan Sorgu Deposu ipucunu kaldırabilirsiniz. - sys.query_store_replicas sorgulayarak kullanılabilir çoğaltma gruplarını bulun.
- sys.query_store_plan_forcing_locationskullanarak ikincil çoğaltmalara zorlanan planları bulun.
Examples
A. Sorgu Deposu ipuçları demonstrasyonu
Azure SQL Veritabanı'ndaki Sorgu Deposu ipuçlarının aşağıdaki kılavuzunda BACPAC dosyası (.bacpac) aracılığıyla içeri aktarılan bir veritabanı kullanılır. Yeni bir veritabanını Azure SQL Veritabanı sunucusuna aktarmayı öğrenin. Bkz . Hızlı Başlangıç: Azure SQL Veritabanı'nda veya Azure SQL Yönetilen Örneği'nde bir bacpac dosyasını veritabanına aktarma.
-- ************************************************************************ --
-- Query Store hints demo
-- Demo uses "PropertyMLS" database which can be imported from BACPAC here:
-- https://github.com/microsoft/sql-server-samples/tree/master/samples/features/query-store
-- Email QSHintsFeedback@microsoft.com for questions\feedback
-- ************************************************************************ --
/*
Demo prep, connect to the PropertyMLS database
*/
ALTER DATABASE [PropertyMLS] SET QUERY_STORE CLEAR;
ALTER DATABASE CURRENT SET QUERY_STORE = ON;
ALTER DATABASE CURRENT SET QUERY_STORE (QUERY_CAPTURE_MODE = ALL);
GO
-- Should be READ_WRITE
SELECT actual_state_desc
FROM sys.database_query_store_options;
GO
/*
You can verify Query Store Hints in sys.query_store_query_hints.
Checking if any already exist (should be none).
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
/*
The PropertySearchByAgent stored procedure has a parameter
used to filter AgentId. Looking at the statistics for AgentId,
you will see that there is a big skew for AgentId 101.
*/
SELECT hist.range_high_key AS [AgentId],
hist.equal_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'NCI_Property_AgentId';
-- Show actual query execution plan to see plan compiled.
-- Agent with many properties will have a scan with parallelism.
EXEC [dbo].[PropertySearchByAgent] 101;
-- Agents with few properties still re-use this plan (assuming no recent plan eviction).
EXEC [dbo].[PropertySearchByAgent] 4;
/*
Now let's find the query_id associated with this query.
*/
SELECT query_sql_text, q.query_id
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY ListingPrice DESC%' and query_sql_text not like N'%query_store%';
GO
/*
We can set the hint associated with the query_id returned in the previous result set, as below.
Note, we can designate one or more query hints
*/
EXEC sp_query_store_set_hints @query_id=5, @value = N'OPTION(RECOMPILE)';
GO
/*
You can verify Query Store Hints in sys.query_store_query_hints
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
-- Execute both at the same time and show actual query execution plan.
-- You should see two different plans, one for AgentId 101 and one for AgentId 4.
EXEC [dbo].[PropertySearchByAgent] 101;
EXEC [dbo].[PropertySearchByAgent] 4;
GO
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
/*
We can remove the hint using sp_query_store_clear_query_hints
*/
EXEC sp_query_store_clear_hints @query_id = 10;
GO
/*
That Query Store Hint is now removed
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
-- Execute both at the same time and show actual query execution plan.
-- You should see one plan again.
EXEC [dbo].[PropertySearchByAgent] 101;
EXEC [dbo].[PropertySearchByAgent] 4;
GO
B. Sorgu Deposu'nda sorgu tanımlama
Aşağıdaki örnek, yürütülen bir sorgu metni parçası için 'ü döndürmek amacıyla sys.query_store_query_text ve query_id sorgular.
Bu gösterimde, ayarlamaya çalıştığımız sorgu SalesLT örnek veritabanındadır.
SELECT * FROM SalesLT.Address as A
INNER JOIN SalesLT.CustomerAddress as CA
on A.AddressID = CA.AddressID
WHERE PostalCode = '98052' ORDER BY A.ModifiedDate DESC;
Sorgu Deposu, sorgu verilerini sistem görünümlerine hemen yansıtmaz.
Sorgu Deposu sistem kataloğu görünümlerinde sorguyu tanımlayın:
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%PostalCode =%'
AND query_sql_text not like N'%query_store%';
GO
Aşağıdaki örneklerde, SalesLT veritabanındaki önceki sorgu örneği query_id 39 olarak tanımlanmıştır.
Tanımlandıktan sonra, yapılandırılan bellek sınırının yüzdesinde en fazla bellek verme boyutunu query_idzorlamak için ipucunu uygulayın:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
Sorgu ipuçlarını aşağıdaki söz dizimiyle de uygulayabilirsiniz; örneğin, eski kardinalite tahmin aracınızorlama seçeneği:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Virgülle ayrılmış bir listeyle birden çok sorgu ipucu uygulayabilirsiniz:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
query_id 39 için Sorgu Deposu ipucunu gözden geçirin:
SELECT query_hint_id, query_id, query_hint_text, last_query_hint_failure_reason, last_query_hint_failure_reason_desc, query_hint_failure_count, source, source_desc
FROM sys.query_store_query_hints
WHERE query_id = 39;
Son olarak, query_idkullanarak ipucunu 39'dan kaldırın.
EXEC sys.sp_query_store_clear_hints @query_id = 39;
İlgili içerik
- sys.query_store_query_hints (Transact-SQL)
- sys.sp_query_store_set_hints (Transact-SQL)
- sys.sp_query_store_clear_hints (Transact-SQL)
- Yürütme Planını XML Biçiminde Kaydetme
- Yürütme planlarını görüntüleme ve kaydetme
- Sorgu ipuçları (Transact-SQL)
- Sorgu Deposu ile iş yüklerini izlemeye yönelik en iyi yöntemler
- Sorgu Deposu ipuçları en iyi yöntemler
- Sorgu Deposu kullanarak performansı izleme
- Azure SQL Veritabanı'nda en yüksek paralellik derecesini (MAXDOP) yapılandırma