개발 & 데이터베이스/DB

[ORACLE] 인덱스 (Index) 생성과 삭제 및 사용 시 주의사항

K.두부 2021. 12. 1. 01:15
반응형

오늘은 데이터베이스 객체이며, '색인'이라는 사전적 의미를 가지고 있는 인덱스 (Index)에 대해서 알아보겠습니다. 인덱스에는 다양한 종류가 있고 상황에 따라 다르게 사용됩니다. 각종 SNS, 게임 등을 사용자 입장에서 봤을 때 서비스를 이용하면서 가장 답답한 건 '속도'라고 생각합니다. 그렇다면 데이터를 불러오려고 할 때 속도를 높이는 방법에는 무엇이 있을까요? 바로 '인덱스' 기술입니다. 오라클에서는 기본적으로 FULL SCAN을 하도록 되어있습니다. 말 그대로 조회하고자 하는 테이블의 모든 데이터를 한 번씩 다 훑어본다는 뜻으로 데이터양이 많을수록 조회 속도가 현저히 떨어진다는 의미입니다.

 

인덱스를 사용하게 되면 데이터 조회 속도가 말도 안 되게 개선됩니다. 하지만 무분별한 인덱스 생성으로 인한 전체적인 데이터베이스의 성능 부하가 발생할 수 있습니다. 인덱스는 별도의 공간에 컬럼 값들을 정렬한 후 생성합니다. 즉, 인덱스를 생성하면 저장 공간을 차지한다는 의미입니다. 그렇기 때문에 무분별한 인덱스 생성보다는 쿼리문을 좀 더 효율적으로 짜는 게 베스트이며, 마지막 수단으로 인덱스를 사용하는 걸 권장합니다.

 

인덱스 생성과 삭제
CREATE[UNIQUE] INDEX 인덱스명 ON 테이블명 (컬럼명);
DROP INDEX 인덱스명;

인덱스를 생성하고 삭제하는 방법은 위와 같습니다. UNIQUE 키워드를 붙이면 컬럼 값의 중복을 허용하지 않는다는 뜻입니다.

 

인덱스 생성 및 주의사항

앞서 말했듯이 무분별한 인덱스 생성은 전체적인 데이터베이스의 성능 부하를 발생시킵니다. 그렇다면 생성 및 사용 시에 주의할 점은 어떤 것들이 있을까요?

 

  • 테이블 조회 시 전체 데이터 수의 최대 15%를 넘지 않는게 좋다.
  • 테이블 데이터 수가 적으면 필요가 없다.
  • 컬럼의 유일성이 좋거나 범위가 넓은 값을 지정해야한다.
  • NULL 값이 많은 컬럼은 피하는게 좋다.
  • 한 테이블에 만들 수 있는 인덱스 수의 제한은 없지만 너무 많이 만들면 부하가 발생할 수 있다.
  • 조회보다 수정, 삭제, 삽입 작업이 빈번한 테이블에는 사용하지 않는게 좋다.

 

인덱스는 '수정, 삭제, 삽입 작업의 성능이 매우 안좋다'는 치명적인 단점이 있습니다. 그럼에도 사용하는 이유는 조회 시에 성능이 월등히 뛰어나기 때문입니다. 그렇다면 인덱스의 DML 작업이 왜 안좋은지 알아보겠습니다.

 

1. INSERT

인덱스는 별도의 공간에 정렬된 컬럼값들을 생성해놓기 때문에 공간 부족 현상이 발생할 수 있다.

 

2. DELETE

인덱스에서 데이터는 지워지지 않으며, '사용하지 않는다'는 의미를 표시만 해둔다. 일반적인 테이블은 데이터가 DELETE 되면 해당 위치 데이터가 지워지고 사용이 가능하지만 인덱스는 그렇지 않다.

 

3. UPDATE

인덱스에선 UPDATE 작업이 없다. 기존의 데이터를 DELETE 한 다음에 새로운 값을 INSERT 한다. 그로 인해 일반적인 테이블에 비해서 더 큰 부하를 준다.

 

인덱스 종류

1. B-TREE INDEX : 실시간 데이터 입력/수정 환경에 주로 사용

종류 설명
고유 인덱스 중복되지 않은 데이터를 인덱스의 값으로 지정하는 인덱스
비고유 인덱스 중복되는 데이터를 인덱스의 값으로 지정하는 인덱스
함수 기반 인덱스 조인이나 조건에 사용할 인덱스 (해당 인덱스를 사용하려면 함수로 가공된 형태 그대로 사용해야함)
내림차순 인덱스 큰 값을 많이 조회하는 곳에서 주로 사용하는 인덱스
결합 인덱스 두 개 이상의 컬럼을 합친 인덱스

 

2. BITMAP INDEX : 데이터 변경량, 값 종류가 적을 때 사용

CREATE BITMAP INDEX 인덱스명 ON 테이블명 (컬럼명);
반응형