我继承了SQL Server 2008 R2的项目,除其他外,从另一个表做一个表更新:SQL查询很慢
Table1
(含15万左右行)有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
的集群索引扫描周围的主要瓶颈是Nested Loop
。这两个表在其ID
列上都有聚簇索引。
由于我的DBA技能非常有限,任何人都可以提出改善此查询性能的最佳方法吗?如果将Tel1
,Tel2
和Tel3
的索引添加到每列是最佳选择,还是可以更改查询以提高性能?
适用非聚集索引上的电话1,电话2,两个表 – Vishwajeet
的Tel3如果字段为空,然后一个'='将不会返回true - 你并不需要所有的'和t1.Tel1是不为空“。此外,你正在更新你正在查询的字段,这可能会造成一些数据丢失(如果'Tel1 = Phone2'但'Phone1'为空]。请先尝试使电话号码正常化(即,有一个链接的表来保存电话号码) – Keith
您可以添加一些测试数据(请在SQLFiddle中说) – gbn