태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

재현가능한 Test Case를 만들기가 어려운 이유

오라클 2009.08.05 15:44
어디서나 재현 가능한 Test Case를 만드는 것이 얼마나 어려운지를 보여주는 좋은 예가 있습니다.

우선, 아래 OTN Forum을 읽어 보세요(아직 해결이 되지 않은 질문입니다).

Tom Kyte가 여기에서 ORA-01555 에러를 일으키는 정말 쉽고 확실한 Test Case를 제공하고 있습니다. 하지만 이 역사적으로 증명된 바 있는 확실한 Test Case조차도 문제를 재현하는데 실패하고 있습니다.

왜 이런 확실한 Test Case조차 재현에 실패하는지 간단한 예로 설명해보겠습니다.

1. 제 Oracle 환경입니다.

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

2. ORA-01555 에러가 발생하기 쉽도록 작은 크기의 Undo Tablespace를 만듭니다.

alter system set undo_tablespace=UNDOTBS1;

drop table t purge;
create table t as select * from all_objects;  
create index t_idx on t(object_id);

drop tablespace small_undo including contents and datafiles;
create undo tablespace small_undo datafile size 200k;

alter system set undo_tablespace=SMALL_UNDO;
alter system flush buffer_cache;

3. Tom Kyte의 아래 test Case는 반드시 ORA-01555 에러를 일으키도록 되어 있습니다.

UKJA@ukja102> begin
  2          for x in ( select * from t where object_id > 0 )
  3          loop
  4                  update t set object_name = lower(object_name)
  5                    where object_id = x.object_id and rownum=1;
  6                  commit;
  7          end loop;
  8  end;
  9  /

PL/SQL procedure successfully completed.  -- Why no ORA-01555???
하지만 에러가 발생하지 않죠. 왜 그럴까요?

4. Tom Kyte가 Test Case를 만들었던 이전 버전에서와는 달리 최근 버전의 Oracle에서는 해당 SQL 문장이 Index Range Scan이 아닌 Table Full Scan을 따릅니다.

explain plan for select * from t where object_id > 0;

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 50000 |  4541K|   186  (17)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| T    | 50000 |  4541K|   186  (17)| 00:00:03 |
--------------------------------------------------------------------------
Table Full Scan을 하는 경우에는 하나의 블록안에 들어가 있는 Row들을 한번에 읽어들이기 때문에 한번 읽은 Block을 다시 읽을 경우가 거의 없습니다. 따라서 Update에 의해 변경된 Block을 재방문하는 일이 거의 없고 따라서 Undo를 읽는 과정에서 ORA-01555에러가 발생할 확률이 매우 낮아집니다.

5. 이제 다음과 같이 INDEX 힌트를 부여해서 Index Range Scan을 사용하게끔 합니다. 단, 1000건의 Row만 생성합니다. 이 경우에도 여전히 ORA-01555 에러가 발생하지 않습니다.

UKJA@ukja102> create table t as select * from all_objects where rownum <= &1;
old   1: create table t as select * from all_objects where rownum <= &1
new   1: create table t as select * from all_objects where rownum <= 1000

Table created.

UKJA@ukja102> begin
  2          for x in ( select /*+ index(t) */ * from t where object_id > 0 )
  3          loop
  4                  update t set object_name = lower(object_name)
  5                    where object_id = x.object_id and rownum=1;
  6                  commit;
  7          end loop;
  8  end;
  9  /

PL/SQL procedure successfully completed.   -- Again no ORA-01555 error?

6. 1000건의 Row가 너무 적어서 Undo를 충분히 덮어써지 못한 것입니다. 다음과 같이 10,000건의 Row를 읽게끔 하면 마침내 ORA-01555 에러가 발생합니다.

UKJA@ukja102> create table t as select * from all_objects where rownum <= &1;
old   1: create table t as select * from all_objects where rownum <= &1
new   1: create table t as select * from all_objects where rownum <= 10000

Table created.

UKJA@ukja102> begin
  2          for x in ( select /*+ index(t) */ * from t where object_id > 0 )
  3          loop
  4                  update t set object_name = lower(object_name)
  5                    where object_id = x.object_id and rownum=1;
  6                  commit;
  7          end loop;
  8  end;
  9  / 
begin
*
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number  with name "" too small
ORA-06512: at line 2

7. 위에서 든 예 외에도 ORA-01555 에러가 발생하지 않을 다양한 가능성이 있을 겁니다.

매번 느끼는 것이지만, 언제 어디서나 재현 가능한 Test Case를 만드는 것이 얼마나 어려운지 모릅니다. 정말 간단해 보이는 경우라도요. 따라서 누군가에게 Test Case를 줄 일이 있다면 혹시나 생각지 못한 제한이나 결점을 가지고 있지 않을까 잘 고민해보아야 할 것입니다.

저작자 표시
신고
Trackback 0 : Comment 0

Write a comment

티스토리 툴바