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を使用できます クエリオプティマイザのヒントと組み合わせて、クエリの処理方法にさらに影響を与えます。