SQL Server比较2个具有数百万条记录的表

时间:2016-06-27 06:09:19

标签: sql sql-server

  • 我在SQL Server中有两个表:表1和表2.
  • 表1有500条记录,表2有数百万条记录。
  • 表2可能/可能没有表1的500条记录。

我必须比较表1和表2.但结果应该只给出表1的记录,其中表2中有任何数据变化。表示结果应小于或等于500.

我没有任何主键但是2个表中的列是相同的。我写了以下查询。但我得到超时异常并且需要花费很多时间来处理。请帮忙。

With CTE_DUPLICATE(OLD_FIRSTNAME ,New_FirstName,      
    OLD_LASTNAME ,New_LastName,      
    OLD_MINAME ,New_MIName ,      
    OLD_FAMILYID,NEW_FAMILYID,ROWNUMBER)      
as (        
 Select distinct      

    OLD.FIRST_NAME AS 'OLD_FIRSTNAME' ,New.First_Name  AS 'NEW_FIRSTNAME',      
    OLD.LAST_NAME AS 'OLD_LASTNAME',New.Last_Name AS 'NEW_LASTNAME',      
    OLD.MI_NAME AS 'OLD_MINAME',New.MI_Name AS 'NEW_MINAME',      
    OLD.FAMILY_ID AS 'OLD_FAMILYID',NEW.FAMILY_ID AS 'NEW_FAMILYID',      
    row_number()over(partition by OLD.FIRST_NAME ,New.First_Name,      
    OLD.LAST_NAME ,New.Last_Name,      
    OLD.MI_NAME ,New.MI_Name ,      
    OLD.FAMILY_ID,NEW.FAMILY_ID       
    order by OLD.FIRST_NAME ,New.First_Name,      
    OLD.LAST_NAME ,New.Last_Name,      
    OLD.MI_NAME ,New.MI_Name ,      
    OLD.FAMILY_ID,NEW.FAMILY_ID )as rank       
 From EEMSCDBStatic OLD,EEMS_VIPFILE New where            
 OLD.MPID <> New.MPID    and old.FIRST_NAME <> New.First_Name  
 and OLD.LAST_NAME <> New.Last_Name and OLD.MI_NAME <> New.MI_Name   
 and old.Family_Id<>New.Family_id    
 )      
 sELECT OLD_FIRSTNAME ,New_FirstName,      
    OLD_LASTNAME ,New_LastName,      
    OLD_MINAME ,New_MIName ,      
    OLD_FAMILYID,NEW_FAMILYID FROM CTE_DUPLICATE where rownumber=1    

2 个答案:

答案 0 :(得分:0)

我认为这里的主要问题是您的查询强制数据库完全乘以您的表,这意味着处理~500M组合。之所以发生这种情况,是因为您将来自T1的任何记录与T2中具有至少一个不同值的任何记录连接起来,其中MPID看起来像是必须用于连接记录的唯一标识符。

如果MPID确实是标识两个表中记录的列,那么您的查询应该有一个不同的结构:

SELECT old.FIRSTNAME, new.FirstName,
       old.LASTNAME, new.LastName,
       old.MINAME, new.MIName,
       old.FAMILYID, new.FAMILYID
    FROM EEMSCDBStatic old
         INNER JOIN EEMS_VIPFILE new ON old.MPID = new.MPID
    WHERE old.FIRST_NAME <> New.First_Name  
          AND OLD.LAST_NAME <> New.Last_Name
          AND OLD.MI_NAME <> New.MI_Name   
          AND old.Family_Id <> New.Family_id
    ORDER BY old.FIRSTNAME, new.FirstName,
             old.LASTNAME, new.LastName,
             old.MINAME, new.MIName,
             old.FAMILYID, new.FAMILYID

其他一些想法:

  1. 如果您要在记录中查找任何更改(即使只有一列具有不同的值),您应该在{{OR中使用WHERE 1}}子句,而不是AND s。现在,您只需查找更改所有列中的值的记录。例如,您未能找到更改其姓名但决定保留姓氏的人。

  2. 您应该考虑将表格编入索引。

答案 1 :(得分:0)

DISTINCT关键字与ROWNUMBER一起使用毫无意义。

请参阅此sql query distinct with Row_Number

你正在做CROSS JOIN,这在你的情况下是非常大的。

也许在那种情况下你

where   OLD.MPID <> New.MPID and old.FIRST_NAME <> New.First_Name and ...

你想要OR而不是AND?

为什么你根本使用ROWNUMBER也许并不完全清楚 - 也许是为了找到最佳匹配。

所有这一切都是因为正如@Shnugo正确评论的那样,你的比较背后的逻辑是错误的 - 你必须有一些逻辑定义来加入表格(比如第一和第二名必须相同)。