日期:2014-05-16  浏览次数:20701 次

delete优化问题
请问下我现在有张千万级表现在要delete掉其中的300万,没有分区没有索引,那有什么可以优化执行的方法吗?
除了添加io设备块的方法。
------最佳解决方案--------------------
引用:
请问下我现在有张千万级表现在要delete掉其中的300万,没有分区没有索引,那有什么可以优化执行的方法吗?
除了添加io设备块的方法。

在回答一次
如果表未分区又有足够的磁盘空间,能否使用在线重定义的方法,把表转成分区表,然后把其中包含有300W左右的分区直接drop掉 
------其他解决方案--------------------
create table temp as select * from 表 where 不想删的数据;
rename 表 to 其它;
rename temp to 表;
通过重命名的方法快点
------其他解决方案--------------------
把所有数据分割为几小块进行处理,这样做的好处是及时做事务提交,不至于占用系统太多资源

delete 语句使用parallel并行,删除数据,同时注意回滚段空间和redo切换频率控制
------其他解决方案--------------------
引用:
create table temp as select * from 表 where 不想删的数据;
rename 表 to 其它;
rename temp to 表;
通过重命名的方法快点

这种方法给力!
开启并行度、控制事务单位
------其他解决方案--------------------
引用:
create table temp as select * from 表 where 不想删的数据;
rename 表 to 其它;
rename temp to 表;
通过重命名的方法快点

换做我也这么干,但是为了防止一些想不到的意外发生
如:原表上有一些其他东西,如外键,主键,索引,触发器等
可以换个方式:
建一个表把不想删除的数据拿出来,因为这样可以用到索引,速度较快
然后 truncate 原表
最后 把数据insert 回去。

------其他解决方案--------------------
引用
如果表未分区又有足够的磁盘空间,能否使用在线重定义的方法

这个很好很强大正是我要的 谢啦 同是也谢谢各位给出的答案。