如何在Oracle中优化删除查询(带有子查询)? [英] How to optimize delete query (with subquery) in Oracle?

查看:984
本文介绍了如何在Oracle中优化删除查询(带有子查询)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类似的查询

 delete from tableA 
 where tableA.fk in (select id 
                     from tableB 
                     where tableB.column1='somevalue' 
                     and tableB.date between date1 and date2)
   ;

表tableB包含近100,000,000条记录.所以

Table tableB contains near 100,000,000 records. So

select id 
from tableB 
where  tableB.column1='somevalue' 
and tableB.date between date1 and date2 

返回近1,000,000条记录.结果-删除根本不起作用-回滚段的大小存在问题.我无法增加细分的大小.

returns near 1,000,000 records. As result - delete doesn't work at all - problem with size of rollback segment. I cannot increase size of segment.

如何执行?

推荐答案

如果要填充回滚段,则可能是因为事务中涉及的数据量.

If you are filling the rollback segment it is probably because the amount of data involved in your transaction.

我分成了几块,然后分别提交,就像这样:

I'd split into several chunks and commit each of them, something like :

 delete from tableA where tableA.fk in (
    select id from (
            select id from tableB where 
                tableB.column1='somevalue' and tableB.date between date1 and date2 and id in (select distinct fk from tableA.fk)

        )
        where rownum < XXXX 
    )

为XXXX提供所需的值(10000)或其他值,然后循环执行此语句,并且不要忘记在每次迭代中提交.

give XXXX the value you want (10000) or whatever, and then loop executing this statement and don't forget to commit in each iteration.

您必须循环执行,直到delete语句返回0(受影响的行数)为止.

You have to loop until the delete statement returns 0 (number of affected rows).

更新后的查询 如前所述,这不会提供最佳性能,但可以解决回滚段问题

UPDATED QUERY As noticed, this will not give the best performance, but will solve the rollback segment problem

希望有帮助

这篇关于如何在Oracle中优化删除查询(带有子查询)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