SQL Server 2012 - 如果使用JOIN在表B中不存在条目,则尝试更新表A中的值

时间:2015-09-28 02:58:21

标签: sql-server join sql-server-2012 sql-update execution-time

以下UPDATE语句完全符合我的要求:

UPDATE [dbo].[Person]
SET [IsUpdated] = 0 
FROM [Person] p
WHERE p.IsUpdated = 1
  and p.PersonID NOT IN (SELECT DISTINCT q.PersonID FROM [DeletionQueue] d, [Queue] q
                         WHERE d.fkQueueID = q.QueueID)

但是,当我运行此语句的Estimated执行计划时,我发现NOT IN SELECT语句消耗了70%的处理时间。我更愿意使用某种JOIN语句来实现相同的结果。

我试图以多种不同的方式创建声明,但是我能够复制上述声明的最接近的声明是一个能够让我得到与我正在寻找的完全相反的结果(即如果我在Persons表中有2个人,IsUpdated = 1,两个人在Queue表中都有一个条目(QueueID),但只有人B在DeletionQueue表中(fkQueueID),那么Person表中只有人A的记录应该有IsUpdated改为0)。目前,当我尝试JOIN语句时,人B被更新而人A不被更新。

如果需要,我可以按原样使用该语句,但在此应用程序中,性能非常关键。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用dyld: Symbol not found: ___NSDictionary0__ Referenced from: /Users/raja/Library/Developer/Xcode/DerivedData/ServiceGenerator-dycdiotwolfqnaelznaucewpppjr/Build/Products/Debug/ServiceGenerator (which was built for Mac OS X 10.11) Expected in: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation in /Users/raja/Library/Developer/Xcode/DerivedData/ServiceGenerator-dycdiotwolfqnaelznaucewpppjr/Build/Products/Debug/ServiceGenerator Trace/BPT trap: 5 代替:

NOT EXISTS

根据Aaron Bertrand的article

  

用于查找表A中所有行的模式,其中某些条件没有   在表B中,UPDATE [dbo].[Person] SET [IsUpdated] = 0 FROM [Person] p WHERE p.IsUpdated = 1 AND NOT EXISTS( SELECT 1 FROM [DeletionQueue] d INNER JOIN [Queue] q ON q.fkQueueID = q.QueueID WHERE q.PersonId = p.PersonId ) 通常是最好的   选择。但是,与往常一样,您需要自己测试这些模式   环境,使用您的架构,数据和硬件,并与之混合   你自己的工作量。