SQL NOT IN或NOT EXISTS语句效率低下

时间:2019-03-08 10:34:49

标签: sql sql-server database

背景

我有两个表-一个表每天都用新数据更新(截止日期未到),并且一个表根据另一个表(实时表)不断地添加和删除。

其工作方式是,如果分配工作的人员出现在“失败的截止日期”表中,则将其添加到“活动”表中。如果分配工作的人员第二天不在“未能按时完成”表中,请从“活动”表中删除。

这里的两个最大问题是,虽然可以轻松地检查工作的ID号,但还必须检查工作是否仍分配给同一位员工,这样如果易手,就不会反对他们。

我面临的问题是代码的删除部分似乎运行了3,000行,返回大约300行就好了,但是此SQL语句要花费4分30秒才能执行。编写此语句的最有效方法是什么?我的直觉告诉我这两个陈述是不同的,而将它们结合起来就是问题所在。

DELETE FROM [LiveTable]
WHERE [WorkID] NOT IN (SELECT [WorkID]
                       FROM [FailedDeadline])
   OR [LiveTable].[EmployeeID] <> (SELECT [EmployeeID]
                                   FROM [FailedDeadline] as fd
                                   WHERE [LiveTable].[WorkID] = fd.[WorkID]);

2 个答案:

答案 0 :(得分:1)

我不确定这会减少多少执行时间,但是按如下所示重写上面的查询可能会有所帮助。

testfile1.txt

答案 1 :(得分:1)

我将其表达为:

DELETE lt FROM [LiveTable] lt
WHERE NOT EXISTS (SELECT 1
                  FROM FailedDeadline fdl
                  WHERE fdl.WorkID = lt.WorkID AND
                        lt.EmployeeID = fdl.EmployeeID
                 );

这一情况表明,失败的表中不存在具有相同员工ID的记录。

然后,您想要在FailedDeadline(WorkId, EmployeeID)上建立索引。