背景
我有两个表-一个表每天都用新数据更新(截止日期未到),并且一个表根据另一个表(实时表)不断地添加和删除。
其工作方式是,如果分配工作的人员出现在“失败的截止日期”表中,则将其添加到“活动”表中。如果分配工作的人员第二天不在“未能按时完成”表中,请从“活动”表中删除。
这里的两个最大问题是,虽然可以轻松地检查工作的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]);
答案 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)
上建立索引。