INDEX

INDEX의 기본 개념_인덱스(INDEX)란 ?

한기리 2021. 7. 3. 22:00
728x90
320x100

인덱스(INDEX)란 ?

 

- 테이블 내의 데이터를 찾을 수 있게 일부 데이터를 모아서 구성한 데이터 구조이다. 인덱스를 이용하면 테이블 내의 데이터를 빠르게 찾아낼 수 있다.

 

예제 ) 테스트를 위한 테이블 만들기

CREATE TABLE T_ORD_BIG AS
SELECT T1.*, T2.RNO, TO_CHAR(T1.ORD_DT, 'YYYYMMDD') ORD_YMD
  FROM T_ORD T1
      ,(SELECT ROWNUM RNO
          FROM DUAL CONNECT BY ROWNUM <= 10000) T2
          ;
          
-- 아래는 T_ORD_BIG 테이블의 통계를 생성하는 명령어다.
-- 첫 번째 파라미터에는 테이블 OWNER를, 두 번째 파라미터에는 테이블 명을 입력한다.
EXEC DBMS_STATS.GATHER_TABLE_STATS('ORA_SQL_TEST', 'T_ORD_BIG');

위 SQL을 실행하면 T_ORD_BIG 테이블에 3천만 건 정도의 데이터가 입력되며, 성능 테스트와 인덱스 설 명을 위해 'ORD_YMD'와 'RNO' 컬럼도 추가하였다. 또 올바른 성능 테스트를 위해서 통계정보도 만들었다.

 

예제 ) 인덱스가 없는 BIG테이블 조회

SELECT /*+ GATHER_PLAN_STATISTICS */
       COUNT(*)
  FROM T_ORD_BIG T1
 WHERE T1.ORD_SEQ = 343;

 

<인덱스가 없는 BIG 테이블 조회 시 실행 계획>

전체 Buffers(논리적 IO)는 258K 가 나왔고, 5.57초 걸렸다.

T_ORD_BIG 테이블에 'TABLE ACCESS FULL' 작업을 한 다음에 'SORT AGGREGATE' 처리를 하고 있다. 테이블 전체를 읽어서 ORD_SEQ가 343인 데이터를 찾아내서 카운트 처리를 하였다.

 

예제 ) ORD_SEQ 컬럼에 인덱스 구성

CREATE INDEX X_T_ORD_BIG_TEST ON T_ORD_BIG(ORD_SEQ);

 

<인덱스가 존재하는 BIG테이블 조회 시 실행계획>

인덱스 생성이 완료 후 아까 수행했던 SQL을 다시 실행해보면 Buffer가 258K에서 24로 좋아졌고, 시간 도 5.57초에서 0.02초로 개선되었다.

'X_T_ORD_BIG_TEST' 인덱스를 'INDEX RANGE SCAN'하고 있고, ORD_SEQ가 343인 데이터를 찾기 위 해 인덱스를 이용한 것이다.

 

728x90
320x100