一些改動,在什麼@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