database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 26655 게시물 읽기
No. 26655
실행계획을 해석할 때요...
작성자
까먹지마(까먹지마)
작성일
2006-05-05 11:10ⓒ
2006-05-05 16:33ⓜ
조회수
1,794

 

오라클 실행 계획을 해석 할 때요...

우선, 설정된 index를 사용한다는 전제하 에서... 간단하게 다음과 같이 나왔다고 하면요...

INDEX 구성 XN_MASTER_4(ORG_ID_NO, CE_SEQ_NO) - NON-UNIQUE -

 

TABLE ACCESS(BY INDEX ROWID) OF 'MASTER'

INDEX (RANGE SCAN) OF 'XN_MASTER_4' (NON-UNIQUE)

 

궁금한 점을 차례로 나열 할께요...

 

1. INDEX 구성에서 NON-UNIQUE와 UNIQUE 차이를 모르겠습니다.

기본적으로 테이블에 기본키를 구성하는 것은 유일한 레코드를 식별해서 데이터의 무결성을 보장하기 위해서인데요...

INDEX에서 쓰이는 UNIQUE도 기본키 처럼, INDEX가 걸린 칼럼으로 유일한 레코드를 식별할 수 있다는 의미인가요 ?

 

2. 보통 실행계획 예제를 보니까... INDEX (RANGE SCAN) OF 'XN_MASTER_4' (NON_UNIQUE) 처럼...

NON_UNIQUE 일 경우, 대개 RANGE SCAN(범위 검색)을 하는 것 같은데요...

그 이유는 해당 인텍스의 칼럼 만으로 유일한 레코드를 식별하지 못하기 떄문인가요 ?

좀 더 깊이 생각하면, NON_UNIQUE 인텍스가 설정되어 있더라도, 반드시 RANGE SCAN 만 하는 건 아니겠죠 ?

왜냐하면, NON_UNIQUE 로 설정 되어 있더라도, 데이터가 유일하게 들어가 있을 경우도 있을 테니까요...

제가 이해하는게 맞는지 모르겠습니다.

 

3. INDEX를 검색한 후에, TABLE을 ACCESS 하는데요...

BY INDEX ROWID 라는 문구에... GLOBAL 이라는 문구가 나오는 경우가 있는데요...

GLOBAL 이 있을 때는 어떻게 해석 해야 하는지요 ;;

 

4. 실행계획 내용 중에서, 인덱스가 UNIQUE 일 경우, 반드시 UNIQUE SCAN 되어야 되지 않나요 ?

어떤 경우에는, 인덱스가 UNIQUE 인데, RANGE SCAN을 할 때가 있는 것 같은데...

예 : INDEX (RANGE SCAN) OF 'XN_MASTER_4' (UNIQUE)

명확한 기준을 잘 모르겠습니다.

 

너무 기본적인 내용을 질문 하는거 같긴 한데요... 머리속에서 정확히 정립이 되어야 할 것 같아서요...

고수님들 부탁 드려요 ^^



이 글에 대한 댓글이 총 4건 있습니다.

 

답변이 늦었지만 하겠습니다.

 

1. Non-Unique Index와 UNIQUE의 차이는 검색 조건 비교의 횟수에서 차이가 납니다.

 

만약... 보통의 테이블인 emp에서 WHERE name = 'Smith'

물론 name 컬럼에는 인덱스가 다음과 같이 각각 걸려 있다고 가정합시다.

 

Non-unique 인덱스의 경우 첫번째 'Smith'를 찾으면, 'Smith'란 데이터는 2개 이상일 수 있으므로,

해당 인덱스 엔트리 다음에 저장된 인덱스 엔트리(Next 데이터)를 또 검사합니다. 

그러므로, 인덱스 조건에 만족하는 데이터의 검사는 총 나온 데이터의 수+1 이 됩니다.

 

그러나 Unique 인덱스의 경우, 컬럼의 값은 유일하다고 가정하기 때문에..

첫 번째 'Smith'를 찾으면, 다음 인덱스 엔트리(Next 데이터)는 검사할 필요없습니다.

값이 유일하다고 햇으니깐 'Smith'란 이름을 가진 사람은 없을 것이기 때문입니다.

 

Unique 인덱스를 사용할 경우, 위 처럼 검사하는 횟수가 줄어듭니다.

