김갱환
맨땅에 코딩
김갱환
전체 방문자
오늘
어제
  • 분류 전체보기 (239)
    • ⁂ 맨땅에 코딩 (11)
      • : Story (3)
      • : MiniProject 'MyWeb' (1)
      • : Final Project (5)
      • : Josa-Moa 한국어 조사 처리 프로젝트 (1)
    • —————Frontend——————————————.. (0)
    • ⁂ HTML (10)
      • : 기본 익히기 (10)
    • ⁂ CSS (15)
      • : 기본 익히기 (15)
    • ⁂ Java Script (32)
      • : 기본 익히기 (28)
      • : 자바스크립트 라이브러리 (1)
      • : 연습 문제 (3)
    • ⁂ jQuery (11)
      • : 기본 익히기 (11)
    • ⁂ Bootstrap (3)
      • : 기본 익히기 (3)
    • ⁂ TailWind CSS (1)
    • ⁂ AJAX (5)
      • : 기본 익히기 (5)
    • ⁂ Vue.js (3)
      • : 기본 익히기 (3)
    • —————DB : Data Base————————.. (0)
    • ⁂ Oracle DB (27)
      • : 기본 익히기 (24)
      • : 연습 문제 (3)
    • ⁂ MyBatis Framework (15)
      • : 기본 익히기 (15)
    • —————Backend———————————————.. (0)
    • ⁂ Java (62)
      • : 기본 익히기 (42)
      • : JDBC - Java DataBase Conn.. (4)
      • : Crawling (2)
      • : 독학으로 공부하기(과거) (11)
      • : 연습문제 (3)
    • ——————Web————————————————— (0)
    • ⁂ JSP (28)
      • : 기본 익히기 (28)
    • ⁂ Spring FrameWork (15)
      • : Legacy Project (1)
      • : 기본 익히기(Boot 기반) (14)
    • ——————————————————————— (0)
    • ⁂ Error Note (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백앤드
  • 코딩 #코딩공부 #프론트앤드 #백앤드 #풀스택개발자
  • 객체지향프로그래밍
  • 코딩공부 #코딩 #자바 #자바독학 #자바공부 #개발자 #프론트앤드 #백앤드 #풀스택
  • HTML공부
  • httperror
  • 자바
  • web.xml수정
  • 코딩
  • 개발자
  • 코딩 #코딩공부 #상수 #리터럴 #형변환 #개발자 #자바 #자바공부 #자바독학
  • 코딩공부
  • 프론트앤드
  • http에러메세지
  • 연산자 #기본연산자 #코딩 #자바 #독학 #자바공부 #자바연산자
  • 코딩공부 #자바공부
  • ErrorPage
  • 자바공부
  • 풀스택
  • 비트연산자 #코딩공부 #자바공부 #코딩 #자바 #프로그래밍 #개발자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김갱환

맨땅에 코딩

⁂ Oracle DB/: 기본 익히기

[Oracle] #6-5 인덱스(index)

2022. 8. 30. 17:25

1. index

 

1) 개념

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

 

2) 방식

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

 - index range scan
 이름이 여러개인 경우 목차를 찾아서 페이지를 찾아감
 훨씬 빠름. 별도의 메모리가 있어야 함.

 - index unique scan
 학번은 1개만 존재함. 유일한 값

 

3) 인덱스 생성

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

 

4) 인덱스 삭제

형식) drop index 인덱스명

 

 

2. index 연습하기

 

1) emp2 테이블 만들기

--테이블생성
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');

commit;

 

 

 2) index를 만들고 전 후 비교하기

-- 인덱스 생성 전
select * from emp2 where name='hong';  -- 커서 여기에 놓고 F10

-- 인덱스 생성 후
create  index emp2_name_idx on emp2(name);
drop    index emp2_name_idx on emp2(name); -- 인덱스 삭제


