Aracılığıyla paylaş


Query Store ipuçları

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft 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.

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.

Sorgu Deposu İpuçları için iş akışı.

Ö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 TOP satır hedefi iyileştirmeyi devre dışı bırakın.

Sorgu Deposu ipuçlarını kullanmak için:

  1. Değiştirmek istediğiniz sorgu deyiminin Sorgu Deposu query_id tanımlayın. Bunu çeşitli yollarla yapabilirsiniz:

  2. Sorguya uygulamak istediğiniz sys.sp_query_store_set_hints ve sorgu ipucu dizesiyle query_id yü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 RECOMPILE kullanan Sorgu Deposu ipuçları herhangi bir destekleyici uyumluluk düzeyinde kullanılabilir.
  • 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_id yoksa 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_EXECUTION ipucu 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 ve RECOMPILE ipucu sorgunun Sorgu Deposu'ndaki ipuçlarının bir parçasıysa, Veritabanı Altyapısı RECOMPILE ipucunu yoksayar ve belirtilmişse diğer ipuçlarını uygular.
    • Veritabanı Motoru, RECOMPILE ipucunun 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.
  • 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;