如何使大型表上的自联接效率更高?

时间:2019-05-17 22:55:47

标签: sql sql-server tsql

我目前正试图在相对较大的表(760,000多行)中查找在过去6个月内创建的与所有历史客户匹配的潜在重复客户。在我的情况下,将2个客户分类为相似的是名字和姓氏,不同的客户ID和相似的DOB的DIFFERENCE值为4(客户1 DOB =客户2 DOB或客户1 DOB为空,或客户2 DOB为空)。我目前正在尝试通过像这样自加入表来实现这一点:

SELECT *
FROM    (SELECT * FROM Customer c WHERE c.Created >= DATEADD(MONTH, -6, GETUTCDATE())) c1
JOIN    (SELECT * FROM Customer) c2 ON c1.CustomerID <> c2.CustomerID
WHERE   (c1.DOB IS NULL OR c2.DOB IS NULL OR c1.DOB = c2.DOB)
        AND DIFFERENCE(c1.FirstName, c2.FirstName) = 4
        AND DIFFERENCE(c1.LastName, c2.LastName) = 4

当我删除DOB条件时,查询运行良好(大约需要2到3秒钟才能执行);但是,一旦我重新添加该条件,查询就会一直旋转直到我的计算机内存不足。当不包括DOB空检查(即仅c1.DOB = c2.DOB件)时,该查询也可以很好地工作(尽管有点慢)。关于如何重构/优化此查询的任何建议将不胜感激!

0 个答案:

没有答案