IN 的执行效率太低了,怎么提高?

yiyuanhong 2012-11-30 04:31:13
学写了一个SQL,都是用IN的,发现效率非常低。EXISTS不太会用。
有A、B两个表,A(pid,name),B(cid,pid)。
现在要做的就是对A表进行筛选,如果A表中PID不在B表中,那么就把A表中的这条数据删掉。
DELETE FROM A a WHERE a.pid in(select b.pid from A b where b.pid not in(select c.pid from B c))

哪位高手能不能帮我重写一下这个SQL,让其效率提高?谢谢
...全文
285 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
winer1220 2012-12-02
  • 打赏
  • 举报
回复
引用 2 楼 ssqtjffcu1 的回复:
SQL code?? 1 delete from a where not exists (select 1 from b where b.pid=a.pid);
看是否能快点
linwaterbin 2012-12-01
  • 打赏
  • 举报
回复
1)DELETE FROM A a WHERE a.pid in(select b.pid from A b where b.pid not in(select c.pid from B c)) 其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,CBO自动优化会转成exist语句,也就是效率和exist一样,但多了隐式转换了。 2)如果a,b 表都很大的话,用in和exists是感觉不出来区别的 3)不要用NOT EXISTS ,可否试着用外连接来实现该功能? 4)pid上是否建立了索引等
ssqtjffcu 2012-12-01
  • 打赏
  • 举报
回复
delete from a where not exists (select 1 from b where b.pid=a.pid);
小海葵1 2012-11-30
  • 打赏
  • 举报
回复
DELETE FROM A a WHERE not exists(select 1 from B b where a.pid = b.pid)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