在系统上线、日常运维时,难免会出现由于SQL效率不佳,或者写错,导致出现回滚的现象;在大事务时,回滚常常耗时很久,如何较为准确得估算回滚的时间,可以帮助我们制定相应的计划:
–准备数据
SQL> create table testpp as select pk_person from person where rownum<1000000;
Table created.
SQL> create index i_pp on testpp (pk_person);
Index created.
进行删除操作
SQL> delete from TESTPP where rownum<950000;
949999 rows deleted.
SQL> rollback;
查询当前事务的回滚数据量
16:40:50 SQL> select t.ses_addr,t.used_urec from v$transaction t;
SES_ADDR USED_UREC
---------------------------- ----------
0700010130EBD998 1899998
`
其中SES_ADDR:User session object address
USED_UREC:Number of undo records used
由于测试表创建了索引,因此回滚的数据量除了表数据外,还包含了索引数据,所以总的数据量为1899998
16:42:09 SQL> /
SES_ADDR USED_UREC
---------------- ----------
070001012D1070C0 3
0700010130EBD998 1501572
再进行查询,从两个时间间隔中就可以估算每分钟回滚的数据量了。
为了确认该回滚就是对应的之前的sql,可通过如下方法:
select s.osuser,s.program,s.sql_hash_value,s.sql_id,s.prev_sql_id
from v$transaction t,v$session s
where t.ses_addr = s.saddr;
OSUSER PROGRAM SQL_HASH_VALUE SQL_ID PREV_SQL_ID
---------- ---------------------------------------- -------------- ------------- -------------
logcx sqlplus@T187PC16VM14 (TNS V1-V3) 0 9085cz60z4pg3
SQL> select sql_text from v$sql where sql_id='9085cz60z4pg3';
SQL_TEXT
------------------------------------------
delete from TESTPP where rownum<950000
符合我们的预期!
“`