找出两个表之间不匹配记录的最快方法是什么?

pen*_*ake 1 t-sql filtering sql-server-2008

我试图在MS-SQL数据库中发现一些损坏的记录.

在一个简化的例子中,scenerio是这样的:

我有两张桌子,简单地说:

  • 表1:Id,日期,OpId

  • 表_2:Date,OpId,EventName

我有这个业务规则:如果Table_1中有记录,那么Table_1中的Table_1.Date和Table.OpId中应该至少存在1行.

如果Table_1中有一行,并且如果表中没有与该行匹配的行,那么就会出现数据损坏 - 无论是什么原因 - .

为了找出不正确的数据,我使用:

SELECT *
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.Date = t2.Date AND t1.OpId = t2.OpId
WHERE t2.OpId IS NULL -- So, if there is no 
--                           matching row in table_2 then this is a mistake
Run Code Online (Sandbox Code Playgroud)

但是查询完成需要很长时间.

有没有更快或更好的方法来接近类似的场景

Mar*_*ith 6

要做到防半连接NOT EXISTS的SQL Server是在性能上比通常好于或等于其他选项(NOT IN,OUTER JOIN ... NULL,EXCEPT)

SELECT *
FROM   table_1 t1
WHERE  NOT EXISTS (SELECT *
                   FROM   table_2 t2
                   WHERE  t1.Date = t2.Date
                          AND t1.OpId = t2.OpId) 
Run Code Online (Sandbox Code Playgroud)

请参阅左外连接与NOT EXISTS.你可能会错过一个有用的索引.