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
'INDEX' 카테고리의 다른 글
INDEX의 기본 개념_INDEX RANGE SCAN VS. TABLE ACCESS FULL (0) | 2021.07.03 |
---|---|
INDEX의 기본 개념_데이터를 찾는 방법 (0) | 2021.07.03 |
INDEX의 기본 개념_B*트리 구조와 탐색 방법 (0) | 2021.07.03 |
INDEX의 기본 개념_인덱스 종류 (0) | 2021.07.03 |