위로 아래

INDEX

--인덱스 기본형
CREATE INDEX[UNIQUE|BITMAP] index명
On 테이블명(column명[,column명]...);

--인덱스 생성
CREATE INDEX idx_tdept1_dept_name
ON tdept1(dept_name);

--인덱스 생성 유무 확인
SELECT index_name, table_name
FROM user_indexes
WHERE table_name = 'tdept1';

--인덱스 걸린 컬럼 확인
SELECT index_name,table_name, column_name
FROM user_ind_columns
WHERE table_name = 'TDEPT1';

--인덱스 삭제
DROP INDEX idx_tdept1_dept_name;
  1. DATABASE에서 원하는 내용의 Table을 검색할 때 보다 빠르게 검색할 수 있도록 도와주는 오브젝트
  2. DB의 성능을 향상시키고 ORW의 유일성을 보장하기 위해 사용
  3. 잘못된 INDEX의 사용은 오히려 데이터베이스의 성능을 저하시킨다.

 

생성기준

  1. 사용자의 SQL문에서 WHERE 조건절에 자주 사용되는 컬럼이 대상이 된다
  2. WHERE 조건에 의한 결과 컬럼의 분포도가 2~4%인경우(10%기준)
  3. 분포도가 범위 이상이라도 일부분의 데이터 검색이라면 적용할 수 있다.
  4. 작은 테이블보다는 큰 테이블에 인덱스를 생성한다
  5. 빈번하게 변경되지 않는 테이블에 적용

 

인덱스 생성을 삼가하는 경우

  1. 테이블에 행이 적은 경우
  2. 컬럼이 WHERE 조건에 자주 사용되지 않을 때
  3. WHERE 조건에 의한 결과가 전체 행에 대해 10~15%의 결과보다 높게 리턴될 때
  4. 테이블이 자주 입력, 수정, 삭제될 때(오히려 검색속도가 나빠질 수 있다)

 

인덱스 생성 방법

  1. 자동생성
    1. Unique INDEX로 PRIMARY KEY 또는 UNIQUE KEY Constraint 생성시 자동으로 만들어진다
    2. 테이블의 기본키나 유일키로 선언되어 있는 경우 인덱스가 자동생성되는 경우이므로 수동으로 인덱스를 생성할 경우 에러가 된다
  2. 수동생성
    1. NON-UNIQUE INDEX로 ACCESS시간을 향상시키기 위해 USER가 직접 생성

 

 

 

 


INDEX 종류

-- Single Index(단일 열 인덱스) : 하나의 컬럼으로 만들어지는 인덱스
CREATE INDEX I_EMP_ENAME ON EMP1(ENAME);

-- CONCANATED INDEX(복합 인덱스)는 2개 이상의 컬럼으로 만들어지는 인덱스
CREATE INDEX I_EMP_NO_NAME ON EMP1(EMPNO, ENAME);

-- UNIQUE INDEX(유일 인덱스)는 해당 컬럼에 입력되는 테이터가 중복된 값을 가지지 않는 컬럼의 인텍스
CREATE UNIQUE INDEX I_EMP_EMPNO ON EMP1(EMPNO);

-- NONUNIQUE-INDEX(비유일 인덱스)는 중복된 값이 입력되는 컬럼의 인덱스
CREATE INDEX I_EMP_ENMAE ON EMP(ENAME);

-- FUNCTION-BASED(함수기반)는 여러 개의 컬럼을 산술식을 실행한 결과로 인덱스 생성할 때
CREATE INDEX I_EMP_SAL_COM ON EMP(SAL-COMM);

 

예시

더보기
--테이블 생성
CREATE TABLE tdept2
AS SELECT * FROM tdept;

--단일 인덱스 생성
CREATE INDEX idx_tdept2_area
ON tdept2(area);

--유일 인덱스 생성
CREATE UNIQUE INDEX idx_tdept2_dept_code
ON tdept2(dept_code);

--복합 인덱스 생성
CREATE INDEX idx_tdept2_com
ON tdept2(dept_code, dept_name);

-- 데이터 사전을 통해 복합인덱스 확인
-- 같은 인덱스 이름으로 두 개의 컬럼이 만들어진 결과가 나온다
SELECT index_name, column_name
FROM user_ind_columns
WHERE table_name = 'TDEPT2';