delete大表后kill session是否会recover
delete大表后kill session是否会recover
今天是2013-10-15,论坛有个朋友提这个问题:
简单介绍下情景: DELETE 一张大表数据,未执行完,就把session 杀掉了。
kill session 后。smon占CPU 仍然超过60%,难道是在回滚数据?
我的测试过程:
session 1: SQL> select count(*) from amy; COUNT(*) ---------- 1047140 SQL> select * from v$mystat where rownum<2; SID STATISTIC# VALUE ---------- ---------- ---------- 46 0 0 session 2: SQL> select sid,serial#,username from v$session where username is not null; SID SERIAL# USERNAME ---------- ---------- ------------------------------ 37 127 SYS 46 15 RHYS 48 11 SYS 50 23 SYS
然后再rhys下删除amy表:
SQL> delete from amy; delete from amy * ERROR at line 1: ORA-00028: your session has been killed ORA-00028: your session has been killed SQL> 在session 2 然后kill 该session: SQL> alter system kill session '46,15'; System altered. SQL> select usn,xacts,latch,extents,gets,waits,hwmsize,status,curext,curblk from v$rollstat where xacts>0; USN XACTS LATCH EXTENTS GETS WAITS HWMSIZE STATUS CUREXT CURBLK ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------- ---------- ---------- 3 1 0 106 82251 10 402776064 ONLINE 102 393 SQL> select usn,xid,slt,state,undoblocksdone,undoblockstotal,cputime,parentslt,rcvserSQL> vers from v$fast_start_transactions; USN XID SLT STATE UNDOBLOCKSDONE UNDOBLOCKSTOTAL CPUTIME PARENTSLT RCVSERVERS ---------- ---------------- ---------- ---------------- -------------- --------------- ---------- ---------- ---------- 3 0300000068050000 0 RECOVERING 4479 14624 16 0 1 3 03001F0065050000 31 RECOVERED 3953 3953 58 1 SQL> r 1* select usn,xid,slt,state,undoblocksdone,undoblockstotal,cputime,parentslt,rcvservers from v$fast_start_transactions USN XID SLT STATE UNDOBLOCKSDONE UNDOBLOCKSTOTAL CPUTIME PARENTSLT RCVSERVERS ---------- ---------------- ---------- ---------------- -------------- --------------- ---------- ---------- ---------- 3 0300000068050000 0 RECOVERING 4479 14624 17 0 1 3 03001F0065050000 31 RECOVERED 3953 3953 58 1
结论:没错,是需要回滚,有时候大的事务回滚导致很严重的性能问题,有时候为了加快速度,设置fast_start_parallel_rollback 为high