SET FORCEPLAN
ステートメントは、SQLServerクエリオプティマイザーがT-SQLSELECT
を処理するために使用するロジックをオーバーライドします。 ステートメント。
具体的には、FORCEPLAN
ON
に設定されています 、クエリオプティマイザは、テーブルがFROM
に表示されるのと同じ順序で結合を処理します クエリの句。
これにより、クエリの計画を作成するために他のタイプの結合が必要な場合、または結合ヒントまたはクエリヒントで要求されない限り、ネストされたループ結合の使用も強制されます。
例
FORCEPLAN
の方法を示すため 動作します。2つのSELECT
を実行します 最初にFORCEPLAN
を使用したクエリ ON
に設定 、次にFORCEPLAN
OFF
に設定 。
結合テーブルが異なる順序でリストされていることを除いて、両方のクエリは同一です。
この例では、SHOWPLAN_XML
を使用します 推定クエリプランを表示しますが、別の方法(Azure Data Studioの[説明]ボタン、またはInclude Actual Execution Plan
など)を簡単に使用することもできます。 SSMSのアイコンを使用して、実際のクエリプランを表示します)。
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;
結果:
各クエリのクエリプランは、FROM
にテーブル名を含めた順序を反映していることがわかります。 条項。
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;
結果:
今回は、両方のクエリで同じクエリプランが作成されます。クエリオプティマイザは、FROM
にリストした順序を無視しました 条項と独自の順序を決定しました。
FORCEPLAN
に注意してください 設定は、SELECT
によって返されるデータを変更しません 声明。 FORCEPLAN
かどうかに関係なく、実際の結果は同じです。 ON
に設定されています またはOFF
。唯一の違いは、テーブルの処理方法です(パフォーマンスに影響を与える可能性があります)。
SET FORCEPLAN
を使用できます クエリオプティマイザのヒントと組み合わせて、クエリの処理方法にさらに影響を与えます。