SET FORCEPLAN
sætning tilsidesætter den logik, der bruges af SQL Server-forespørgselsoptimeringsværktøjet til at behandle en T-SQL SELECT
erklæring.
Mere specifikt, når FORCEPLAN
er indstillet til ON
, behandler forespørgselsoptimeringsværktøjet en joinforbindelse i samme rækkefølge, som tabellerne vises i FROM
klausul i en forespørgsel.
Dette tvinger også brugen af en indlejret loop join, medmindre andre typer joins er nødvendige for at konstruere en plan for forespørgslen, eller de anmodes med join-tip eller forespørgselstip.
Eksempel
For at demonstrere hvordan FORCEPLAN
virker, vil jeg køre to SELECT
forespørgsler, først med FORCEPLAN
indstillet til ON
, derefter med FORCEPLAN
indstillet til OFF
.
Begge forespørgsler er identiske, med den undtagelse at jointabellerne er i en anden rækkefølge.
I dette eksempel bruger jeg SHOWPLAN_XML
for at vise den estimerede forespørgselsplan, men du kan lige så nemt bruge en anden metode (såsom knappen Forklar i Azure Data Studio eller Include Actual Execution Plan
ikon i SSMS for at vise den faktiske forespørgselsplan).
SÆT FORCEPLAN TIL
SET FORCEPLAN ON;
GO
SET SHOWPLAN_XML ON;
GO
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM
Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId;
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM
Albums al
INNER JOIN Genres g
ON al.GenreId = g.GenreId
INNER JOIN Artists ar
ON ar.ArtistId = al.ArtistId;
Resultat:
Vi kan se, at forespørgselsplanen for hver forespørgsel afspejler den rækkefølge, hvori jeg inkluderede tabelnavnene i FROM
klausul.
SÆT FORCEPLAN FRA
SET SHOWPLAN_XML OFF;
GO
SET FORCEPLAN OFF;
GO
SET SHOWPLAN_XML ON;
GO
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM
Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId;
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM
Albums al
INNER JOIN Genres g
ON al.GenreId = g.GenreId
INNER JOIN Artists ar
ON ar.ArtistId = al.ArtistId;
Resultat:
Denne gang resulterer begge forespørgsler i en identisk forespørgselsplan. Forespørgselsoptimeringsværktøjet ignorerede rækkefølgen, hvori jeg listede dem i FROM
klausul og bestemte sin egen rækkefølge.
Bemærk, at FORCEPLAN
indstillingen ændrer ikke de data, der returneres af SELECT
udmelding. De faktiske resultater er de samme uanset om FORCEPLAN
er er indstillet til ON
eller OFF
. Den eneste forskel er måden, hvorpå tabeller behandles (hvilket kan påvirke ydeevnen).
Du kan bruge SET FORCEPLAN
sammen med tip til forespørgselsoptimering for yderligere at påvirke, hvordan forespørgslen behandles.