首页 > 解决方案 > 如何使大表上的自联接更有效?

问题描述

我目前正在尝试查找在过去 6 个月内创建的潜在重复客户,这些客户与相对较大(760,000 多行)表中的所有历史客户相匹配。在我的情况下,将 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)。任何关于如何重构/优化此查询的建议将不胜感激!

标签: sqlsql-servertsql

解决方案


推荐阅读