Data base

인덱스

연93 2022. 10. 17. 20:12
-- 인덱스
/*
책.1)차례 2)찾아보기

목적 : SELECT문의 검색(조회) 속도의 성능향상

인덱스 생성 방법 : 컬럼명의 값을 가지고 인덱스 생성.
- 자동생성 : 테이블에 PRIMARY KEY, UNIQUE 제약조건 적용. (
    인덱스명이 제약조건객체이름으로 생성되므로, 인덱스명을 사용 할 경우에는 제약조건객체이름을 수동으로 생성하면 관리가 편해진다.
- 수동생성


인덱스 특징?
- 컬럼에 인덱스가 없을 경우 : 컬럼에 데이터 조회시 전체테이블 스캔이 진행된다.
예> SELECT * FROM 테이블명 WHERE 컬럼명 = 값;

인덱스 생성지침
❶ 일반적으로 테이블 전체 로우(레코드) 수의 15%이하의 데이터를 조회할 때 인덱스를 생성한다
물론 15%는 정해진 것은 아니며 테이블 건수, 데이터 분포 정도에 따라 달라진다.

❷ 테이블 건수가 적다면(코드성 테이블) 굳이 인덱스를 만들 필요가 없다
데이터 추출을 위해 테이블이나 인덱스를 탐색하는 것을 스캔(scan)이라고 하는데, 테이블 건수가 적으면 인덱스를 경유하기보다 테이블 전체를 스캔하는 것이 빠르다.

❸ 데이터의 유일성 정도가 좋거나 범위가 넓은 값을 가진 컬럼을 인덱스로 만드는 것이 좋다

❹ NULL이 많이 포함된 컬럼은 인덱스 컬럼으로 만들기 적당치 않다

❺ 결합 인덱스를 만들 때는, 컬럼의 순서가 중요하다
보통, 자주 사용되는 컬럼을 순서상 앞에 두는 것이 좋다.

❻ 테이블에 만들 수 있는 인덱스 수의 제한은 없으나, 너무 많이 만들면 오히려 성능 부하가 발생한다

인덱스는 스캔 성능을 극대화하기 위해 만든 객체인데, 너무 많이 만들면 INSERT, DELETE, UPDATE 시에 부하가 발생해 배보다 배꼽이 더 큰 결과를 초래한다.

*/
-- ex2_10테이블의 col11컬럼명에 UNIQUE 인덱스를 생성하는 구문.
CREATE UNIQUE INDEX ex2_10_ix01
ON ex2_10 (col11);

CREATE UNIQUE INDEX ex2_10_ix01
ON ex2_10(col11);

-- 시스템뷰 : user_indexes
SELECT *
FROM user_indexes
WHERE table_name = 'EX2_10';

SELECT index_name, index_type, table_name, uniqueness
  FROM user_indexes
 WHERE table_name = 'EX2_10';  

SELECT constraint_name, constraint_type, table_name, index_name
  FROM user_constraints
 WHERE table_name = 'JOB_HISTORY';
 
SELECT index_name, index_type, table_name, uniqueness
  FROM user_indexes
 WHERE table_name = 'JOB_HISTORY';

-- 결합인덱스 : 2개이상의 컬럼으로 인덱스 생성.   UNIQUE 키워드 제외.
CREATE INDEX ex2_10_ix02
ON ex2_10 (col11, col2); 

CREATE INDEX ex2_10_ix02
ON ex2_10 (col11, col2);
 
SELECT index_name, index_type, table_name, uniqueness
 FROM user_indexes
WHERE table_name = 'EX2_10';  

--인덱스 삭제 
DROP INDEX ex2_10_ix02;

-- 인덱스 수정(변경)은 없다. 인덱스는 생성및 삭제만 가능.