Förstå frågetips

Slutförd

Frågeindikatorer är alternativ eller strategier som kan tillämpas för att tvinga frågeprocessorn att använda en viss operator i utförandeplanen för SELECT, INSERT, UPDATE eller DELETE-instruktioner. Frågetips åsidosätter alla körningsplaner som frågeprocessorn kan välja för en viss fråga med OPTION -satsen.

I de flesta fall väljer frågeoptimeraren en effektiv körningsplan baserat på index, statistik och datadistribution. Databasadministratörer behöver sällan ingripa manuellt.

Du kan ändra exekveringsplanen för frågan genom att lägga till frågehintar i slutet av frågan. Om du till exempel lägger till OPTION (MAXDOP <integer_value>) i slutet av en fråga som använder en enda processor kan frågan använda flera processorer (parallellitet) beroende på vilket värde du väljer. Eller så kan du använda OPTION (RECOMPILE) för att säkerställa att frågan genererar en ny, tillfällig plan varje gång den körs.

--With maxdop hint
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (MAXDOP 2)
GO

--With recompile hint
SELECT City
FROM Person.Address
WHERE StateProvinceID=15 OPTION (RECOMPILE)
GO

Även om frågetips kan ge en lokaliserad lösning på olika prestandarelaterade problem bör du undvika att använda dem i produktionsmiljön av följande skäl.

  • Att ha en permanent frågehint i din fråga kan leda till strukturella databasändringar som gör att den inte längre är tillämplig.
  • Du kan inte dra nytta av nya och förbättrade funktioner i efterföljande versioner av SQL Server om du binder en fråga till en specifik körningsplan.

Det finns dock flera frågetips tillgängliga på SQL Server, som används för olika syften. Låt oss diskutera några av dem nedan:

  • FAST <integer_value>– hämtar det första <heltal_värde> antalet rader medan frågekörningen fortsätter. Det fungerar bättre med små datauppsättningar och lågt värde för snabb frågetips. När radantalet ökar blir frågekostnaden högre.

  • OPTIMIZE FOR– ger instruktioner till frågeoptimeraren om att ett visst värde för en lokal variabel ska användas när en fråga kompileras och optimeras.

  • USE PLAN– Frågeoptimeraren använder en frågeplan som anges av attributet xml_plan .

  • RECOMPILE– skapar en ny, tillfällig plan för frågan och tar bort den direkt efter att frågan har körts.

  • { LOOP | MERGE | HASH } JOIN– anger att alla kopplingsåtgärder utförs av LOOP JOIN, MERGE JOINeller HASH JOIN i hela frågan. Optimeraren väljer den billigaste kopplingsstrategin bland alternativen om du anger fler än ett kopplingstips.

  • MAXDOP <integer_value>– åsidosätter den maximala graden av parallellitetsvärde för sp_configure. Frågan som anger det här alternativet åsidosätter även Resursguvernören.

Du kan också använda flera frågetips i samma fråga. I följande exempel används frågetipsen HASH GROUP och FAST <integer_value> i samma fråga.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (HASH GROUP, FAST 10);  
GO    

Mer information om frågetips finns i Tips (Transact-SQL).

Anvisningar för Query Store

Query Store-tips är en enkel metod för att forma frågeplaner utan att ändra programkod.

Query Store-hintar är användbara när frågeoptimeraren inte genererar en effektiv exekveringsplan och när utvecklaren eller DBA inte kan ändra den ursprungliga frågan. I vissa program kan frågetexten hårdkodas eller genereras automatiskt.

Skärmbild av hur Query Store-tips fungerar.

Om du vill använda tips för Query Store måste du identifiera Query Store query_id för den fråga som du vill ändra med hjälp av katalogvyer i Query Store, inbyggda Query Store-rapporter eller Query Performance Insight för Azure SQL Database. sp_query_store_set_hints Kör sedan med query_id och den frågetipssträng du vill tillämpa på sökningen.

I följande exempel visas hur du hämtar query_id för en specifik fråga och sedan använder den för att tillämpa tipsen RECOMPILE och MAXDOP på frågan.

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'%ORDER BY CustomerName DESC%'  
  AND query_sql_text not like N'%query_store%'
GO

--Assuming the query_id returned by the previous query is 42
EXEC sys.sp_query_store_set_hints @query_id= 42, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1)'
GO

Det finns några scenarier där Query Store-tips kan hjälpa dig med prestandaproblem på frågenivå.

  • Kompilera om en fråga för varje körning.
  • Begränsa den maximala graden av parallellitet för en statistikuppdateringsåtgärd.
  • Använd en Hash-koppling i stället för en kapslad loopkoppling.
  • Använd kompatibilitetsnivå 110 för en specifik fråga samtidigt som databasen hålls i den aktuella kompatibiliteten.

Mer information om Query Store-tips finns i Query Store-tips.