Het SET FORCEPLAN
instructie overschrijft de logica die wordt gebruikt door de SQL Server-queryoptimalisatie om een T-SQL SELECT
te verwerken verklaring.
Meer specifiek, wanneer FORCEPLAN
is ingesteld op ON
, verwerkt de query-optimizer een join in dezelfde volgorde als de tabellen verschijnen in de FROM
clausule van een zoekopdracht.
Dit dwingt ook het gebruik van een geneste loop-join af, tenzij andere typen joins nodig zijn om een plan voor de query te maken, of ze worden aangevraagd met join-hints of query-hints.
Voorbeeld
Om te demonstreren hoe FORCEPLAN
werkt, ga ik twee SELECT
. uitvoeren queries, eerst met FORCEPLAN
ingesteld op ON
, dan met FORCEPLAN
ingesteld op OFF
.
Beide zoekopdrachten zijn identiek, behalve dat de samenvoegtabellen in een andere volgorde worden weergegeven.
In dit voorbeeld gebruik ik SHOWPLAN_XML
om het geschatte queryplan weer te geven, maar u kunt net zo goed een andere methode gebruiken (zoals de knop Explain in Azure Data Studio of het Include Actual Execution Plan
pictogram in SSMS om het werkelijke queryplan weer te geven).
STEL KRACHTPLAN IN
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;
Resultaat:
We kunnen zien dat het queryplan voor elke query de volgorde weerspiegelt waarin ik de tabelnamen heb opgenomen in de FROM
clausule.
STEL KRACHTPLAN UIT
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;
Resultaat:
Deze keer resulteren beide query's in een identiek queryplan. De query-optimizer negeerde de volgorde waarin ik ze vermeldde in de FROM
clausule en bepaalde zijn eigen volgorde.
Merk op dat de FORCEPLAN
instelling verandert niets aan de gegevens die worden geretourneerd door de SELECT
uitspraak. De werkelijke resultaten zijn hetzelfde, ongeacht of FORCEPLAN
is ingesteld op ON
of OFF
. Het enige verschil is de manier waarop tabellen worden verwerkt (wat van invloed kan zijn op de prestaties).
U kunt SET FORCEPLAN
. gebruiken in combinatie met hints voor het optimaliseren van zoekopdrachten om de manier waarop de zoekopdracht wordt verwerkt verder te beïnvloeden.