我继承了一个 SQL Server 2008 R2 项目,其中包括从另一个表更新表:
Table1
(大约 150,000 行)有 3 个电话号码字段(Tel1
、Tel2
、Tel3
)Table2
(大约 20,000 行)有 3 个电话号码字段(Phone1
、Phone2
、Phone3
)
.. 当这些数字中的任何一个匹配时,Table1
应该被更新。
当前代码如下:
UPDATE t1
SET surname = t2.surname, Address1=t2.Address1, DOB=t2.DOB, Tel1=t2.Phone1, Tel2=t2.Phone2, Tel3=t2.Phone3,
FROM Table1 t1
inner join Table2 t2
on
(t1.Tel1 = t2.Phone1 and t1.Tel1 is not null) or
(t1.Tel1 = t2.Phone2 and t1.Tel1 is not null) or
(t1.Tel1 = t2.Phone3 and t1.Tel1 is not null) or
(t1.Tel2 = t2.Phone1 and t1.Tel2 is not null) or
(t1.Tel2 = t2.Phone2 and t1.Tel2 is not null) or
(t1.Tel2 = t2.Phone3 and t1.Tel2 is not null) or
(t1.Tel3 = t2.Phone1 and t1.Tel3 is not null) or
(t1.Tel3 = t2.Phone2 and t1.Tel3 is not null) or
(t1.Tel3 = t2.Phone3 and t1.Tel3 is not null);
但是,此查询需要 30 多分钟才能运行。
执行计划表明主要瓶颈是 Table1
上聚集索引扫描周围的嵌套循环
。两个表的 ID
列都有聚簇索引。
由于我的 DBA 技能非常有限,任何人都可以建议提高此查询性能的最佳方法吗?将 Tel1
、Tel2
和 Tel3
的索引添加到每一列是否是最佳举措,或者是否可以更改查询以提高性能?
最佳答案
乍一看,我建议从选择中删除所有 OR 条件。
看看这是否更快(它将您的更新转换为 3 个不同的更新):
UPDATE t1
SET surname = t2.surname, Address1=t2.Address1, DOB=t2.DOB, Tel1=t2.Phone1, Tel2=t2.Phone2, Tel3=t2.Phone3,
FROM Table1 t1
inner join Table2 t2
on
(t1.Tel1 is not null AND t1.Tel1 IN (t2.Phone1, t2.Phone2, t2.Phone3);
UPDATE t1
SET surname = t2.surname, Address1=t2.Address1, DOB=t2.DOB, Tel1=t2.Phone1, Tel2=t2.Phone2, Tel3=t2.Phone3,
FROM Table1 t1
inner join Table2 t2
on
(t1.Tel2 is not null AND t1.Tel2 IN (t2.Phone1, t2.Phone2, t2.Phone3);
UPDATE t1
SET surname = t2.surname, Address1=t2.Address1, DOB=t2.DOB, Tel1=t2.Phone1, Tel2=t2.Phone2, Tel3=t2.Phone3,
FROM Table1 t1
inner join Table2 t2
on
(t1.Tel3 is not null AND t1.Tel3 IN (t2.Phone1, t2.Phone2, t2.Phone3);
关于具有大量 JOIN 条件的 SQL 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834476/