在准备我之前的Constant Scan 问题时,我VALUES
以各种方式进行了试验,并遇到了关于加入的事情,VALUES
这对我来说很奇怪。
设置很简单
CREATE TABLE #data ([Id] int);
INSERT INTO #data VALUES (101), (103);
然后有一个查询
DECLARE @id1 int = 101, @id2 int = 102;
SELECT *
FROM (VALUES (@id1), (@id2)) p([Id])
FULL HASH JOIN #data d ON d.[Id] = p.[Id];
没有什么特别的。如果您运行它,它会工作并产生结果。这是它的执行计划
VALUES
但是从中删除一行
SELECT *
FROM (VALUES (@id1)) p([Id])
FULL HASH JOIN #data d ON d.[Id] = p.[Id];
导致优化器失败
消息 8622,级别 16,状态 1,第 1 行
查询处理器无法生成查询计划...
为什么?有没有办法(除了将参数放入临时表之外)使用哈希算法使其工作?
注意:这不是真正的工具,而是用于研究优化器行为和功能的目的。
上面的例子是在
Microsoft SQL Server 2017 (RTM-CU15-GDR) (KB4505225) - 14.0.3192.2 (X64)