Oracle SQL 강좌

인덱스는 테이블이나 클러스트에서 쓰여지는 선택적인 객체로서, 오라클 데이터베이스 테이블내의 원하는 레코드를 빠르게 찾아갈 수 있도록 만들어진 데이터 구조이다.

- 자동 인덱스 : 프라이머리 키 또는 UINQUE 제한 규칙에 의해 자동적으로 생성되는 인덱스.

- 수동 인덱스 : CREATE INDEX 명령을 실행해서 만드는 인덱스

인덱스를 생성하는 것이 좋은 컬럼
  • ① WHERE절이나 join조건 안에서 자주 사용되는 컬럼
  • ② null 값이 많이 포함되어 있는 컬럼
  • ③ WHERE절이나 join조건에서 자주 사용되는 두 개이상의 컬럼들
다음과 같은 경우에는 인덱스 생성이 불필요 하다.
  • ① 테이블이 작을 때
  • ② 테이블이 자주 갱신될 때

오라클 인덱스는 B-tree(binary search tree)에 대한 원리를 기반으로 하고 있다. B-tree 인덱스는 컬럼안에 독특한 데이터가 많을 때 가장 좋은 효과를 낸다.

이 알고리즘 원리는
① 주어진 값을 리스트의 중간점에 있는 값과 비교한다.만약 그 값이 더 크면 리스트의 아래쪽 반을 버린다. 만약 그 값이 더 작다면 위쪽 반을 버린다.
② 하나의 값이 발견될 때 까지 또는 리스트가 끝날 때까지 그와 같은 작업을 다른 반쪽에도 반복한다.

비트맵 인덱스

비트맵 인덱스는 각 컬럼에 대해 적은 개수의 독특한 값이 있을 경우에 사용하는 것이 좋다.(ex 남,여의 값을 가지는 성별 컬럼)

비트맵 인덱스는 B-tree 인덱스가 사용되지 않을 경우에서 성능을 향상 시킨다.

테이블이 매우 크거나 수정/변경이 잘 일어나지 않는 경우에 사용할수 있다.

 
SQL> CREATE BITMAP INDEX emp_deptno_indx 
     ON emp(deptno); 
    

UNIQUE 인덱스

UNIQUE 인덱스는 인덱스를 사용한 컬럼의 중복값들을 포함하지 않고 사용할 수 있는 장점이 있다.

프라이머리키UNIQUE 제약 조건시 생성되는 인덱스는 UNIQUE 인덱스이다.

 
SQL> CREATE UNIQUE INDEX emp_ename_indx 
     ON emp(ename); 
    

NON-UNIQUE 인덱스

NON-UNIQUE 인덱스는 인덱스를 사용한 컬럼에 중복 데이터 값을 가질수 있다.

 
SQL> CREATE INDEX  dept_dname_indx 
     ON dept(dname);
    

결합 인덱스

복수개의 컬럼에 생성할 수 있으며 복수키 인덱스가 가질수 있는 최대 컬럼값은 16개 이다

 
SQL> CREATE UNIQUE INDEX emp_empno_ename_indx 
     ON emp(empno, ename);     
    

인덱스의 삭제

인덱스의 구조는 테이블과 독립적이므로 인덱스의 삭제는 테이블의 데이터에는 아무런 영향도 미치지 않는다.

인덱스를 삭제하려면 인덱스의 소유자 이거나 DROP ANY INDEX권한을 가지고 있어야 한다.

인덱스는 ALTER를 할 수 없다.

 
SQL> DROP INDEX emp_empno_ename_indx; 
    

인덱스 데이터사전

인덱스에 대한 정보는 USER_INDEXES 뷰 또는 USER_IND_COLUMNS뷰를 통해 검색할 수 있다.

 
SQL> SELECT index_name, index_type 
     FROM USER_INDEXES 
     WHERE table_name='EMP'; 

INDEX_NAME              INDEX_TYPE
-------------------     -----------
EMP_DEPTNO_INDX         BITMAP
EMP_PK_EMPNO            NORMAL    
    

인덱스에 대한 자세한 강좌는 어드민 강좌를 참고해 주세요 ^^

- 강좌 URL : http://www.gurubee.net/lecture/1035

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 쌩초보님 [2005.06.06 07:46:49]
질문있는데요 결합인덱스에서 UNIQUE INDEX 가 맞나요? INDEX가 맞나요?

by 조성오 [2005.08.10 10:35:10]
자료 감사합니다.

by ^^ㄳㄳ [2005.10.25 18:32:05]
배고파요

by smile [2005.11.09 20:32:23]
퍼갑니다. ^^

by 잠꾸러기 [2006.05.12 15:35:39]
아~ 졸려``

