我有一张几十行的桌子。简化的设置如下
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
策略,这似乎是适当的,因为两个输入都只有很少的行。我注意到(但不同意)的一件事是,TVC行被假脱机了(请参阅红色框中的执行计划区域)。
为什么优化器在这里引入假脱机,原因是什么?线轴之外没有什么复杂的。看起来好像没有必要。在这种情况下如何摆脱它,可能的方法是什么?
以上计划是在
Microsoft SQL Server 2014(SP2-CU11)(KB4077063)-12.0.5579.0(X64)