1. 테스트 데이터 생성

 


Script. 테스트 데이터 생성용

< ROWNUM_T2 >

■ 생성 요건
- 테이블의 전체 건수는 900,000 ROWS
- C1은 값의 종류가 100,000가지.
- C2는 값의 종류가 26가지.

■ 테이블 생성
drop table rownum_t2 purge;

create table rownum_t2
as
SELECT LEVEL AS C1, CHR(65+MOD(LEVEL,26)) AS C2, level+99999 as c3
FROM DUAL
CONNECT BY LEVEL <= 100000 ;

■ 추가 데이터 입력
begin
    for i in 1..8 loop
        insert into rownum_t2 select * from rownum_t2;
        commit;
    end loop;
end;
/    


■ 각 칼럼에 인덱스 생성 및 통계정보 수집
CREATE INDEX IDX_01 ON ROWNUM_T2(C2);
CREATE INDEX IDX_02 ON ROWNUM_T2(C2,c3);

BEGIN
      dbms_stats.gather_table_stats(OWNNAME=>'SCOTT',
                                    TABNAME=>'ROWNUM_T2',
                                    ESTIMATE_PERCENT=>99,
                                    METHOD_OPT=>'FOR ALL INDEXED COLUMNS',
                                    GRANULARITY=>'ALL',
                                    CASCADE=>TRUE,
                                    NO_INVALIDATE=>FALSE) ;
END;
/


테스트1. 빠른 조회가 되는 경우 (조건이 없거나 인덱스 구성 컬럼만 존재할 때)

 
--[조건이 없는 경우]
SELECT *
  FROM ROWNUM_T2
WHERE ROWNUM <= 1;

--[인덱스 구성 컬럼만 존재하는 경우]
SELECT *
  FROM ROWNUM_T2
WHERE c2 in ('P','S','H')
  and ROWNUM <= 1;


테스트2. 느린 조회가 되는 경우(INDEX IDX_01 구성 컬럼은 C2컬럼임)

 
 
SELECT /*+ INDEX_DESC(ROWNUM_T2 INDEX IDX_01) */ *
  FROM ROWNUM_T2
WHERE c2 in ('P','S','H')
  AND C1 = 1004
  and ROWNUM <= 1;

 

테스트3. 새로운 인덱스 생성 후 SQL 재 수행(인덱스 구성 컬럼 : C2 -> C2,C1)

 
CREATE INDEX IDX_02 ON ROWNUM_T2(C2,c1);
 
SELECT /*+ INDEX_DESC(ROWNUM_T2 INDEX IDX_02) */ *
  FROM ROWNUM_T2
WHERE c2 in ('P','S','H')
  AND C1 = 1004
  and ROWNUM <= 1;