[英]DELETE and NOT IN query performance
我有以下表结构:
我想从Users表中删除SomeItems和SomeOtherItems表中不存在的记录。
我可以做这个:
DELETE from Users
FROM Users u
WHERE u.UserId NOT IN
(SELECT DISTINCT SomeId FROM SomeItems
UNION
SELECT DISTINCT SomeId2 FROM SomeOtherItems)
但是,它非常慢。 我假设它为每条记录执行UNION查询,不是吗? 有什么办法可以提高性能?
在两个结果上应用distinct,然后将它们合并(这适用于第三个distinct,所有这些都需要排序),并不是验证存在的最有效方法。 怎么样:
DELETE u
FROM dbo.Users AS u -- always use schema prefix!
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.SomeItems WHERE SomeId = u.UserId
)
AND NOT EXISTS
(
SELECT 1 FROM dbo.SomeOtherItems WHERE SomeID2 = u.UserId
);
最简单的解决方法可能就是将UNION更改为UNION ALL
您将通过删除查询计划的流聚合组件来看到此效果。
毕竟,您不在乎列表是否重复
我将更改两个连接的IN,查询越简单,就越容易针对引擎进行优化。
DELETE from U
FROM Users U
left join SomeItems S1 on S1.SomeId = U.UserId
left join SomeOtherItems S2 on S2.SomeID2 = U.UserId
WHERE S1.SomeId is null and S2.SomeID2 is null
检查S1.SomeID是否为null意味着SomeItems上不存在U.UserId。 对SomeOtherItems同样。
确保在SomeItems和SomeOtherItems上具有SomeId和SomeID2的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.