2013년 10월 27일 일요일

(오라클인덱스)인덱스 개요, 인덱스란,

(오라클인덱스)인덱스 개요, 인덱스란, 

오라클의 논리적인 데이터 저장공간인 테이블에서 데이터를 빠르게 검색하기 위해 테이블과는 별도로 생성되는 Object를 인덱스라고 하죠... 

테이블에 대해 Primary Key를 생성하면서 자동으로 만들어 지는 인덱스가 있으며 Create Index 명령을 통해 만들어 지는 인덱스가 있습니다. 

인덱스는 WHERE절이나 join조건 안에서 자주 사용되는 컬럼 또는 null 값이 많이 포함되어 있는 컬럼, WHERE절이나 join조건에서 자주 사용되는 두 개이상의 컬럼들에 대해 생성할 필요가 있으며 데이터 건수가 적거나 대량의 인덱스나 Update등이 일어나는 테이블에는 Dead Lock의 가능성이 있으므로 조심해서 사용해야 합니다. 

데이터 건수가 많지 않은 경우(수백, 수천건인 경우)는 인덱스를 사용하지 않고 데이터를 FULL SCAN해서 검색을 하더라도 성능에 영향이 없지만 대량의 데이터(수백만, 수천만건 이상)인 경우 인덱스를 만들지 않으면 성능에 무지막지하게??  영향을 줄 수 있습니다. 

오라클에서 사용하는 인덱스는 다음과 같은 것들이 있습니다. 

- B Tree Index 
- Bitmap Index 
- Reverse Key Index 
- Function Based Index 

인덱스의 구조를 살펴보면... 

create index 명령을 사용하여 emp 테이블의 ename 컬럼에 대해 인덱스를 생성했다고 할때 별도의 공간에 생긴 인덱스 영역에는 ename 컬럼과 더블어 각 로우를 빠르게 액세스 할 수 있는 rowid라고 하는 정보도 같이 저장되게 되죠... 물론 실제 데이터가 존재하는 곳에도 rowid 정보를 가지고 있는데 이 값을 비교하여 데이터를 꺼내오게 됩니다. 

예를즐어 아래와 같은 Query가 수행된다면(생성된 인덱스 이름은 idx_emp_ename 이라고 가정 합니다.) 

select  /*+ INDEX(emp idx_emp_ename) */ 
          empno, ename, sal 
from emp 
where ename = '홍길동' 

인덱스를 통해 데이터를 꺼내 오라는 의미에서 오라클의 힌트를 사용했습니다. 힌트에 대해서는 상단의 Hint 강좌를 참고하세요~ 

위의 쿼리가 실행되면 인덱스 영역에서 홍길동 이라는 이름을 얼릉 찾고(인덱스 영역에는 이름 순서로 정렬되어 있겠죠^^) 그 rowid를 이용하여 데이터 영역에서 나머지 정보들을 찾게 되는 겁니다... 

참고로 rowid에는 오브젝트 번호, 파일번호,블록번호,로우번호등이 저장되어 있으므로 DB의 오든 로우(레코드)는 유일한 rowid를 가지게 됩니다. 

댓글 없음:

댓글 쓰기