태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

Oracle 11g Interval Partition의 버그

오라클 2008.02.09 13:19
Oracle 11g에서 추가된 Interval Partition과 관련된 버그가 Oracle Forum을 통해 발견되었다. 상당히 재미있는 버그이고, 실제로 Interval Partition을 사용하는데 있어 문제를 일으킬 만한 소지가 있다. 그래서 블로그를 통해 정보를 공유한다. 아래 테스트 결과를 보자.

SQL> drop table t_int_part purge;
테이블이 삭제되었습니다.

SQL>
SQL> CREATE TABLE t_int_part ( part_key number )
  2  PARTITION BY RANGE (part_key) INTERVAL(10)
  3  ( PARTITION p0 VALUES LESS THAN (10) )
  4  ;
테이블이 생성되었습니다.

SQL> -- 인덱스 생성
SQL> ALTER TABLE t_int_part ADD CONSTRAINT t_int_part_pk PRIMARY KEY (part_key) USING INDEX LOCAL;
테이블이 변경되었습니다.

-- 12건의 데이터 생성. 이 과정에서 세 개의 Partition이 동적으로 생성된다.
SQL> insert into t_int_part values(2);
SQL> insert into t_int_part values(4);
SQL> insert into t_int_part values(6);

SQL>
SQL> insert into t_int_part values(12);
SQL> insert into t_int_part values(14);
SQL> insert into t_int_part values(16);

SQL>
SQL> insert into t_int_part values(22);
SQL> insert into t_int_part values(24);
SQL> insert into t_int_part values(26);

SQL> -- 주의!!! 아래 과정에서 비연속적인 Internval에 의한 파티션이 생긴다.(10,20,40)
SQL> insert into t_int_part values(42);
SQL> insert into t_int_part values(44);
SQL> insert into t_int_part values(46);

SQL> commit;
커밋이 완료되었습니다.

-- 파티션 확인
SQL> select partition_name from dba_tab_partitions where table_name = 'T_INT_PART';
PARTITION_NAME
------------------------------
SYS_P84
SYS_P85
P0
SYS_P83

-- Full Table Scan. 정상적으로 12건이 나온다.
SQL> select /*+ full(t_int_part) */ * from t_int_part;
  PART_KEY                                                                     
----------                                                                     
         2                                                                     
         4                                                                     
         6                                                                     
        12                                                                     
        14                                                                     
        16                                                                     
        22                                                                     
        24                                                                     
        26                                                                     
        42                                                                     
        44                                                                     
        46                                                                     

12 개의 행이 선택되었습니다.

-- Index Full Scan. 정상적으로 12건이 나온다.
SQL> select /*+ index(t_int_part) */ * from t_int_part;
  PART_KEY                                                                     
----------                                                                     
         2                                                                     
         4                                                                     
         6                                                                     
        12                                                                     
        14                                                                     
        16                                                                     
        22                                                                     
        24                                                                     
        26                                                                     
        42                                                                     
        44                                                                     
        46                                                                     

12 개의 행이 선택되었습니다.

-- Index Range Scan. 정상적으로 12건이 나온다.
SQL> select /*+ index(t_int_part) */ * from t_int_part where part_key > 0;

  PART_KEY                                                                     
----------                                                                     
         2                                                                     
         4                                                                     
         6                                                                     
        12                                                                     
        14                                                                     
        16                                                                     
        22                                                                     
        24                                                                     
        26                                                                     
        42                                                                     
        44                                                                     
        46                                                                     

12 개의 행이 선택되었습니다.

-- Index Fast Full Scan. 12건이 아니라 9건이 나온다.
SQL> select /*+ index_ffs(t_int_part) */ * from t_int_part;

  PART_KEY                                                                     
----------                                                                     
         2                                                                     
         4                                                                     
         6                                                                     
        12                                                                     
        14                                                                     
        16                                                                     
        22                                                                     
        24                                                                     
        26                                                                     

9 개의 행이 선택되었습니다.

위의 테스트 결과를 보면 Index Fast Full Scan의 경우 비연속적인 마지막 파티션(42,44,46의 값)을 인식하지 못하는 것을 확인할 수 있다. 반면 Table Full Scan, Index Range Scan, Index Full Scan에서는 이런 오류가 없다.

위의 내용은 Oracle Forum에서 한 사용자의 질문에서 시작되어 결국 오라클의 버그로 판명났다. 아마 다음 패치때 수정된 버전이 제공될 것이다. 그 전까지는 Oracle 11g에서 Interval Partition을 사용하는 경우에는 Index Fast Full Scan이 비정상적으로 작동한다는 사실을 잘 기억해야 할 것이다.

Oracle Forum의 원문은 여기를 참조한다.


신고
Trackback 0 : Comments 3
  1. steve.kim 2008.02.11 20:22 신고 Modify/Delete Reply

    오 신기한데요. 혹시나 해서 _fast_full_scan_enabled 파라미터를 세션레벨에서 FALSE로 바꾸어도 여전히 INDEX FAST FULL SCAN으로 풀리면서 결과가 비정상으로 나온데요. 11g에서는 해당 파라미터가 안먹는군요.

  2. 욱짜 2008.02.11 20:58 신고 Modify/Delete Reply

    Oracle 11g의 버그 Parade는 이제 시작인거 같습니다. 앞으로 기대가 됩니다. ^^;

  3. 서상서 2011.01.07 16:42 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

Write a comment

티스토리 툴바