index 

- 많은 양의 레코드에서 필요한 값을 빠르게 검색하기 위해 사용 (검색속도 향상)

- 레코드 수가 적으면 index를 사용하지 않는 것이 더 빠름

- 자동 인덱스, 수동 인덱스를 제공

  • 자동 인덱스 : 테이블을 생성할 때 primary key, unque를 생성하면 자동으로 생성되는 인덱스
  • 수동 인덱스 : 개발자가 생성하는 인덱스

- unique index, non-unique index, bitmap index, composite index 4가지를 제공

- 실제 테이블과 생성된 index는 별개로 동작함

   (테이블에 DML이 발생하더라도, index에는 반영되지 않음)

   -> 시간이 지날수록 실제 데이터와 인덱스 간의 정보차가 발생

    => 인덱스를 주기적으로 rebuild 해야 함!

- 테이블 삭제 시 인덱스도 함께 삭제 됨

 

- 인덱스로 설정해야하는 컬럼의 선정기준

  • where절에서 자주 사용되는 컬럼
  • where절에서 사용되더라도 함수를 사용하지 않고 조회하는 컬럼
  • 자주 변경되지 않는 컬럼

- 인덱스는 전체 레코드 중 10~15% 정도의 결과가 조회될 때 가장 속도가 빠름

  (인덱스가 항상 빠른 것은 아님)

- 인덱스는 테이블의 주소에 대한 참조 (DBMS는 내용에 의한 참조)

     => Oracle에서는 record의 주소를 rowid 컬럼(유일함)으로 사용

- 인덱스 생성) create [인덱스종류] index on 테이블명 (컬럼명,,,);

     => 해당 테이블의 컬럼을 조회 조건으로 사용하여 검색

- 인덱스 삭제) drop 인덱스 인덱스명;

- 인덱스 갱신) alter index 인덱스명 rebuild;

   -> 실제 테이블과 인덱스의 데이터를 일치시키는 것!

 

* index 종류별 생성문법 

1) unique 인덱스

 - 컬럼의 값이 유일할 때 사용하는 인덱스

 - 컬럼의 값이 null이거나 유일해야 함

 - 테이블을 생성할 때 PK를 설정하거나 unique를 설정하면 자동생성되는 자동 인덱스

- 수동 생성도 가능

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

2) non-unique 인덱스

 - 컬럼의 값이 중복될 때 사용하는 인덱스

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

3) bitmap 인덱스

 - 컬럼의 값이 키는 아니지만 독특한 형태일 때 사용하는 인덱스

     Ex) LOT 번호

 - 문법) create bitmap index 인덱스명 on 테이블명(컬럼명);

4) composite 인덱스

 - 여러 개의 컬럼이 조합되어 사용되는 인덱스

 - 문법) create index 인덱스명 on 테이블명(컬럼명 ,,, )

 

* 인덱스를 사용한 검색

- index hint를 기술함 : 여러 줄 주석과 한 줄 주석 방식 사용

       /*+ */ : 여러 줄 주석방식

       --+  : 한 줄 주석 방식

- index hint를 사용하면 정렬의 효과를 얻을 수 있음

- select 쿼리에 가장 처음에 기술함 : selelct /*+ 인덱스힌트 */ 컬럼명,,,

  > 인덱스 힌트 : 인덱스 종류 (테이블명(alias) 인덱스명)

       Ex) index (emp PK_EMP)  : 순방향 정렬의 효과

              index_desc (emp PK_EMP)  : 역방향 정렬 // 단, record가 많다면 정렬 안 되고  where절을 사용했을 때만 정렬됨

 

* index 관련 data dictionary

- 테이블에 설정된 인덱스 조회 : user_indexes data dictionary

    > last_analyzed column은 마지막으로 rebuild된 시간을 보여줌

- index로 설정된 컬럼을 조회 : user_ind_columns data dictionary

 


# 오늘의 코딩 #

-  인덱스 생성 / 조회를 해보자

 

#인덱스 생성

--사원번호로 non-unique index 생성
create unique index empno_ind on test_emp(empno);

select *
from user_ind_columns
where table_name='TEST_EMP';

#출력결과#

=> 딕셔너리를 조회하면 생성한 인덱스를 확인할 수 있다!

 


#인덱스를 이용한 조회

--인덱스를 사용한 조회, select hint 부여
select  /*+ index (test_emp EMPNO_IND)*/ empno, name, sal, hiredate
from    test_emp
where   empno =7788;

#출력결과#

=> 특정 사원번호를 인덱스를 통해 조회 가능!!

'Development > Oracle' 카테고리의 다른 글

[Oracle] 백업/복구/exists 함수  (0) 2021.10.06
[Oracle] 권한부여 & 회수 / synonym / view  (0) 2021.10.01
[Oracle] sequence  (0) 2021.09.30
[Oracle] alter  (0) 2021.09.29
[Oracle] 제약사항 (Constraint)  (0) 2021.09.28

+ Recent posts