본문 바로가기

Database

[ SQL ] ORACLE INDEX

 

INDEX 

 

  • 인덱스 테스트를 위한 테이블 생성
CREATE TABLE INDEX_TEST
    (
        T_ID        CHAR(8)      NOT NULL,
        T_NAME      VARCHAR(50)  NOT NULL
    );

 

테이블 편집

 

인덱스 추가

 

  • 인덱스 이름은 어떤 컬럼의 인덱스인지 알아볼 수 있도록 정해주는 게 좋다.
  • 인덱스 유형은 고유하지않음, 고유, 비트맵 등이 있다.
  • B-TREE(BALANCE TREE) INDEX (고유하지 않음, 고유)
    트리구조로 데이터를 분류해서 관리, 추후 데이터가 많아지면 많아질 수록 UPDATE, INSERT 의 속도가 느려진다.

    고유하지 않음 (CLUSTERED INDEX)
     - 데이터가 중복되지 않을 때 사용
    고유 (NON CLUSTERED INDEX)
     - 데이터가 중복될 때 사용
  • BITMAP INDEX
     - 2진수로 데이터를 정렬, 해당 필드에 데이터의 종류가 한정되어 있을 때 사용 (ex) 서울(1,0,0,0,0), 부산(0,0,0,0,1) ...)
     - 잘 쓰이지 않음
  • 정렬 데이터를 불러올 때 처음부터 순서대로 볼 것인가, 뒤부터 앞쪽으로 볼 것 인가

 

 

/* 테스트 해보고 싶을 때 */
SET SERVEROUTPUT ON;
DECLARE
    -- 변수 선언부
    
BEGIN

    -- 로직부
END
;

 

/* 1부터 100까지 출력 */
DECLARE

BEGIN

    FOR I IN 1..100
    LOOP
    
        DBMS_OUTPUT.PUT_LINE(I);
    
    END LOOP
    ;

END;

 

/* INDEX_TEST TABLE 에 데이터를 넣어보자 */
DECLARE
    
BEGIN

    FOR N IN 1..1000000
    LOOP
    
        INSERT INTO INDEX_TEST
        VALUES ('I' || TO_CHAR(N, 'FM0000000'), '홍길동' || TO_CHAR(N))
        ;
    
    END LOOP;

END
;

 

SELECT COUNT(*) FROM INDEX_TEST;

INDEX_TEST 테이블의 데이터 갯수

 

 

 

SELECT * FROM INDEX_TEST WEHRE T_ID = 'I0074142';

T_ID 가 I0074142인 데이터 찾기

 

바로 상단 쿼리의 실행계획 

 

  • OBJECT_NAME : 테이블 이름
  • OPTIONS : 쿼리 실행 시, 옵티마이저가 바라보는 데이터 유형
  • CARDINALITY : 중복도, 중복된 값이 적을 수록 숫자가 작음, 이 값을 보고 어떤 인덱스 값을 부여할 지 판단
  • COST : CPU가 일을 하는 양, 크면클수록 느림

 

T_ID 컬럼에 인덱스를 주지 않았을 때

 

  • OBJECT_NAME : INDEX_TEST 테이블을 보겠다.
  • OPTIONS : INDEX_TEST 테이블의 전체 데이터를 하나하나 전부 보겠다. (FULL SCAN)
  • CARDINALITY : T_ID 컬럼의 데이터 중복도
  • COST : 쿼리를 실행 함으로서 CPU가 하는 일을 양

 

T_ID 컬럼에 인덱스를 줬을 때

 

  • OBJECT_NAME : INDEX_TEST 테이블을 보겠다.
  • OPTIONS : 인덱스를 줌으로서 옵티마이저가 스스로 데이터를 분류했고 그에 따라 보겠다.
  • CARDINALITY : T_ID 컬럼의 데이터 중복도 (B-TREE의 고유)
  • COST : 쿼리를 실행 함으로서 CPU가 하는 일을 양 (현저히 줄어든 것을 볼 수 있음)

'Database' 카테고리의 다른 글

[ SQL ] SCHEDULER (스케줄러)  (0) 2021.05.13
[ SQL ] 반복문  (0) 2021.05.12
[ SQL ] 트리거 (TRIGGER)  (0) 2021.05.04
[ SQL ] TRUNC(TRUNCATE) VS ROUND  (0) 2021.05.03
[ SQL ] TO_CHAR 함수  (0) 2021.05.03