select * from emp2 where name='kim';    -- 커서 여기에 놓고 F10
-- F10 계획설명 보기 -> unique scan, cost 2

 

생성 전은 COST가 2이다
생성 후에는 COST가 1이다

 

 

* 여기서 COST란 무엇일까!? *

 Oracle Optimizer라는 것이 있다.

 사용자가 실행하는 SQL에 대하여 가장 적절한 데이터 추출 경로가 무엇인가를 결정하는 Oracle 내부 아키텍처이다.

 Oracle Optimizer는 크게 규칙기반(Rule-base)과 비용기반(Cost-based)으로 나누어 지는데 규칙기반(Rule-based)은 Oracle 데이터베이스 시스템이 미리 정해놓은 일정한 순위대로 실행이 된다.

 비용기반(Cost-based)은 분석된 데이터베이스 현재 상태를 기반으로 비용이 가장 적게 드는 실행 경로(Execution plan)를 채택하여 실행한다.

 

 일반적으로 비용기반(Cost-based) 접근이 규칙기반(Rule-based) 접근보다 나은 실행 계획을 제공하는데 비용기반접근을 통해 Oracle Optimizer가 실행 계획을 얻기 위해서는 통계 정보가 필요하다.

 

 인덱스를 부여하자 COST가 2에서 1로 줄어드는 것을 볼 수 있다.

 오라클에서 보다 더 나은 데이터 접근이 가능하다는 뜻이다.

 

 

 3) PK가 있는 테이블

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

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

select * from emp3 where no=3;
-- F10 계획설명 보기 -> unique scan, cost 1

 

 

3. 100만건의 레코드 대상으로 COST 비교하기

 

1) 테이블 만들기

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

 

 

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

declare -- 선언문
    -- 변수 선언
    i       number          := 1;       -- i변수에 1 대입, := 연산자
    name    varchar2(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 4 = 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;

데이터 100만개 똬다다다다닥

 

 

3) 인덱스 사용 전후 비교하기

 

 - 인덱스 사용 전

select * from emp4 where name='kim466'; -- 실행하고 난 후, 여기에 커서 놓고 F10 계획 설명
                                        -- FULL scan, COST 893

select * from emp4 where no=466;        -- FULL scan, COST 892

select * from emp4 where sal>300;       -- FULL scan, COST 893

 

 

 - 인덱스 사용 후

create  index emp4_name_idx on emp4(name);

select * from emp4 where name='kim466';

 

 

 이와 같이 COST가 확 내려가는 것을 볼 수 있다.

 인덱스가 개별로 붙었기 때문이다.

 

 

* 두 개의 칼럼을 기준으로 인덱스 생성하기

create index emp4_name_sal_idx on emp4(name, sal);

select * from emp4 where name='kim466' and sal>200; -- RANGE scan, COST 3

 

저작자표시 비영리 동일조건 (새창열림)

'⁂ Oracle DB > : 기본 익히기' 카테고리의 다른 글

[Oracle] #6-4 프로시져(PL/SQL (Procedural Language))  (0) 2022.08.30
[Oracle] #6-3 뷰(View)  (0) 2022.08.30
[Oracle] #6-2 계정 생성하기(dbf 파일 만들기, grant)  (0) 2022.08.30
[Oracle] #6-1 SQL Developer로 CSV파일 가져오기  (0) 2022.08.29
[Oracle] #5-3 rownum으로 페이징하기  (0) 2022.08.29
    '⁂ Oracle DB/: 기본 익히기' 카테고리의 다른 글
    • [Oracle] #6-4 프로시져(PL/SQL (Procedural Language))
    • [Oracle] #6-3 뷰(View)
    • [Oracle] #6-2 계정 생성하기(dbf 파일 만들기, grant)
    • [Oracle] #6-1 SQL Developer로 CSV파일 가져오기
    김갱환
    김갱환
    코딩의 코자도 모르는 이의 공부 기록장

    티스토리툴바