我们有一个庞大的公司表(1700 万个条目),我们希望根据搜索标准(基于电话号码)为其查找重复项。查询运行速度非常慢(5 分钟以上)

这是查询的简化版本,但问题是相同的:

SELECT C1.*
FROM dbo.Company AS C1 WITH(NOLOCK)
INNER JOIN dbo.Company AS C2 ON C2.sTelephone = C1.sTelephone
                         AND C1.iId_company != C2.iId_company
                         AND (C1.iId_third_party_id IS NULL OR
                              C2.iId_third_party_id IS NULL)

栏目说明:
  • iId_company : 主键,整数自增
  • sTelephone :公司的电话号码,带有非聚集索引的 varchar
  • iId_third_party_id : 来自第三方提供商的 ID,当用户插入自己的新公司时可能为空(因为我们想要找到重复的公司),也可以是带有非聚集索引的整数。

  • 我们什么是具有相同电话号码但不同主键(重复项)的公司,还有一部分没有第三方 ID(这告诉我们最终用户插入了它。

    现在,我尝试了一些事情,但没有给我任何线索:
  • 当在 OR 子句中删除一侧时,只剩下 C1.iId_third_party_id IS NULL 提供了巨大的提升,查询时间不到 5 秒
  • 当使用 OR 子句完全删除括号中的条件时,查询再次变慢(1 分钟 +),但我认为这只是因为数据集返回的数据非常庞大。

  • 我最终让 UNION 结合了两个查询(每个查询都在 OR 条件上有它的一部分),但我想了解为什么在条件中使用 OR 时会有如此大的差异。

    最佳答案

    找出性能差异的最佳方法是检查您尝试的查询的执行计划。他们可以提供很多信息。不幸的是,我不是 SQL Server 专家,所以我不知道如何获得执行计划。

    关于sql - 大表上的 T-SQL 查询根据连接条件运行缓慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1567353/

    10-11 22:44
    查看更多