SET FORCEPLAN
Instrukcja zastępuje logikę używaną przez optymalizator zapytań SQL Server do przetwarzania T-SQL SELECT
oświadczenie.
Dokładniej, gdy FORCEPLAN
jest ustawiony na ON
, optymalizator zapytań przetwarza sprzężenie w tej samej kolejności, w jakiej tabele pojawiają się w FROM
klauzula zapytania.
Wymusza to również użycie sprzężenia w pętli zagnieżdżonej, chyba że inne typy sprzężenia są wymagane do skonstruowania planu zapytania lub są wymagane ze wskazówkami sprzężenia lub wskazówkami dotyczącymi zapytania.
Przykład
Aby zademonstrować, jak FORCEPLAN
działa, zamierzam uruchomić dwa SELECT
zapytania, najpierw z FORCEPLAN
ustaw na ON
, a następnie FORCEPLAN
ustaw na OFF
.
Oba zapytania są identyczne, z wyjątkiem tego, że tabele sprzężenia są wymienione w innej kolejności.
W tym przykładzie używam SHOWPLAN_XML
aby wyświetlić szacowany plan zapytania, ale równie łatwo można użyć innej metody (takiej jak przycisk Wyjaśnij w Azure Data Studio lub Include Actual Execution Plan
w SSMS, aby wyświetlić rzeczywisty plan zapytania).
USTAW FORCEPLAN WŁĄCZ
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;
Wynik:
Widzimy, że plan zapytania dla każdego zapytania odzwierciedla kolejność, w jakiej umieściłem nazwy tabel w FROM
klauzula.
WYŁĄCZENIE FORCEPLANU
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;
Wynik:
Tym razem oba zapytania dają identyczny plan zapytań. Optymalizator zapytań zignorował kolejność, w jakiej wymieniłem je w FROM
klauzuli i określił własną kolejność.
Zauważ, że FORCEPLAN
ustawienie nie zmienia danych zwracanych przez SELECT
oświadczenie. Rzeczywiste wyniki są takie same niezależnie od tego, czy FORCEPLAN
jest ustawiony na ON
lub OFF
. Jedyną różnicą jest sposób przetwarzania tabel (co może mieć wpływ na wydajność).
Możesz użyć SET FORCEPLAN
w połączeniu ze wskazówkami optymalizatora zapytań, aby dodatkowo wpłynąć na sposób przetwarzania zapytania.