Backend/Oracle DB

21. 색인(Index)

개발개발빈이 2022. 5. 24. 20:31

○ Index (색인)

    - 데이터를 빠르게 찾을 수 있는 수단
    - 테이블에 대한 조회 속도를 높여 주는 자료구조
    - PK칼럼은 자동으로 인덱스 생성된다

 

 Index 방식

    ① full scan      
        - 처음부터 끝까지 일일이 검사하는 방법, 전수조사                                   -

        - 장점: 쓰레기데이터를 걸러낼 수 있다

        - 단점: 시간이 많이 소모된다
  
    ② index range scan  
        - 이름이 여러개인 경우 목차를 찾아서 페이지를 찾아감                               

        - 가장 일반적, 책 뒤의 인덱스 같은 느낌
        - 훨씬 빠름, 별도의 메모리가 있어야 함
  
    ③ index unique scan
        - 학번은 1개만 존재함, 유일한 값 

 

 Index 생성/삭제

    ① 생성     
        - 형식) create index 인덱스명 on 테이블명(칼럼명)

                                  
    ② 삭제
        -형식) drop index 인덱스명 

drop index emp2_name_idx;
drop index emp4_name_idx;
drop index emp4_namee_sal_idx;

 

    ③ 인덱스 데이터 사전

select * from user_indexes;
select * from user_indexes where index_name like 'EMP4%';

 

연습1) emp2 테이블로 index 생성 전후 비교 (PK가 없는 테이블)

    - 테이블 생성

create table emp2(
  id        number(5)    
  ,name     varchar2(25)
  ,salary   number(7, 2)
  ,phone    varchar2(15)
  ,dept_id  number(7)
);

    - 행추가

insert into emp2(id,name) values (10,'kim');
insert into emp2(id,name) values (20,'park');
insert into emp2(id,name) values (30,'hong');

 

    ① 인덱스 생성 전

        - 아래 select문 실행 후, 커서를 쿼리문 위에 두고 F10키를 누르면 계획설명 탭이 나옴

        - OPTIONS : FULL → full scan했다는 뜻

        - COST : 2 → COST 작업처리 속도

select * from emp2 where name='hong';

    ② 인덱스 생성 후

        - 인덱스 생성

create index emp2_name_idx on emp2(name);

        - 아래 select문 실행 후, 커서를 쿼리문 위에 두고 F10키를 누르면 계획설명 탭이 나옴

select * from emp2 where name='hong';

        - OPTIONS : FULL

        - COST : 2

데이터가 많지 않아 유의미한 차이는 없음

 

연습2) emp3 테이블로 index 생성 전후 비교 (PK가 있는 테이블)

    - 테이블 생성

    - pk는 인덱스가 자동으로 생성되면서 정렬된다

create table emp3 (
  no    number       primary key
  ,name varchar2(10)
  ,sal  number
);

 

    - 아래 select문 실행 후, 커서를 쿼리문 위에 두고 F10키를 누르면 계획설명 탭이 나옴

select * from emp3 where no=3;

    - OPTIONS : UNIQUE SCAN

    - COST : 1

 

 연습3) emp4 테이블 100만건의 레코드 대상으로 cost 비교 

    - 테이블 생성

create table emp4 (
    no    number      
    ,name varchar2(10)
    ,sal  number
);

    - 프로시저를 이용해서 100만행 추가하기

declare --선언문
    --변수선언
    i     number      := 1;      --i변수에 1 대입 := 연산자
    name  varchar(20) := 'kim';
    sal   number      := 0;
begin
    -- T-SQL문
    while i<=1000000 loop
        if i mod 2 = 0 then
            name := 'kim'  || to_char(i);
            sal  := 300;
        elsif i mod 3 = 0 then
            name := 'park' || to_char(i);
            sal  := 400;
        elsif i mod 5 = 0 then
            name := 'hong' || to_char(i);
            sal  := 500;
        else
            name := 'shin' || to_char(i);
            sal  := 250;
        end if;

        insert into emp4(no, name, sal) values (i, name, sal); --행추가
        i := i+1;
    end loop;
end;

    ① 인덱스를 사용하지 않은 경우

        - 아래 select문 실행 후, 커서를 쿼리문 위에 두고 F10키를 눌러서 계획설명 확인

select * from emp4 where name = 'kim466';       -- OPTIONS FULL / COST 900
select * from emp4 where no = 466;              -- OPTIONS FULL / COST 899
select * from emp4 where sal>300;    		-- OPTIONS FULL / COST 901

    ② 인덱스 생성 후

        - 인덱스 생성

-- name칼럼을 기준으로 인덱스 생성
create index emp4_name_idx on emp4(name);

-- name칼럼과 sal칼럼을 기준으로 인덱스 생성
create index emp4_name_sal_idx on emp4(name, sal);

        - 아래 select문 실행 후, 커서를 쿼리문 위에 두고 F10키를 눌러서 계획설명 확인

select * from emp4 where name = 'kim466';              -- OPTIONS RANGE SCAN / COST 3
select * from emp4 where name = 'kim466' and sal>200;  -- OPTIONS RANGE SCAN / COST 3

인덱스 사용후 확연하게 줄어든 Cost