大事务回滚估算

来源:互联网 发布:以知开头的成语接龙 编辑:程序博客网 时间:2024/05/22 06:20

在系统上线、日常运维时,难免会出现由于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 

符合我们的预期!
“`

0 0
原创粉丝点击