【发布时间】:2010-12-06 18:02:05
【问题描述】:
我们有一个庞大的公司表(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 时会有如此大的差异strong> 在条件下。
【问题讨论】:
-
我尝试在单个查询中完成此操作,但似乎非常需要保持良好的性能,并将其放在单个查询中。我使用 UNION 的解决方案似乎相当不错,因为到目前为止所有答案都使用多个查询来完成此操作。
标签: sql sql-server tsql sql-server-2008