INDEX(색인)
SQL 구문 중 SELECT 처리 속도를 향상 시키기 위해 컬럼에 대해 생성하는 객체이다.
인덱스 내부 구조는 B* 트리(B-star tree) 형식으로 되어 있다.
* 장점
1. 이진 트리 형식으로 구성되어 자동 정렬 및 검색 속도가 증가한다.
2. 조회 시 테이블의 전체 내용을 확인해 조회하는 것이 아닌 인덱스가 지정된 컬럼만 이용해 조회해 시스템의 부하가 낮아진다.
* 단점
1. 데이터 변경(INSERT,UPDATE,DELETE) 작업 시 이진 트리 구조에 변형이 일어난다.
-> DML 작업이 빈번한 경우 시스템의 부하가 늘어 성능이 저하된다.
2. 인덱스도 하나의 객체이기 때문에 별도 저장공간이 필요하다. (메모리 소비)
3. 인덱스는 생성하는데 시간이 좀 필요하다.
[작성법]
CREATE [UNIQUE] INDEX 인덱스명
ON 테이블명 (컬럼명[, 컬럼명 | 함수명]);
삭제 시
DROP INDEX 인덱스명;
* 인덱스가 자동 생성되는 경우
-> PK 또는 UNIQUE 제약조건이 설정된 컬럼에 대해 UNIQUE INDEX가 자동 생성된다.
예시)
CREATE TABLE TB_IDX (
TEST_NO NUMBER PRIMARY KEY,
TEST_ID VARCHAR(20) NOT NULL
);
이라는 테이블을 생성한다면
PRIMARY KEY로 지정된 TEST_NO에 대해 UNIQUE INDEX가 자동으로 생성 된다.
* 인덱스를 이용한 검색 방법
-> WHERE 절에 INDEX가 지정된 컬럼을 언급한다.
예시)
SELECT * FROM TB_IDX
WHERE TEST_ID = '값';
-> TEST_ID는 UNIQUE INDEX가 생성 되지 않은 컬럼이다.
-> 조회 시 수행 시간이 0.017s 정도 걸린다.
SELECT * FROM TB_IDX
WHERE TEST_NO = '값';
-> TESET_NO는 UNIQUE INDEX가 자동으로 생성된 컬럼이다.
-> 조회 시 수행 시간이 0.000s ~ 0.004s 정도 걸린다.
* INDEX가 적용된 컬럼을 이용한 SELECT 시 수행 시간이 10~30배 정도 차이가 난다.
번외
PL/SQL 을 사용해 조건문(IF/CASE), 반복문(LOOP, WHILE), 변수 선언이 가능하다.
예시)
BEGIN
FOR I IN 1..1000000 -- I는 1부터 100만까지 반복한다.
LOOP
INSERT INTO TB_IDX
VALUES (I, 'TEST'|| I);
END LOOP;
COMMIT;
END;
-> I가 1부터 100만까지 반복하면서
-> LOOP ~ END LOOP; 사이에 작성된 내용을 수행하고 수행이 완료되면
-> INSERT 내용을 COMMIT; 하고
-> 반복문 종료.
SELECT COUNT(*) FROM TB_IDX;를 통해 100만 개의 행이 INSERT가 되었음을 확인할 수 있다.