【发布时间】: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 上是否已有索引?你能告诉我们每张表上的记录数吗?你真的想要你选择的两个表中的所有字段吗?
-
除了
A到C行之外,还有其他字段吗?您需要选择它们吗? -
coalesce() 有什么改进吗?
on coalesce(a.LineA,'<null>') = coalesce(n.LineA,'<null>')如果地址匹配但在不同的行上会发生什么,例如LineA 匹配 LineB?
标签: sql sql-server sql-server-2008 tsql