Der SET FORCEPLAN
-Anweisung überschreibt die Logik, die vom SQL Server-Abfrageoptimierer zum Verarbeiten eines T-SQL-SELECT
verwendet wird Aussage.
Genauer gesagt, wenn FORCEPLAN
auf ON
eingestellt ist , verarbeitet der Abfrageoptimierer einen Join in derselben Reihenfolge, in der die Tabellen in FROM
erscheinen Klausel einer Abfrage.
Dies erzwingt auch die Verwendung eines Joins mit verschachtelten Schleifen, es sei denn, es sind andere Arten von Joins erforderlich, um einen Plan für die Abfrage zu erstellen, oder sie werden mit Join-Hinweisen oder Abfragehinweisen angefordert.
Beispiel
Um zu demonstrieren, wie FORCEPLAN
funktioniert, werde ich zwei SELECT
ausführen Abfragen, zuerst mit FORCEPLAN
auf ON
setzen , dann mit FORCEPLAN
auf OFF
stellen .
Beide Abfragen sind identisch, mit der Ausnahme, dass die Join-Tabellen in einer anderen Reihenfolge aufgeführt sind.
In diesem Beispiel verwende ich SHOWPLAN_XML
um den geschätzten Abfrageplan anzuzeigen, aber Sie könnten genauso gut eine andere Methode verwenden (z. B. die Schaltfläche Erklären in Azure Data Studio oder Include Actual Execution Plan
). Symbol in SSMS, um den tatsächlichen Abfrageplan anzuzeigen).
FORCEPLAN EINSTELLEN
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;
Ergebnis:
Wir können sehen, dass der Abfrageplan für jede Abfrage die Reihenfolge widerspiegelt, in der ich die Tabellennamen in FROM
eingefügt habe Klausel.
FORCEPLAN AUSSCHALTEN
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;
Ergebnis:
Diesmal führen beide Abfragen zu einem identischen Abfrageplan. Der Abfrageoptimierer ignorierte die Reihenfolge, in der ich sie im FROM
aufgeführt habe Klausel und bestimmte seine eigene Reihenfolge.
Beachten Sie, dass der FORCEPLAN
Die Einstellung ändert nicht die von SELECT
zurückgegebenen Daten Erklärung. Die tatsächlichen Ergebnisse sind dieselben, unabhängig davon, ob FORCEPLAN
auf ON
eingestellt ist oder OFF
. Der einzige Unterschied besteht in der Art und Weise, wie Tabellen verarbeitet werden (was sich auf die Leistung auswirken kann).
Sie können SET FORCEPLAN
verwenden in Verbindung mit Hinweisen des Abfrageoptimierers, um die Verarbeitung der Abfrage weiter zu beeinflussen.