Forstå forespørgselstip
Forespørgselstip er indstillinger eller strategier, der kan anvendes til at gennemtvinge forespørgselsbehandleren for at bruge en bestemt operator i udførelsesplanen for SELECTsætninger af typen , INSERT, UPDATEeller DELETE . Forespørgselstip tilsidesætter enhver udførelsesplan, som forespørgselsbehandleren kan vælge for en given forespørgsel med delsætningen OPTION .
I de fleste tilfælde vælger forespørgselsoptimering en effektiv udførelsesplan baseret på indeks, statistikker og datadistribution. Databaseadministratorer behøver sjældent at gribe ind manuelt.
Du kan ændre udførelsesplanen for forespørgslen ved at føje forespørgselstip til slutningen af forespørgslen. Hvis du f.eks. føjer OPTION (MAXDOP <integer_value>) til slutningen af en forespørgsel, der bruger en enkelt CPU, kan forespørgslen bruge flere CPU'er (parallelitet) afhængigt af den værdi, du vælger. Du kan også bruge OPTION (RECOMPILE) til at sikre, at forespørgslen genererer en ny, midlertidig plan, hver gang den udføres.
--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
Selvom forespørgselstip kan give en lokaliseret løsning på forskellige problemer, der er relateret til ydeevnen, bør du undgå at bruge dem i produktionsmiljøet af følgende årsager.
- Hvis du har et permanent forespørgselstip til din forespørgsel, kan det resultere i ændringer i strukturelle databaser, som ville være en fordel for den pågældende forespørgsel, hvis den ikke var relevant.
- Du kan ikke drage fordel af nye og forbedrede funktioner i efterfølgende versioner af SQL Server, hvis du binder en forespørgsel til en bestemt udførelsesplan.
Der er dog flere forespørgselstip, der er tilgængelige på SQL Server, som bruges til forskellige formål. Lad os diskutere et par af dem nedenfor:
FAST <integer_value>– henter det første <integer_value> antal rækker, mens forespørgslen fortsættes. Det fungerer bedre med små datasæt og lav værdi for hurtigt forespørgselstip. Efterhånden som antallet af rækker øges, bliver forespørgselsomkostningerne højere.OPTIMIZE FOR– giver instruktioner til forespørgselsoptimeringsprogrammet om, at der skal bruges en bestemt værdi for en lokal variabel, når en forespørgsel kompileres og optimeres.USE PLAN– Forespørgselsoptimeringsprogrammet bruger en forespørgselsplan, der er angivet af attributten xml_plan .RECOMPILE– opretter en ny, midlertidig plan for forespørgslen og sletter den, umiddelbart efter at forespørgslen er udført.{ LOOP | MERGE | HASH } JOIN– angiver, at alle joinhandlinger udføres afLOOP JOIN,MERGE JOINellerHASH JOINi hele forespørgslen. Optimeringsfunktionen vælger den mindst dyre joinstrategi blandt indstillingerne, hvis du angiver mere end ét jointip.MAXDOP <integer_value>– tilsidesætter den maksimale grad af parallelitetsværdi forsp_configure. Den forespørgsel, der angiver denne indstilling, tilsidesætter også Resource Governor.
Du kan også anvende flere forespørgselstip i den samme forespørgsel. I følgende eksempel bruges HASH GROUP forespørgselstipene og FAST <integer_value> i den samme forespørgsel.
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
Du kan få mere at vide om forespørgselstip under Tip (Transact-SQL).
Tip til forespørgselslager
Tip til Forespørgselslager indeholder en enkel metode til udformning af forespørgselsplaner uden at ændre programkoden.
Tip til forespørgselslager er nyttige, når forespørgselsoptimeringsprogrammet ikke genererer en effektiv udførelsesplan, og når udvikleren eller DBA ikke kan ændre den oprindelige forespørgselstekst. I nogle programmer kan forespørgselsteksten være hardcoded eller genereret automatisk.
Hvis du vil bruge tip til Forespørgselslager, skal du identificere forespørgselslagerets query_id af den forespørgselssætning, du vil ændre via katalogvisninger i Forespørgselslager, indbyggede forespørgselslagerrapporter eller Indsigt i forespørgselsydeevne for Azure SQL Database. Udfør derefter med den sp_query_store_set_hints- og forespørgselstipstreng, du vil anvende på forespørgslen.
I følgende eksempel kan du se, hvordan du henter query_id for en bestemt forespørgsel og derefter bruger den til at anvende tipene RECOMPILE og MAXDOP til forespørgslen.
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
Der er et par scenarier, hvor tip til Forespørgselslager kan hjælpe med problemer med ydeevnen på forespørgselsniveau.
- Genkompiler en forespørgsel for hver udførelse.
- Begræns den maksimale grad af parallelitet for en statistikopdateringshandling.
- Brug en hashjoinforbindelse i stedet for en joinforbindelse med indlejrede løkker.
- Brug kompatibilitetsniveau 110 til en bestemt forespørgsel, samtidig med at databasen bevares med den aktuelle kompatibilitet.
Du kan finde flere oplysninger om tip til Forespørgselslager under Tip til forespørgselslager.