by 변원상 [2006.10.12 19:11:20]
다 필요없읍니다.
CREATE INDEX 면 OK

by 김종우 [2006.12.06 15:20:06]
퍼갑니다.

by 김동언 [2006.12.18 13:34:39]
오타 자동인덱스 : uinque -> unique

by 이창준 [2007.07.23 18:55:42]
B-tree(binary search tree) => balance tree

by 김윤경 [2007.11.07 10:57:12]
많은 도움이 되었어요^^;;;

by 차영재 [2007.12.11 14:39:37]
좋은 정보~이제야 뭔가 감이 잡힙니다...처음부터 보지는 않고 원하는 것만 쏙쏙 골라서 봤지만 시간이 된다면 처음부터 끝까지 다 읽어보고싶네요^^

by 목군 [2008.02.04 20:17:29]
왜 null 값이 많이 포함되어 있는 컬럼 을 인덱스로 잡아야 하는건가요???

by kinjsp [2008.08.07 14:53:34]
저도 담아갑니다^^

by DJ메탈짱™ [2009.08.21 08:58:02]
좋은 정보 감사합니다. ^^ 간단 명료한 강좌였네요~!

by 양한마리 [2010.02.03 13:36:01]
좋은 자료 감사합니다.

by 김민성 [2010.02.13 15:33:14]
ANALYZE INDEX PK_EMPNO VALIDATE STRUCTURE
인덱스 중간에 빈공간이 있어도 빈공간이 재활용되기가 힘듭니다.
죽은 나무처럼 공간만 차지하고 있을수 있습니다.
(빈공간은 UPDATE, DELECT 로 발생하겠지요)
아래와 같이 빈공간이 얼마나 되는지 체크를 해보시기 바람니다.
(아래 analyze명령어는 통계정보를 생성하는 것이 아니라 인덱스 구조를 검증
하게 됩니다. 또한 아래 명령어는 lock을 걸게 되므로 트랜젝션이 없는 시간대에 실
행하십시오)
ANALYZE INDEX PK_EMPNO VALIDATE STRUCTURE;
아래 sql로 얼마나 빈공간이 있는지 체크 바람니다.
select name, btree_space, used_space,pct_used from index_stats;
PCT_USED가 사용된 공간의 비율입니다.

by 왕초보 [2010.04.14 14:40:37]
다음과 같은 경우에는 인덱스 생성이 불필요 하다.
① 테이블이 작을 때
② 테이블이 자주 갱신될 때

라고 되어있는데 테이블이 자주 갱신된다는 말은 데이터가 insert ? update ? 인가요?

by 현 [2010.04.21 08:42:24]
테이블이 자주 갱신될 때 인덱스 생성이 불필요하다는 말은 논란의 소지가 있을 수 있겠군요.

일단, 위의 왕초보님이 질문하신 '갱신'이라는 말은 업데이트를 얘기 하는 것이구요, 인덱스 컬럼에 자주 갱신이 일어날 경우 인덱스가 불필요한 것이 아니라 낭비가 심해지겠죠.

갱신이 자주 일어나는 테이블이라면, 인덱스 컬럼에 갱신을 하는 것이 아니라면 인덱스가 반드시 있어야 합니다.
갱신을 하기 위해서 특정 레코드를 찾아 가야 하는데 인덱스가 없다면 늘 풀스캔을 하겠죠..그것도 자주 일어난다면 자주 풀스캔을 하겠죠.

제가 지난번 사이트에서 초당 1만건 정도 INSERT/UPDATE가 일어나는 테이블이 있었는데 그 테이블에 INDEX contention이 자주 발생했습니다.
해결하기 가장 좋은 해법은 해당 인덱스를 삭제하는 것이었는데 UPDATE 때문에 삭제를 못하고 다른 방식으로 해결했네요.


by 왕초보 [2010.04.21 19:14:50]
감사합니다 히읗 히읗

by 김정식 [2011.01.17 15:17:14]
인덱스 이름 변경
ALTER INDEX old_index RENAME TO new_index;

by 손님 [2012.04.18 19:47:52]

a테이블과 동일한 구조의 b테이블을 생성하고 (테이블명은 다름^^)
a테이블의 자료를 b테이블에 모두 넣으려 합니다.

그런데.
b테이블엔  a테이블에 없는 인덱스를 추가하려면...

1. b테이블 생성 및 데이터 넣기 이후 인덱스 추가
2. b테이블 생성 및 인텍스 추가 이후 데이터 넣기

**** 어느 방법을 써야하나요?

***** 1.번방법은  데이터가 이미 있는 상태에서 인텍스가 추가되면
그 인덱스가 제대로 작동을 하나요?  혹, 새로 추가되는 데이터 부터 인덱스가 반영되지 않나요?
모르겠어용...
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입