TSQL - 关于如何在JOIN中分解OR条件的建议

时间:2013-05-07 18:44:51

标签: sql sql-server sql-server-2008 tsql

我需要有关如何分解此查询的建议,因此它不会那么慢。我一直在阅读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列添加了一个索引。显然,这是缓慢的部分

1 个答案:

答案 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