SET FORCEPLAN sats åsidosätter logiken som används av SQL Server-frågeoptimeraren för att bearbeta en T-SQL SELECT uttalande.
Mer specifikt när FORCEPLAN är inställd på ON , bearbetar frågeoptimeraren en join i samma ordning som tabellerna visas i FROM klausul i en fråga.
Detta tvingar också användningen av en kapslad loop-join såvida inte andra typer av joins krävs för att konstruera en plan för frågan, eller om de begärs med join-tips eller frågetips.
Exempel
För att visa hur FORCEPLAN fungerar, jag kommer att köra två SELECT frågor, först med FORCEPLAN inställd på ON , sedan med FORCEPLAN inställd på OFF .
Båda frågorna är identiska, med undantaget att kopplingstabellerna visas i en annan ordning.
I det här exemplet använder jag SHOWPLAN_XML för att visa den beräknade frågeplanen, men du kan lika gärna använda en annan metod (som knappen Förklara i Azure Data Studio eller Include Actual Execution Plan ikonen i SSMS för att visa den faktiska frågeplanen).
STÄLL PÅ FORCEPLAN
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 att frågeplanen för varje fråga återspeglar den ordning i vilken jag inkluderade tabellnamnen i FROM klausul.
STÄLL AV FORCEPLAN
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:
Den här gången resulterar båda frågorna i en identisk frågeplan. Frågeoptimeraren ignorerade ordningen i vilken jag listade dem i FROM klausul och bestämde sin egen ordning.
Observera att FORCEPLAN inställningen ändrar inte data som returneras av SELECT påstående. De faktiska resultaten är desamma oavsett om FORCEPLAN är är inställd på ON eller OFF . Den enda skillnaden är det sätt på vilket tabeller bearbetas (vilket kan påverka prestanda).
Du kan använda SET FORCEPLAN i samband med frågeoptimerarens tips för att ytterligare påverka hur frågan bearbetas.