我繼承了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