请检查可能导致巨大数据库性能问题的SQL查询

时间:2016-11-17 12:15:10

标签: sql sql-server sql-server-2012 database-performance

我有两张桌子:

客户表:

  • id(主键)
  • EMAIL_ID
  • ROLE_ID
  • individual_id(外键)。

个人表:

  • individual_id
  • DOB

我想查找email_idrole_iddob相同的所有重复记录。

我使用简单的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万)或者有更好的方法吗?

2 个答案:

答案 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中获取并连接一些东西。

相关问题