数十行のテーブルがあります。簡略化されたセットアップは次のとおりです
CREATE TABLE #data ([Id] int, [Status] int);
INSERT INTO #data
VALUES (100, 1), (101, 2), (102, 3), (103, 2);
そして、このテーブルを、一連のテーブル値で構成された行(変数と定数で構成される)に結合するクエリがあります。
DECLARE @id1 int = 101, @id2 int = 105;
SELECT
COALESCE(p.[Code], 'X') AS [Code],
COALESCE(d.[Status], 0) AS [Status]
FROM (VALUES
(@id1, 'A'),
(@id2, 'B')
) p([Id], [Code])
FULL JOIN #data d ON d.[Id] = p.[Id];
クエリ実行計画は、オプティマイザの決定がFULL LOOP JOIN
戦略を使用することであることを示しています。これは、両方の入力の行が非常に少ないため、適切と思われます。ただし、私が気づいた(そして同意できない)1つのことは、TVC行がスプールされていることです(赤いボックスの実行計画の領域を参照)。
オプティマイザーがここでスプールを導入する理由、それを行う理由は何ですか?スプール以外に複雑なものはありません。必要ないようです。この場合、それを取り除く方法、可能な方法は何ですか?
上記の計画は
Microsoft SQL Server 2014(SP2-CU11)(KB4077063)-12.0.5579.0(X64)