Dela via


Metodtips för Query Store-tips

gäller för: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL-databas i 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.

Försiktighet

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 till exempel använda Query Store-tips för att gynna ETL 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. Tipsfunktionen i Query Store kräver inte exakt 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:

EXEC 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 hjälpa ä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 har regresserats med en högre kompatibilitetsnivå med hjälp av query store-rapporten med regresserade frågor, med verktyget Query Tuning Advisor 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 icke-nödvändiga frågor som orsakar hög resursförbrukning och påverkar kritiska programarbetsbelastningar.

Anmärkning

För närvarande är frågetipset ABORT_QUERY_EXECUTION (förhandsversion) endast tillgängligt i Azure SQL Database.

Om du till exempel vill blockera framtida körning av query_id 39 kör du följande instruktion:

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

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 den sys.sp_query_store_clear_hints lagrade proceduren.
  • Du kan använda följande exempelfråga för att hitta alla frågor i Query Store som blockeras med systemvyer, från och med systemvyn sys.query_store_query_hints (Transact-SQL) :
    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 körningen behöver inte lyckas. Det innebär att framtida genomförandet av tidsbegränsade eller avbrutna frågor kan blockeras.
  • 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

Utvä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.