SET FORCEPLAN
příkaz přepíše logiku používanou optimalizátorem dotazů SQL Server ke zpracování T-SQL SELECT
prohlášení.
Přesněji řečeno, když FORCEPLAN
je nastaveno na ON
, optimalizátor dotazů zpracuje spojení ve stejném pořadí, v jakém jsou tabulky uvedeny v FROM
klauzule dotazu.
To také vynutí použití spojení vnořených smyček, pokud nejsou vyžadovány jiné typy spojení k vytvoření plánu pro dotaz nebo pokud nejsou požadovány pomocí tipů na spojení nebo tipů na dotaz.
Příklad
Ukázat, jak FORCEPLAN
funguje, spustím dva SELECT
dotazy, nejprve pomocí FORCEPLAN
nastavte na ON
a poté pomocí FORCEPLAN
nastavte na OFF
.
Oba dotazy jsou identické, s výjimkou toho, že tabulky spojení jsou uvedeny v jiném pořadí.
V tomto příkladu používám SHOWPLAN_XML
k zobrazení odhadovaného plánu dotazů, ale stejně snadno můžete použít jinou metodu (například tlačítko Vysvětlit v Azure Data Studio nebo Include Actual Execution Plan
ikona v SSMS pro zobrazení skutečného plánu dotazů).
NASTAVIT FORCEPLAN ZAPNUTO
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;
Výsledek:
Vidíme, že plán dotazů pro každý dotaz odráží pořadí, ve kterém jsem zahrnul názvy tabulek do FROM
doložka.
VYPNĚTE 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;
Výsledek:
Tentokrát mají oba dotazy za následek identický plán dotazů. Optimalizátor dotazů ignoroval pořadí, ve kterém jsem je uvedl v FROM
klauzule a určila si vlastní pořadí.
Všimněte si, že FORCEPLAN
nastavení nemění data vrácená SELECT
prohlášení. Skutečné výsledky jsou stejné bez ohledu na to, zda FORCEPLAN
je nastaveno na ON
nebo OFF
. Jediný rozdíl je ve způsobu zpracování tabulek (což by mohlo mít vliv na výkon).
Můžete použít SET FORCEPLAN
ve spojení s radami optimalizátoru dotazů k dalšímu ovlivnění způsobu zpracování dotazu.