繁体   English   中英

删除且不在查询中

[英]DELETE and NOT IN query performance

我有以下表结构:

用户数

  • UserId(主键)
  • 用户名

SomeItems

  • SomeId(从FK到Users.UserId)
  • SomeItemId(主键)
  • 名称
  • 其他的东西...

其他项目

  • SomeId2(FK到Users.UserId)
  • SomeOtherItemId(主键)
  • 名称
  • 其他的东西...

我想从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM