개발Story
Published 2019. 2. 18. 16:19
데이터베이스 인덱스(index) DB/oracle

데이터베이스 인덱스(index)  사용하는이유,사용법,사용예 를정리해보겠습니다. (oracle 기준)


index란 : RDBMS에서 검색속도를 높이기 사용하는 하나의 기술입니다.


장점 :- 키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상시킵니다.

단점 :- 인덱스를 만들면 .mdb 파일 크기가 늘어난다.


테이블을 생성하면 키값이 자동으로 인덱스로 설정됩니다.

SELECT쿼리로 INDEX가 사용하는 쿼리를 사용시 해당 TABLE을 검색하는것이 아니라 빠른 TREE로 정리해둔 MYI파일의 내용을 검색합니다.


즉 : fullsacn을 피하기 위해서 index를 사용합니다.


* 인덱스 사용방법

ex)   

- select /*+ index(professor SYS_C*******) */ * from professor;  -- 인덱스를 타서 정렬을 해야 시스템 과부하가 걸리지 않음.

- select /*+ index_ffs(student SYS_C*******) */count(studno) from student group by grade; -- index_ffs 는 카운트 전용 


ex)가장 많이만드는 게시판 쿼리문을 작성해보겠습니다.


select *

from (select rownum rnum, b.* 

from (select /*+ index_desc(board board_pk_bno) */ bno, writer, title, write_date writeDate, read_cnt readCnt, recommend_cnt recommendCnt from board) b 

where rownum<=10) where rnum>=1 


-->서브쿼리를 이용한 게시판출력 입니다. 테이블 구조와는 상관 없이 일단 굵은 글씨를 봐주세요.


bno는 게시판의 글번호 입니다. 시퀀스로 생성되는 기본키를 뜻합니다.

게시판의 번호를 /*+ index_desc(board board_pk_bno) */ bno 정렬해서 가져옵니다. 여기서 의문을 가져봅시다.

왜 order by를 이용하지 않고 인덱스를 이용해서 정렬을 할까요?


정답은 select문의 실행 순서에 있습니다. order by는 select문에서 가장 마지막에 실행되는 문법으로 전체 데이터를 가지고 정렬을 합니다. 그러니 fullscan을 하겠지요. fullscan을 피하기 위해 /*+ index_desc(board board_pk_bno) */ bno를 이용하면 cost를 감소시킬수 있습니다.


oracle의 계획설명을 통해 cost비교를 보여드리겠습니다.



cost가 2 이고 range scan 을 하신것을 볼 수 있습니다.


그럼 간단하게 같은 결과인 그렇지만 index를 사용하지 않은



select * from board where bno BETWEEN 1 and 10 order by bno desc;


order by로 정렬한 구문을 계획설명을 통해 보겠습니다


보이시나요 
cost가 3 이고 fullscan을 했습니다.


데이터 양이 적어서 cost가 1밖에 차이가 안나지만 데이터양이 무수히 많아지면 cost가 차이가 많이 나겠죠?????????

간단히 데이터베이스 index에 대해 알아봤습니다.




'DB > oracle' 카테고리의 다른 글

Oracle 함수만들기.  (0) 2020.02.09
profile

개발Story

@슬래기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!