请帮忙看看这个操作为什么慢

[复制链接]
查看11 | 回复9 | 2006-2-5 17:25:21 | 显示全部楼层 |阅读模式
delete from SERV
where not exists
( select * from EXTEND_TICKET_000002 where SERV.ACC_NBR=EXTEND_TICKET_000002.CALLING_NBR)
SERV 表有35万条
EXTEND_TICKET_000002 有17万条
执行后1晚上都出不来结果,最后ORACLE报错
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
在两个表的记录都在十几万的情况下,用子句not exists是会很慢的,表SERV的ACC_NBR字段和表EXTEND_TICKET_000002的CALLING_NBR字段有没有建索引也有很大的关系.
 我建议使用外部连接子句来完成,
delete from SERV
whererowid in(
select a.rowid
from SERV a,EXTEND_TICKET_000002b
wherea.ACC_NBR=b.CALLING_NBR(+) andb.CALLING_NBR is null)
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层


其他高手看看有没有其它好办法?
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
先把执行计划贴一下
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
可以用存储过程
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
delete from SERV
where not exists
( select * from EXTEND_TICKET_000002 where SERV.ACC_NBR=EXTEND_TICKET_000002.CALLING_NBR)
存在性检测本身不会慢,关键是你子查询的写法.
你的需求是:
删除SERV 表中SERV.ACC_NBR的值,不存在于EXTEND_TICKET_000002.CALLING_NBR中的记录,对吧?
如果是这样,anzi_oracle 这样的写法是可行的.
还有,如下SQL速度也会更快点:
delete from SERV A
whereA.CALLING_NBR NOT in
( select ACC_NBR from EXTEND_TICKET_000002
whereACC_NBR=a.CALLING_NBR
)
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
觉得能为别人解决点问题和参与发言真是高兴,希望大家在ORACLE开发版块积极发言啊!


回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
感觉应该是not exists 的用法有问题
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
delete from SERVa
where not exists
( selectnull from EXTEND_TICKET_000002b where a.ACC_NBR=b.CALLING_NBR)
只要在a.ACC_NBR和b.CALLING_NBRb建立好索引速度应该还是不错的
回复

使用道具 举报

千问 | 2006-2-5 17:25:21 | 显示全部楼层
把执行计划贴出来看一下,有索引的话应该不会这么慢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行