我有两张桌子:
客户表:
个人表:
我想查找email_id
,role_id
和dob
相同的所有重复记录。
我使用简单的join和group by子句创建了一个查询,如下所示:
SELECT c.email_id, c.role_id, i.dob
FROM CUSTOMER c
JOIN INDIVIDUAL i on c.individual_id = i.individual_id
GROUP BY c.email_id, c.role_id, i.dob
Having count(*) >= 2
它在测试数据库(SQL Server 2012)上工作正常,但我想知道我的查询是否会在生产数据库上产生性能问题(大约500万)或者有更好的方法吗?
答案 0 :(得分:0)
性能问题取决于您的数据库大小和数据实时更改为数据库。
set statistics time on -- show you exec time
SELECT top 10 c.email_id,c.role_id,i.dob
FROM CUSTOMER c (nolock)
JOIN INDIVIDUAL i (nolock) on c.individual_id=i.individual_id
GROUP BY c.email_id,c.role_id,i.dob
Having count(*) >=2
使用NOLOCK可以防止读取被其他操作死锁,
首先尝试前10个查询以查看执行时间。然后你可以尝试更多的行。
或者您也可以使用数据临时表,然后就可以找到重复的数据了。
答案 1 :(得分:0)
;WITH numbered
AS (SELECT ROW_NUMBER()
OVER(PARTITION BY c.email_id, c.role_id, i.dob
ORDER BY c.email_id, c.role_id, i.dob) AS _dupe_num,
c.email_id,
c.role_id,
i.dob
FROM customer c
INNER JOIN individual i
ON c.individual_id = i.individual_id)
SELECT c.email_id, c.role_id, i.dob -- You can add a DISTINCT or GROUP here if required.
FROM numbered
WHERE _dupe_num > 1;
这是针对同一问题的另一种方法。您可以比较执行计划。但是,我发现您发布的查询没有任何实际问题。
您是否考虑过为这些表加载超过5M记录的测试环境?生成这些应该相当容易。如果您需要一些测试值,您可以随时从AdventureWorks中获取并连接一些东西。