1

我需要关于如何分解这个查询的建议,所以它不会那么慢。我一直在阅读 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 或 EXISTs 这个查询的任何想法?这似乎是我遇到的一个很常见的连接条件

我不确定如何发布查询计划,但它真的很小这样

SELECT 0% <---- Hash Match (Inner Join) 75% <------- Clustered Index Scan 0%
                                            <------- Clustered Index Scan 25%

这些行都没有索引,因为它们是 nvarchar(max)。我也无法索引 dbo.Address

- 解决

我在#NewAddress 的Processed 列中添加了一个索引。显然,这是缓慢的部分

4

1 回答 1

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情况)

于 2013-05-07T19:16:03.547 回答