Dela via


Metodtips för Query Store-tips

Gäller för: SQL Server 2022 (16.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL Database i Förhandsversion av Microsoft Fabric

Den här artikeln beskriver bästa metoder för att använda Query Store-hints. Tips i frågelagret möjliggör att påverka formen på frågeplaner utan att ändra programkod.

Användningsfall för Query Store-tips

Tänk på följande användningsfall som idealiska för Query Store-tips. Mer information finns i När du ska använda Query Store-tips.

Caution

Eftersom SQL Server Query Optimizer vanligtvis väljer den bästa körningsplanen för en fråga rekommenderar vi att du bara använder tips som en sista utväg för erfarna utvecklare och databasadministratörer. Mer information finns i Frågetips.

När koden inte kan ändras

Med hjälp av Query Store-tips kan du påverka körningsplanerna för frågor utan att ändra programkod eller databasobjekt. Ingen annan funktion gör att du snabbt och enkelt kan använda frågetips.

Du kan använda Query Store-tips, till exempel för att dra nytta av ETL-arbetsbelastningar (extract-transform-load) utan att distribuera om kod. Lär dig hur du förbättrar massladdning med tips för användning av Query Store i den här 14 minuter långa videon.

Query Store-tips är enkla frågejusteringsmetoder, men om en fråga blir problematisk bör den åtgärdas med mer omfattande kodändringar. Om du regelbundet hittar behovet av att tillämpa Query Store-tips på en fråga bör du överväga en större frågeomskrivning. SQL Server Query Optimizer väljer vanligtvis den bästa körningsplanen för en fråga. Vi rekommenderar att du bara använder tips som en sista utväg för erfarna utvecklare och databasadministratörer.

Information om vilka frågetips som kan användas finns i frågetips som stöds.

Under hög transaktionsbelastning eller med verksamhetskritisk kod

Om kodändringar är opraktiska på grund av höga drifttidskrav eller transaktionell belastning kan Query Store-hints snabbt tillämpa frågehints på befintliga frågearbetsbelastningar. Det är enkelt att lägga till och ta bort Query Store-tips.

Query Store-hints kan läggas till och tas bort från frågebatcher för att justera prestandan inom tidsfönster som är anpassade för intensiva perioder av exceptionell arbetsbelastning.

Som ersättning för planguider

Före Query Store-ledtrådar måste en utvecklare förlita sig på planguider för att utföra liknande uppgifter, vilka kan vara komplicerade att använda. Query Store-tips är integrerade med Query Store-funktioner i SQL Server Management Studio (SSMS) för visuell utforskning av frågor.

Med planguider är det nödvändigt att söka igenom alla planer med hjälp av frågefragment. Query Store-hintfunktionen kräver inte exakta matchande frågor för att påverka den resulterande frågeplanen. Query Store-hints kan tillämpas på en query_id i Query Store-datauppsättningen.

Query Store-hints åsidosätter hårdkodade hints på uttalsnivå och befintliga planguider.

Överväg en nyare kompatibilitetsnivå

Query Store-tips kan vara en värdefull metod när en nyare databaskompatibilitetsnivå inte är tillgänglig för dig på grund av leverantörsspecifikation eller större testfördröjningar, till exempel. När en högre kompatibilitetsnivå är tillgänglig för en databas bör du överväga att uppgradera databasens kompatibilitetsnivå för en enskild fråga för att dra nytta av de senaste prestandaoptimeringarna och funktionerna i SQL Server.

Om du till exempel har en SQL Server 2022-instans (16.x) med en databas på kompatibilitetsnivå 140 kan du fortfarande använda Query Store-tips för att köra enskilda frågor på kompatibilitetsnivå 160. Du kan använda följande tips:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';

För en komplett handledning, se Query Store-ledtrådar Exempel.

Överväg en äldre kompatibilitetsnivå efter uppgraderingen

Ett annat fall där Query Store-tips kan vara till hjälp är när frågor inte kan ändras direkt efter en SQL Server-instansmigrering eller uppgradering. Använd Query Store-tips för att tillämpa en tidigare kompatibilitetsnivå för en fråga tills den kan skrivas om eller på annat sätt åtgärdas för att fungera bra på den senaste kompatibilitetsnivån. Identifiera avvikande frågor som regresserade med en högre kompatibilitetsnivå med hjälp av query store-rapporten för regresserade frågor, med verktyget Frågejusteringsassistenten under en migrering eller annan programtelemetri på frågenivå. Mer information om skillnaderna mellan kompatibilitetsnivåer finns i Skillnader mellan kompatibilitetsnivåer.

Efter prestandatestning av den nya kompatibilitetsnivån och distribution av Query Store-tips på det här sättet kan du uppgradera hela databasens kompatibilitetsnivå samtidigt som du behåller viktiga problematiska frågor på den tidigare kompatibilitetsnivån, utan några kodändringar.

Blockera framtida körning av problematiska sökfrågor

Du kan använda frågetipset ABORT_QUERY_EXECUTION för att blockera framtida körning av kända problematiska frågor, till exempel nonessential-frågor som orsakar hög resursförbrukning och påverkar kritiska programarbetsbelastningar.

Note

Det ABORT_QUERY_EXECUTION frågetipset är endast tillgängligt i Förhandsversionen av Azure SQL Database, Azure SQL Managed InstanceAUTD och SQL Server 2025 (17.x).

Om du till exempel vill blockera framtida körning av query_id 39 kör du sys.sp_query_store_set_hints på följande sätt:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION (USE HINT (''ABORT_QUERY_EXECUTION''))';

Om du vill avblockera samma fråga, kör sys.sp_query_store_clear_hints:

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;

Mer information finns i Tipsexempel för Query Store.

Följande gäller:

  • När du anger det här tipset för en fråga misslyckas ett försök att köra frågan med fel 8778, allvarlighetsgrad 16, Frågekörningen har avbrutits eftersom ABORT_QUERY_EXECUTION tips angavs.

  • Om du vill avblockera en fråga kan du rensa tipset genom att skicka query_id-värdet till parametern @query_id i sys.sp_query_store_clear_hints lagrade proceduren.

    • Den här lagrade proceduren rensar alla ledtrådar för en sökfråga. Om du vill behålla befintliga tips när du avblockerar frågan använder du sys.sp_query_store_set_hints, tar bort tipset ABORT_QUERY_EXECUTION men behåller andra tips.
  • Du kan använda systemvyer för att hitta frågor i Query Store som är blockerade, som i följande exempelfråga:

    SELECT qsh.query_id,
           q.query_hash,
           qt.query_sql_text
    FROM sys.query_store_query_hints AS qsh
         INNER JOIN sys.query_store_query AS q
             ON qsh.query_id = q.query_id
         INNER JOIN sys.query_store_query_text AS qt
             ON q.query_text_id = qt.query_text_id
    WHERE UPPER(qsh.query_hint_text) LIKE '%ABORT[_]QUERY[_]EXECUTION%';
    
  • För att hämta värdet query_id måste minst en frågekörning registreras i Query Store. Den här exekveringen måste inte lyckas. Det innebär att framtida genomförandet av tidsbegränsade eller avbrutna frågor kan blockeras.

  • Om du behöver blockera eller avblockera alla frågor med en specifik frågehash kan du överväga att använda ett automatiseringsskript. Till exempel är dbo.sp_query_store_modify_hints_by_query_hash ett exempel på lagrad procedur som anropar den sys.sp_query_store_set_hints eller sys.sp_query_store_clear_hints system lagrade proceduren i en loop för alla query_id värden som matchar en frågehash.

  • Om en frågeställning redan körs vid tidpunkten när du blockerar den, fortsätter dess körning. Du kan använda KILL-instruktionen för att avbryta frågan.

    • Stoppade frågor registreras inte i Query Store. Om frågan ännu inte finns i Query Store måste du låta frågan slutföras eller överskrida tidsgränsen för att få en query_id som du kan blockera.
  • När en fråga blockeras av tipset ABORT_QUERY_EXECUTION anges kolumnerna execution_type och execution_type_desc i vyn sys.query_store_runtime_stats till 4 respektive Undantag .

  • Precis som med alla Query Store-tips måste du ha behörighet till ALTER databasen för att ange och rensa tipset ABORT_QUERY_EXECUTION .

Överväganden kring ledtrådar i Query Store

Tänk på följande scenarier när du distribuerar Query Store-tips.

Datadistributionändringar

Planguider, framtvingade planer via Query Store och Query Store-tips åsidosätter optimerarens beslutsfattande. Query Store-tipset kan vara fördelaktigt nu, men inte i framtiden. Om ett Query Store-tips till exempel hjälper en fråga i tidigare datadistribution kan det vara kontraproduktivt om storskaliga DML-åtgärder ändrar data. En ny datadistribution kan göra att optimeraren fattar ett bättre beslut än tipset. Det här scenariot är den vanligaste konsekvensen av att tvinga fram ett planenligt beteende.

Utvärdera regelbundet din strategi för tips i Query Store

Omvärdera din befintliga strategi för tips i Query Store i följande fall:

  • Efter kända stora datadistributionsändringar.
  • När resurserna som är tillgängliga för databasen ändras. Till exempel när beräkningsstorleken för din virtuella Azure SQL Database-, SQL Managed Instance- eller SQL Server-dator ändras.
  • Där planfixeringen har blivit långlivad. Query Store-tips används bäst för kortsiktiga korrigeringar.
  • Oväntade prestandaregressioner.

Bred påverkanspotential

Query Store-hintar påverkar alla körningar av frågan, oavsett parameteruppsättning, källprogram, användare eller resultat. Vid oavsiktlig prestandaregression kan Query Store-tips som skapats med sys.sp_query_store_set_hints enkelt raderas med sys.sp_query_store_clear_hints.

Genomför noggranna belastningstester för verksamhetskritiska eller känsliga system innan du använder Query Store-hints i produktion.

Tvingad parameterisering och RECOMPILE-tips stöds inte

Det går inte att använda frågetipset RECOMPILE med Query Store-tips när databasalternativet PARAMETERIZATION är inställt på FORCED. Mer information finns i Riktlinjer för användning av tvingad parameterisering.

Tipset RECOMPILE är inte kompatibelt med tvingad parameterisering som angetts på databasnivå. Om databasen använder tvingad parameterisering och tipset RECOMPILE är en del av tipssträngen som angetts i Query Store för en fråga ignorerar databasmotorn tipset RECOMPILE och tillämpar andra tips om det anges. Från och med juli 2022 i Azure SQL Database utfärdas dessutom en varning (felkod 12461) som anger att tipset RECOMPILE ignorerades.

Information om vilka frågetips som kan användas finns i frågetips som stöds.