그래서 Unique를 쓸 수 있다면, 강력하게 추천됩니다

 

2,4. Range와 Unique의 차이는 검사되는 인덱스 엔트리의 수에서 나옵니다.

Range는 2개 이상일 경우, Unique는 하나일 경우에 해당됩니다.

Unique 인덱스가 아니면, 이퀄(=)연산에 검색결과가 하나만 나와도 Range Scan을 합니다.

1번 항목에서 설명했는데, Unique가 아니라면 검사를 무조건 한번 더 한다고 했습니다.

그래서 결과는 하나가 나오더라도 두 개의 인덱스 엔트리를 검사합니다.

 

그리고 Unique 인덱스도 범위 검색을 해서 (예 name>'KIM') 여러 인덱스 엔트리가 스캔되면

Range Scan이 되겠죠..

 

김병두(kirio1)님이 2006-05-06 23:12에 작성한 댓글입니다.
이 댓글은 2006-05-07 00:55에 마지막으로 수정되었습니다.

답글 감사합니다. ^^

UNIQUE 인덱스(empno)를 사용하고...

쿼리상의 where 조건에서 "=" 조건을 주더라도...

바인드 변수를 사용하면 Range Scan을 하는 것 같습니다.

(예: select *

       from emp

       where empno = :a ;)

곰곰히 생각해 보니, 말 그대로 바인드 변수이기 때문에 확실한 값이 정해진 것이 아니라서 Range Scan을 하는 것 같습니다.

얼핏 생각하기에는 Unique Scan을 할 것 처럼 생각은 들지만요 ;;

 

제가 이해한 것이 맞겠죠 ?

까먹지마(까먹지마)님이 2006-05-06 23:34에 작성한 댓글입니다.

 

아닙니다.

 

바인드 변수를 써도 Uniuqe Scan을 합니다. 바인드 값을 넣던 상수 값을 넣던

실행 계획은 바뀌지 않습니다.

바인드 변수라도 나중에 실행시 어떠한 값이 설정된다는 의미니깐요.

(물론, 상수 값에 따라 바뀌는 예외도 있긴 합니다.)

 

혹시 바인드 변수가 들어갔음에도 Range Scan을 했다면 실행 계획 조좀 보여주세요.

 

 

아 그리고,,..설명 실수 한게 있는데....

3번 GLOBAL에 대한 문구에 대한 답변 수정을...

BY INDEX ROWID 에 GLOBAL이 들어간다는거 BY GLOBAL INDEX ROWID

말하시는거 맞죠?

GLOBAL INDEX 의 ROWID를 참고한다는 말입니다. 이 말은,

테이블은 파티션이 되어 여러개의 객체가 있는데, 그에 반해 그 테이블의 인덱스는

하나의 전체적인(GLOBAL) 인덱스로만 구성된거죠.

파티션 테이블과 인덱스 부분을 참고해주세요.

김병두(kirio1)님이 2006-05-07 00:33에 작성한 댓글입니다.
이 댓글은 2006-05-07 00:54에 마지막으로 수정되었습니다.

아마도 INDEX랑 PK라는 개념을 혼동하시는것 같네요.

 

PK도 인덱스중에 하나로 사용되지만 유일성이라는 의미가 우선이고

인덱스는 정해진 컬럼으로 정렬되어서 빠르게 검색이 가능합니다.

 

Range Scan이란 빠르게 검색하돼 한건이상이라고 판단하는 경우로

PK인덱스를 탄다고 하더라도 범위로 검색하면 range scan를 탑니다.

박인우(inwoo4u)님이 2006-06-13 11:14에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
266591 [2]
눈을떳다
2006-05-06
1197
26657Oracle 9.2.x (RAC) raw device 환경에서 raw device 위치 변경 [1]
이혜진
2006-05-05
2141
26656오라클 동시 접속자수는 어떻게 봐요 ? [3]
까먹지마
2006-05-05
7355
26655실행계획을 해석할 때요... [4]
까먹지마
2006-05-05
1794
26654OCI 에서 dvoid 타입 [1]
김병두
2006-05-04
1488
26653궁금하삼... [1]
송미영
2006-05-04
1121
26652dynamicSQL 레코드블럭 커서에 어떻게 넣죠?? [2]
진구
2006-05-04
5023
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다