Oracle/용어정리2009. 11. 17. 14:31
개발을 하고 있을 때부터 index란 무엇인지 궁금했고, index를 사용하면 원하는 결과를 얻기가 빨라진다고 했는데
어떻게 해서 빨라지는지 매우 궁금했다.
이제서야 그 의문이 풀리는 순간이다.

자. 그럼 index가 무엇일까?

인덱스란, 전문적으로 rowid를 저장하는 객체 테이블과는 별도로 저장된다.
그리고 block dump로 사람이 볼 수 있는 방법이 있기는 하지만, 식별하기 어렵다고 한다.

그러면 index를 생성해 보자

create index emp_deptno_idx on emp(deptno);

다음과 같은 형태의 index가 생긴다.
아래의 쿼리는 인덱스를 직접 조회하는 것은 아니고, 아래와 같은 형태의 인덱스가 생성된다는 것을 설명하기 위한 것이다.

select deptno, rowid
from emp
order by deptno;


DEPTNO ROWID
10 AAACYIAAFAAAAAgAAG
10 AAACYIAAFAAAAAgAAI
10 AAACYIAAFAAAAAgAAN
20 AAACYIAAFAAAAAgAAD
20 AAACYIAAFAAAAAgAAM
20 AAACYIAAFAAAAAgAAK
20 AAACYIAAFAAAAAgAAA
20 AAACYIAAFAAAAAgAAH
30 AAACYIAAFAAAAAgAAC
30 AAACYIAAFAAAAAgAAJ
30 AAACYIAAFAAAAAgAAB
30 AAACYIAAFAAAAAgAAL
30 AAACYIAAFAAAAAgAAF
30 AAACYIAAFAAAAAgAAE


결과를 보면 알겠지만, 위의 index는 deptno의 순서대로 정렬이 되고, 
실제로 row가 저장되어 있는 곳의 주소인 rowid가 저장된다.

그리고 이 index는 두개의 컬럼으로도 만들 수 있다.

create index emp_deptno_sal_idx on emp(deptno, sal);


아래의 쿼리문 결과와 같은 index를 생성한다.

select deptno, sal, rowid
from emp
order by 1, 2, 3;

DEPTNO SAL ROWID
10 1300 AAAM3/AAEAAAAa2AAN
10 2450 AAAM3/AAEAAAAa2AAG
10 5000 AAAM3/AAEAAAAa2AAI
20 800 AAAM3/AAEAAAAa2AAA
20 1100 AAAM3/AAEAAAAa2AAK
20 2975 AAAM3/AAEAAAAa2AAD
20 3000 AAAM3/AAEAAAAa2AAH
20 3000 AAAM3/AAEAAAAa2AAM
30 950 AAAM3/AAEAAAAa2AAL
30 1250 AAAM3/AAEAAAAa2AAC
30 1250 AAAM3/AAEAAAAa2AAE
30 1500 AAAM3/AAEAAAAa2AAJ
30 1600 AAAM3/AAEAAAAa2AAB
30 2850 AAAM3/AAEAAAAa2AAF



추가)
보통 index에 데이터를 넣는 것은 일반 테이블에 데이터 넣는 것보다 3배정도 걸림
여기서 테이블에 관련된 인덱스가 2개라면 당연히 그 배가 걸리는 것이다.

인덱스 1개
데이터 입력 1시간
인덱스 입력 3시간

인덱스 2개
데이터 입력 1시간
인덱스 입력 6시간

그리고 인덱스를 잘 만든다면 오라클의 최고수가 될 수 있다.

'Oracle > 용어정리' 카테고리의 다른 글

Enqueue vs Latch  (0) 2009.11.26
SCN  (0) 2009.11.17
dead lock  (0) 2009.10.29
OCP란??  (0) 2009.10.16
OCM  (0) 2009.06.27
Posted by 자수성가한 부자