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.