我需要有关如何分解此查询的建议,因此它不会那么慢。我一直在阅读EXISTS和UNION,但我不确定如何在这种情况下使用它们。 LineA / B / C都是nvarchar(max),我无法将连接更改为除文本之外的其他内容。不幸的是,必须排成一行。
UPDATE n SET AddressID = a.AddressID
FROM #NewAddress n
JOIN dbo.Address a
ON (a.[LineA] = n.[LineA] OR (a.[LineA] is null AND n.[LineA] is null))
AND (a.[LineB] = n.[LineB] OR (a.[LineB] is null AND n.[LineB] is null))
AND (a.[LineC] = n.[LineC] OR (a.[LineC] is null AND n.[LineC] is null))
WHERE n.Processed = 0
有关如何UNION或EXIST此查询的任何想法?这似乎是我遇到的非常常见的连接条件
我不确定如何发布查询计划,但它确实很小,就像这样
SELECT 0% <---- Hash Match (Inner Join) 75% <------- Clustered Index Scan 0%
<------- Clustered Index Scan 25%
这些行都没有被索引,因为它们是nvarchar(max)。我无法索引dbo.Address
- 已解决
我在#NewAddress中为Processed列添加了一个索引。显然,这是缓慢的部分
答案 0 :(得分:0)
如果没有索引,您无法真正改进此查询,但使用以下语法:
SELECT *
FROM a
JOIN b
ON EXISTS
(
SELECT a.lineA, a.lineB, a.lineC
INTERSECT
SELECT b.lineA, b.lineB, b.lineC
)
你赋予优化器使用MERGE JOIN
的能力,这在理论上可以更有效率。
请参阅此SQLFiddle(计划中的实际MERGE JOIN
)