국비필기노트/DBMS_Oracle

데이터베이스(DBMS)_인덱스(index)

개발..너... 2022. 4. 25. 11:14

▶index란?

조회속도를 향상 시키기 위한 데이터베이스 검색 기술로서 index는 책의 목차라고 생각을 하면 된다. 책의 내용을 쉽게 찾아갈 수 있는 길잡이로서 '색인'이라는 뜻을가진다. 

 

즉, 인덱스가 필요한 이유는 인덱스를 생성해줌으로써 조회속도를 빠르게 할 수 있기 위함이다. 

 

 

▶index 주의사항

1)index 컬럼을 여러개 만들지 않는다.

예를들어 학원 데이터베이스를 관리한다고 한다고 하자. 우리는 검색을 쉽게 하기 위해 선생님의 이름이 들어간 컬럼에 index를 걸어주었다. 그럼 오라클의 내부에서 선생님 이름에 대한 index 테이블이 별도로 생성이 되고 오라클은 저 index테이블을 먼저 검색을 함으로 데이터를 빨리 찾는 것이다. 그래서 해당테이블에 index를 많이 걸어두면 개별의 index테이블이 여러개 생성이 되기 때문에 서로 index간의 데이터가 충돌하거나 검색속도가 오히려 느려지는 현상이 발생된다. 

 

정리하자면 index를 테이블의 특정 컬럼에 한개 이상 주게되면 index table이 따로 만들어지고, 인덱스 컬럼의 로우값과 rowid값이 저장되며, 로우값은 정렬된 트리 구조로 저장시켜 두었다가 검색시 좀 더 빠르게 해당 데이터를 찾는데 도움을 준다.

 

*rowid) 특정 테이블에 데이터를 입력을 하면 하나의 row가 생성이 된다. 근데 이 row가 저장될 때 오라클에선 각각의 row마다 ID를 부여하고 그것이 rowid이다. 

 

 

rowid 예시

 

2)index는 select에 대한 속도만 향상시켜준다.

DML명령을 사용할 때는 원본 테이블은 물론, index 테이블에도 데이터를 같이 갱신해주어야한다. select에 대한 index는 드라마틱하게 속도가 향상되나 update, insert, delete 명령을 사용할 때는 속도가 느려진다.

 

index 테이블에는 데이터가 삭제가 불가하기 때문인데 사용자가 데이터에 대한 delete나 update를 사용할 경우에 index테이블엔 '사용하지 않음'이라는 표시만 되고 내용을 계속 가지고있는다. update를 하면 index에는 delete를 한 후 다시 insert 작업을 하는 식으로 명령을 수행하는 식이다.

 

데이터가 적은(수천건 미만) 경우에는 인덱스를 설정하지 않는게 오히려 성능이 좋다. 그래서 select보다 insert, update, delete 처리를 많이 해야하는 컬럼에는 index를 거는 것에 많은 고민을 해야한다.

 

▶index 생성방법

1)unique index : index를 사용한 컬럼의 중복값들을 포함하지 않고 사용할 수 있는 장점

        create unique index 인덱스명 on 테이블명(컬럼);

 

 

2)non-unique index: index를 사용한 컬럼의 중복값들을 포함시킬 수 있다.

        create index 인덱스명 on 테이블명(컬럼);

 

▶index 생성예시

1)unique index 

 

 

index 예시를 위한 employees와 동일한 employees3테이블을 생성해주고

 

 

100에 대한 중복값을 만들어주었다. 

 

 

이 상태에서 CREATE UNIQUE INDEX 로 index값을 만드니 중복값이 있는 컬럼에 Unique index를 걸어주었기에 오류가 발생된다.  

 

 

오류발생확인 후 위의 중복값을 지우주고 unique index를 다시 걸어주니 정상적으로 index가 설정되었다. 

index 의 정상처리 확인은 Properties에서 확인할 수 있다. 

 

2)non-unique index 

 

 

이번에도 예시를 위한 test 테이블에 중복 데이터를 만들어두고 

 

non-unique inedx로 테이블을 선언해준다. 

 

 

unique를 허용하는 테이블이기에 정상처리가 되었다.