티스토리 뷰

IT/DB

[ORACLE] 오라클의 색인(Index) 사용

preamtree 2016. 12. 31. 02:00
반응형

부제: 인덱스란?, 인덱스에 대하여.


 색인(Index, 앞으로는 '인덱스'라고 칭하겠다.)은 오라클에서 데이터를 빨리 찾기 위한 용도의 데이터베이스 객체이다. 위키피디아에서 정의한 인덱스의 뜻은 다음과 같다.


"데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조"


 정의가 조금 애매하지만, 보통 인덱스를 통해 성능 향상을 얻는 연산은 검색 연산(SQL의 SELECT)이다. (더 이상의 자세한 설명은 생략한다.)




 인덱스가 무엇인지 설명하기 보다는, 오라클에서 인덱스를 어떻게 사용하는지 다루려고한다. 인덱스는 테이블에 있는 한 개 이상의 컬럼으로 만들 수 있다. 생성 예는 아래와 같다.


1
2
3
CREATE INDEX indexname1
ON table1(column1)
 
cs


 한편, 인덱스는 단일 컬럼 인덱스와 결합 인덱스로 분류할 수 있다. 또한, 유일성 여부에 따라 Unique인덱스와 Non-Unique인덱스로 분류할 수 있다. 위의 예는 단일 컬럼 + Non-Unique 인덱스를 생성한 것이다. 결합 인덱스 + Unique 인덱스를 생성하는 예는 아래에 있다.


1
2
3
CREATE UNIQUE INDEX indexname1
ON table1(column1, column2)
 
cs


 기본키(Primary Key)는 Unique 인덱스로 자동 지정이 된다. 그러므로 기본키에는 따로 인덱스를 지정할 필요가 없으며, 검색 연산 시 기본키를 이용하는 것이 바람직하다고 할 수 있다. 잠깐, 이는 거꾸로 말하면 인덱스를 최대한 생성하지 않는 것이 좋다는 뜻일 수도 있는데 어느정도 맞는 말이다.



 RDBMS에서 대표적으로 채택하고 있는 인덱스의 자료구조는 B-Tree이다. B-Tree에 Key값과 매핑주소값을 별도로 저장하는데, 데이터의 삽입, 수정, 삭제 시에도 인덱스에 필요한 정보가 함께 생성, 변경, 삭제가 일어난다. 즉, 과도한 인덱스 생성은 SELECT를 제외한 다른 연산의 효율과 저장 공간의 효율을 떨어뜨린다.


 더불어 인덱스 생성 시 고려해야할 사항이 더 있는데, 정리하면 아래와 같다.


1. 테이블의 전체 데이터 중 적은 량(최대 15% 정도)를 조회할 때 인덱스를 생성한다.


2. 테이블에 데이터가 적을 수록 인덱스의 효율은 떨어진다.


3. 데이터의 유일성이 높을수록, 데이터의 범위가 넓을 수록 인덱스의 효율은 올라간다.


4. NULL이 적은 컬럼이 인덱스 효율이 좋다.


5. 결합인덱스의 경우 자주 사용되는 컬럼을 앞쪽에 배치한다.


 1번의 경우, 테이블의 전체 데이터 중 많은 량을 조회한다면 인덱스의 효율이 떨어지기 때문에 그렇다. 그냥 Full Scan을 해도, 원하는 데이터가 나올 확률이 높아서 그렇다. 2번도 마찬가지이다. 데이터의 총량이 줄어들면, Full Scan을 해도 원하는 데이터가 나올 확률이 높아진다.


 3번의 경우, 겹치는 데이터가 줄어들고 컬럼 데이터의 경우의 수가 많아지면 Full Scan의 효율이 상당히 떨어지게 되어 인덱스 생성이 유리할 수 있다. 4번의 경우에는 NULL을 인덱스로 빠르게 찾을 수 있는 방법이 마땅치 않아서 그렇다. 5번의 경우에는 결합 인덱스의 경우에도 앞쪽 컬럼부터 검색을 진행하기 때문에 그렇다.


 지금까지 인덱스 생성법과 인덱스 생성 시 주의사항을 알아보았다. 인덱스가 물리적으로 어떻게 동작하는지 설명을 곁들이면 더욱 좋았을 텐데, 나중에 따로 포스팅을 하도록 하겠다.





-끝-





출처 및 참고

홍형경, 『오라클 SQL과 PL/SQL을 다루는 기술』, 길벗(2015)

https://ko.wikipedia.org/wiki/

http://www.indexassessoria.com.br/en/about-index/

저장



«   2021/12   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함
Total
759,110
Today
0
Yesterday
253