Beny's Study

03. INDEX(인덱 본문

[DB]/04. Oracle Object

03. INDEX(인덱

76beny 2022. 5. 14. 20:46

INDEX

■ DB에서 데이터 검색의 성능향상을 위해 별도의 INDEX를 활성화 하여 빠르게 검색이 가능하도록 돕는기능

(SQL명령문의 처리 속도를 향상시키기 위해서 컬럼에 대해 생성하는오라클 객체로 내부 구조는 B*트리 형식으로 구성되어 있음)
 사전에 색인과 같이 File의 위치, Block의 위치와 같은 실제 물리주소를 저장하는 원리
 조회할시 Key 값으로 조회하는 경우 일반값을 조회하는 것보다 10배 이상 빠르게 탐색 가능 ★★★★★

 

장점 & 단점

■ 장점

검색 속도가 빨라지고 시스템에 걸리는 부하를 줄여 시스템 전체 성능 향상

 

■ 단점

- 인덱스를 위한 추가 저장 공간이 필요하고 인덱스를 생성하는데 시간이 걸림
- 데이터의 변경 작업(INSERT/UPDATE/DELETE)이 자주 일어날 경우 오히려 성능 저하

 

INDEX 표현식

CREATE [UNIQUE] INDEX 인덱스 명
ON 테이블 명(컬럼 명, 컬럼 명 | 함수 명, 함수 계산식);

SELECT * FROM USER_IND_COLUMNS;

 

INDEX 구조

SELECT ROWID, EMP_ID, EMP_NAME
FROM EMPLOYEE;

 

INDEX  종류

1. 고유 인덱스 (UNIQUE INDEX): 고유한 값으로만 이뤄진 INDEX, ※ PK 선언시 기본적으로 같이 선언됨(DEFAULT) ★★★★★ 


2. 비고유 인덱스 (NOUNIQUE INDEX): 중복값을 허용하고, 일반적으로 사용자가 활용하는 인덱스 ★★★


3. 단일 인덱스 (SINGLE INDEX): INDEX로만 구성된 테이블(한개의 컬럼) -> 순서를 기준으로 탐색할 때 활용


4. 결합 인덱스 (COMPOSITE INDEX) : 두개 이상의 컬럼을 INDEX로 활용 할 때


 5. 함수기반 인덱스 (FUNCTION BASED INDEX): SELECT절이나 WHERE 절에 산술계산/ 함수식이 사용되는 경우

                                                                              -> 날짜 이외에 활용 거의 없음

 

고유 인덱스 (UNIQUE INDEX)

CREATE UNIQUE INDEX IDX_EMPNO
ON EMPLOYEE(EMP_NO);


SELECT * FROM USER_IND_COLUMNS
WHERE TABLE_NAME = ‘EMPLOYEE’;


CREATE UNIQUE INDEX IDX_DEPTCODE
ON EMPLOYEE(DEPT_CODE);

--* UNIQUE INDEX는 중복 값이 있는 컬럼에 생성 시 에러 발생

예문

-- 고유 인덱스 생성하기 (유니크한 값만 가능, PK)
CREATE UNIQUE INDEX IDX_EMP_NO 
ON EMPLOYEE(EMP_NO);
-- 유니크 하지 않은경우 생성되지 않음을 주의할것!

SELECT * FROM EMPLOYEE;
DELETE FROM EMPLOYEE WHERE EMP_ID = 231;

SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME = 'EMPLOYEE';
SELECT * FROM EMPLOYEE WHERE EMP_NO = '861015-1356452';
-- 현재는 체감불가능하나 속도가 비약적으로 상승함.

 

 

비고유 인덱스 (NOUNIQUE INDEX)

* 값이 고유하지 않아도 생성가능, 일반적으로 활용됨

CREATE INDEX IDX_DEPTCODE
ON EMPLOYEE(DEPT_CODE);

SELECT * FROM USER_IND_COLUMNS
WHERE TABLE_NAME = ‘EMPLOYEE’;
* NONUNIQUE INDEX는 중복 값이 있는 컬럼에도 생성 가능

 예문

CREATE INDEX IDX_DEPT_CODE 
ON EMPLOYEE(DEPT_CODE);

SELECT * FROM EMPLOYEE 
WHERE DEPT_CODE = 'D5';

 

 

결합 인덱스 (COMPOSITE INDEX)

CREATE INDEX IDX_DEPT
ON DEPARTMENT(DEPT_ID, DEPT_TITLE);

SELECT * FROM USER_IND_COLUMNS
WHERE TABLE_NAME = ‘DEPARTMENT’;
* COMPOSITE INDEX는 두 개 이상의 컬럼을 하나의 인덱스로 생성 가능
* COLUMN_POSITION의 순서에 의해 성능이 차이날 수 있음

 

CREATE INDEX IDX_NAME_PHONE 
ON EMPLOYEE(EMP_NAME, PHONE);

SELECT * FROM EMPLOYEE 
WHERE EMP_NAME LIKE '이%' AND PHONE LIKE '%5%';

 

함수기반 인덱스 (FUNCTION BASED INDEX)

CREATE TABLE EMP_SAL
AS SELECT EMP_ID, EMP_NAME, SALARY, BONUS,
		(SALARY + (SALARY + NVL(BONUS, 0)))*12 연봉
	FROM EMPLOYEE;
    
CREATE INDEX IDX_SALCALC
ON EMP_SAL ((SALARY + SALARY*NVL(BONUS, 0)))*12);

SELECT * FROM USER_IND_COLUMNS
WHERE TABLE_NAME = ‘EMP_SAL’;

 

CREATE INDEX IDX_SALARY 
ON EMPLOYEE( (SALARY +  SALARY * NVL(BONUS,0)) * 12); -- 연봉

SELECT EMP_NAME, ((SALARY + SALARY * NVL(BONUS,0)) * 12) as 연봉 
FROM EMPLOYEE
WHERE ((SALARY +  SALARY * NVL(BONUS,0)) * 12) > 7000000;
-- ※ 주의 선언한 함수 그대로 활용해야한다.

 

INDEX 재생성

■ DML 작업(특히 DELETE 명령)을 수행한 경우,  해당 인덱스 엔트리가 논리적으로만 제거되고
실제 엔트리는 남아있게 되므로 제거된 인덱스가 필요 없는 공간을 차지하고 있지 않도록 인덱스를 재생성 해야 함

 

■ 사용하는 이유 :  주기적으로 최적화 할때 사용 --> DB 운영중에는 트리 최적화가 되지 않으므로 주기적 필요.

ALTER INDEX 인덱스명 REBUILD;

 

INDEX 삭제

DROP INDEX IDX_SALARY;

 

 

INDEX 활용한 정렬

SELECT * FROM EMPLOYEE
ORDER BY EMP_NO;

SELECT * FROM EMPLOYEE
WHERE EMP_NO > ‘0’;

* 둘 다 주민번호 기준 오름차순 정렬이지만 ORDER BY로 정렬하는 것보다
인덱스를 활용하는 것이 더 좋은 성능을 보임


"본 인터넷 사이트 내의 모든 이미지, 문구, 콘텐츠, 내용 등에 대한 저작권은 76beny에게 있습니다.

이를 무단으로 도용, 복사, 전재, 재배포, 2차 변형 등을 할 경우

민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."

 

'[DB] > 04. Oracle Object' 카테고리의 다른 글

05. SYNONYM (동의어)  (0) 2022.05.14
02. SEQUENCE (시퀀스)  (0) 2022.05.14