一些改动,在什么@Adrian所述顶部...
UPDATE
ud1 -- @Adrian's change. Update the instance that you have already aliased.
SET
externalEmail = ud2.Email
FROM
@user_dupes AS ud1
INNER JOIN
@user_flat_emailtable_dupes AS ud2
ON ud1.UserName = ud2.UserName
WHERE
ud2.EmailType = 2 -- Removed sub-query, for layout, doubt it will help performance
AND ud2.Email IS NOT NULL
AND ud2.Email <> '' -- Removed the `LEN()` function
但可能是最重要的过去,以确保您有索引。 JOIN
对于这个逻辑(或相关的子查询等)是必要的,所以你想要连接是高性能的。
@user_dupes上的(UserName)的索引以及@user_flat_emailtable_dupes上的(EmailType,Email,UserName)的索引。 (这假定UD2越小表中,过滤后)
随着作为指定的索引,从LEN(Email) > 0
到Email <> ''
的变化可以允许一个索引查找,而不是扫描。你的桌子越大,这就越明显。
是那些表变量?桌子的大小是多少? – Locksfree 2012-03-23 17:14:04
这些是表变量。这是如何编码连接的更新。这是t-sql。这工作正常,但有点慢。试图看看是否有更快的方法可以基于另一个表来完成批量更新。 – 2012-03-23 17:18:37
根据可变表中数据的大小,您可能需要使用临时表。通常,它们对大型数据集执行更好。你可以为它们编制索引。 – HLGEM 2012-03-23 17:33:51