【问题标题】:TSQL - Advice on how to break up OR conditions in JOINTSQL - 关于如何在 JOIN 中分解 OR 条件的建议
【发布时间】:2013-05-01 20:04:30
【问题描述】:

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

【问题讨论】:

  • LineA 真的可以为空吗?如果LineA 意味着AddressLine1 我对你的数据完整性高度怀疑......
  • 是的,它可以为空。我知道非常粗略。这是我被处理过的牌
  • dbo.Address 上是否已有索引?你能告诉我们每张表上的记录数吗?你真的想要你选择的两个表中的所有字段吗?
  • 除了AC 行之外,还有其他字段吗?您需要选择它们吗?
  • coalesce() 有什么改进吗? on coalesce(a.LineA,'&lt;null&gt;') = coalesce(n.LineA,'&lt;null&gt;') 如果地址匹配但在不同的行上会发生什么,例如LineA 匹配 LineB?

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


【解决方案1】:

如果没有索引,您无法真正改进此查询,但使用以下语法:

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

【讨论】:

  • 奇怪的是产生了相同的查询计划。非常有趣的方法
  • @user1002479:尝试强制另一种加入方法(将JOIN替换为INNER MERGE JOIN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2014-09-12
  • 2016-12-20
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多