大批量数据删除

我在一个600万的表中删除300万。删除好几个小时。产生log卷和redo量的告警。通过分析 数据库

 --1.关掉tableb的全部触发器,这个必定要关掉,movingdata的时候必定要所有关掉,否则批量操做的时候卡死你Y的。
alter system table cgidata.nbz_act_task_tel_rela disable all triggers;
--执行完毕以后,启动触发器
alter system table cgidata.nbz_act_task_tel_rela enable all triggers;
--2,除了主键索引以外,tableb表剩余的索引所有删除掉。等执行完毕以后,重建索引(索引重建很快,个人600万数据的表的7个索引重建才花了2分钟而已) session

 

要检查数据库中什么用户的操做产生这么大量的redo,能够查询表dbmgr.REDO_ALERT_KILL_REC_TBL spa

若是在当时的时间点下有记录,说明就是被记录的这一个或几个session形成的log卷问题。 索引

若是没有查到记录,能够在一段时间间隔内(如间隔3分钟)执行如下语句,2次执行结果redosize差值最大的session产生的redo最多 io

select sysdate,se.username , se.sid, se.serial#,se.status,se.machine,se.osuser,round(st.value/1024/1024) redosize
       from v$session se, v$sesstat st
      where se.sid = st.sid
        and st.STATISTIC# = (select STATISTIC# from v$statname where NAME='redo size')
--        and se.username is not null
        and st.value>10*1024*1024
order by redosize;
table

检查这个session是否已经被kill,是否标记为killed 监控

对于尚未killsession,查出这个session执行的语句,将结果反馈运营,并询问是否可以kill session date

已经标记为killedsession,请继续监控 cgi

 

--删除数据 select

按步就班的辦法
1. drop index
2. disable trigger
3. force not logging
4. delete rows
5. create original index
6. enable trigger
7. force logging

 

你先create new_table as select 条件就是你要保留的数据
而后把整个表truncate,而后把new_table更名
这样应该比你直接删除快些~

或者作成分区表,直接truncate 分区

相关文章
相关标签/搜索