Forstå spørringstips

Fullført

Spørringstips er alternativer eller strategier som kan brukes til å fremtvinge spørringsprosessoren til å bruke en bestemt operator i utførelsesplanen for SELECT, INSERT, UPDATEeller DELETE setninger. Spørringstips overstyrer enhver utførelsesplan som spørringsprosessoren kan velge for en gitt spørring med setningsdelen OPTION .

I de fleste tilfeller velger spørringsoptimalisering en effektiv utførelsesplan basert på indekser, statistikk og datadistribusjon. Databaseadministratorer trenger sjelden å gripe inn manuelt.

Du kan endre kjøringsplanen for spørringen ved å legge til spørringstips på slutten av spørringen. Hvis du for eksempel legger OPTION (MAXDOP <integer_value>) til slutten av en spørring som bruker én enkel CPU, kan spørringen bruke flere CPUer (parallellisme) avhengig av verdien du velger. Du kan også bruke OPTION (RECOMPILE) til å sikre at spørringen genererer en ny, midlertidig plan hver gang den utfø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

Selv om spørringstips kan gi en lokalisert løsning på ulike ytelsesrelaterte problemer, bør du unngå å bruke dem i produksjonsmiljøet av følgende årsaker.

  • Hvis du har et permanent spørringstips på spørringen, kan det føre til strukturelle databaseendringer som vil være gunstige for at spørringen ikke er aktuell.
  • Du kan ikke dra nytte av nye og forbedrede funksjoner i etterfølgende versjoner av SQL Server hvis du binder en spørring til en bestemt utførelsesplan.

Det finnes imidlertid flere spørringstips tilgjengelig på SQL Server, som brukes til ulike formål. La oss diskutere noen av dem nedenfor:

  • FAST <integer_value>– henter det første <integer_value> antall rader mens du fortsetter kjøringen av spørringen. Det fungerer bedre med små datasett og lav verdi for raske spørringstips. Etter hvert som radantallet økes, blir spørringskostnadene høyere.

  • OPTIMIZE FOR– gir instruksjoner til spørringsoptimaliseringen om at en bestemt verdi for en lokal variabel skal brukes når en spørring kompileres og optimaliseres.

  • USE PLAN– spørringsoptimalisering bruker en spørringsplan angitt av xml_plan-attributtet.

  • RECOMPILE– oppretter en ny, midlertidig plan for spørringen og forkaster den umiddelbart etter at spørringen er utført.

  • { LOOP | MERGE | HASH } JOIN– angir at alle sammenføyningsoperasjoner utføres av LOOP JOIN, MERGE JOINeller HASH JOIN i hele spørringen. Optimaliseringen velger den minst kostbare sammenføyningsstrategien blant alternativene hvis du angir mer enn ett sammenføyningstips.

  • MAXDOP <integer_value>– overstyrer den maksimale graden av parallellitetsverdi for sp_configure. Spørringen som angir dette alternativet, overstyrer også ressursguvernøren.

Du kan også bruke flere spørringstips i samme spørring. Følgende eksempel bruker HASH GROUP og FAST <integer_value> spørringstips i samme spørring.

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    

Hvis du vil lære mer om spørringstips, kan du se Tips (Transact-SQL).

Tips for spørringslager

Tips for spørringslager gir en enkel metode for å forme spørringsplaner uten å endre programkode.

Tips for spørringslager er nyttige når spørringsoptimalisering ikke genererer en effektiv utførelsesplan, og når utvikleren eller DBA ikke kan endre den opprinnelige spørringsteksten. I enkelte programmer kan spørringsteksten være hardkodet eller automatisk generert.

Skjermbilde av hvordan tips for spørringslager fungerer.

Hvis du vil bruke tips for spørringslager, må du identifisere spørringslageret query_id av spørringssetningen du ønsker å endre gjennom katalogvisninger for spørringslager, innebygde rapporter for spørringslager eller spørringsytelsesinnsikt for Azure SQL Database. Deretter kjører sp_query_store_set_hints du med query_id - og spørringstipsstrengen du vil bruke på spørringen.

Følgende eksempel viser hvordan du henter query_id for en bestemt spørring, og deretter bruker den RECOMPILE til å bruke og MAXDOP tips på spørringen.

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 finnes noen scenarioer der spørringslagertips kan hjelpe deg med ytelsesproblemer på spørringsnivå.

  • Kompiler en spørring på nytt for hver kjøring.
  • Begrens den maksimale graden av parallellisme for en statistikkoppdateringsoperasjon.
  • Bruk en Hash-sammenføyning i stedet for nestede løkker.
  • Bruk kompatibilitetsnivå 110 for en bestemt spørring mens du holder databasen på gjeldende kompatibilitet.

Hvis du vil ha mer informasjon om tips for spørringslager, kan du se Tips for Spørringslager.