tomy_125: Note

tomy_125 の個人的なメモ

ORA-1555 の再現ケース

事前準備

自動拡張 OFF の10MB のUNDO表領域を予め作成しておく

データ作成

SQL> drop table t1 purge;
SQL> create table t1 (c1 number(10), c2 char(500));
SQL> insert into t1 select level, 'AAA' from dual connect by level <=10000;
SQL> commit;

SQL> select segment_name, bytes/1024/1024 MB from user_segments;

SEGMENT_NA         MB
---------- ----------
T1                  6

1つめのセッションから 時間のかかる select 発行

14:57:43 SQL> set time on timing on
14:57:44 SQL> select
14:57:44   2    /*+ LEADING(a b) USE_NL(b) */
14:57:44   3    a.c1, a.c2
14:57:44   4  from t1 a, t1 b
14:57:44   5  order by a.c1, b.c1
14:57:44   6  ;

select 実行中に2つめのセッションからT1 を更新

SQL> update t1 set c2 = 'XXX';
select status, sum(bytes)/1024/1024 MB from DBA_UNDO_EXTENTS group by status;
commit;
select status, sum(bytes)/1024/1024 MB from DBA_UNDO_EXTENTS group by status;
update t1 set c2 = 'YYY';
select status, sum(bytes)/1024/1024 MB from DBA_UNDO_EXTENTS group by status;
commit;
select status, sum(bytes)/1024/1024 MB from DBA_UNDO_EXTENTS group by status;
update t1 set c2 = 'ZZZ';
select status, sum(bytes)/1024/1024 MB from DBA_UNDO_EXTENTS group by status;
commit;

10000 rows updated.

Elapsed: 00:00:00.74
14:57:56 SQL>
STATUS            MB
--------- ----------
UNEXPIRED      2.375
EXPIRED         .125
ACTIVE           6.5

Elapsed: 00:00:00.00
14:57:56 SQL>
Commit complete.

Elapsed: 00:00:00.00
14:57:56 SQL>
STATUS            MB
--------- ----------
UNEXPIRED     8.6875
EXPIRED         .125
ACTIVE         .1875

Elapsed: 00:00:00.00
14:57:56 SQL>
10000 rows updated.

Elapsed: 00:00:00.87
14:57:57 SQL>
STATUS            MB
--------- ----------
UNEXPIRED      2.375
EXPIRED        .0625
ACTIVE        6.5625

Elapsed: 00:00:00.00
14:57:57 SQL>
Commit complete.

Elapsed: 00:00:00.01
14:57:57 SQL>
STATUS            MB
--------- ----------
UNEXPIRED       8.75
EXPIRED        .0625
ACTIVE         .1875

Elapsed: 00:00:00.00
14:57:57 SQL>
10000 rows updated.

Elapsed: 00:00:00.50
14:57:57 SQL>
STATUS            MB
--------- ----------
UNEXPIRED     2.4375
EXPIRED        .0625
ACTIVE           6.5

Elapsed: 00:00:00.00
14:57:57 SQL>
Commit complete.

Elapsed: 00:00:00.01
14:57:57 SQL>

1つめのセッションにエラーが返る

14:57:43 SQL> set time on timing on
14:57:44 SQL> select
14:57:44   2    /*+ LEADING(a b) USE_NL(b) */
14:57:44   3    a.c1, a.c2
14:57:44   4  from t1 a, t1 b
14:57:44   5  order by a.c1, b.c1
14:57:44   6  ;

from t1 a, t1 b
     *
ERROR at line 4:
ORA-01555: snapshot too old: rollback segment number 2 with name
"_SYSSMU2_2715918981$" too small


Elapsed: 00:00:13.03
14:57:57 SQL> 14:57:57 SQL>

参考

http://dioncho.blogspot.com/2009/08/blog-post.html