2008년 1월 31일 목요일

Data Access Pattern - Rowid

1.발생규칙
•Rowid가 조건으로 공급된 경우
•인덱스를 사용하여 Table 을 access 한경우

2.Access 방식
•Rowid를 이용해서 특정 Block의 특정 Row를 찾아간다
•가장 빠른 Access 방식이다.

3.적용범위
•max /min 일자를 찾아서 그일자에 해당하는 값을 select 할때(self join 시 사용)

4.Hint

select *
from emp
where rowid = :v_rid


-------------------------------------------------------
SELECT STATEMENT GOAL: CHOOSE
TABLE ACCESS (BY [INDEX] ROWID) OF 'EMP'

Data Access Pattern - Index Full Scan

1.발생규칙
•Optimizer가 Full Table Scan하고 Sort하는 것 보다는 Index Full Scan해 Sort작업을 따로
수행하지 않는 것이 유리하다고 판단한 경우

2.Access 방식
•해당 인덱스의 모든 Block을 한번에 한 Block씩 순차적으로 읽어 내려간다.(Single Block I/O)

3.적용범위
•건수가 많더라도 1건만 scan 하고 끝낼수 있을경우
•부분범위처리가 가능한경우

4.주의사항
•muti-block-I/O 가 아님(한BLOCK 씩만 읽을수 있음)
INDEX FAST FULL SCAN 과 다르므로 주의한다.(배치SQL 에서는 피한다.)

5.HINT
/*+ INDEX(테이블명 인덱스명) */

select /*+ index(a emp_idx05) */
empno, ename, job, hiredate
from emp a
where job = 'SALESMAN'

-------------------------------------------------------
SELECT STATEMENT GOAL: CHOOSE
TABLE ACCESS (BY [INDEX] ROWID) OF 'EMP'
INDEX (FULL SCAN) OF 'EMP_IDX05' (NON-UNIQUE)

2008년 1월 29일 화요일

Data Access Pattern - INDEX RANGE SCAN

1.발생규칙
•Non-Unique Index를 Access하는 경우
•Unique Index를 구성하고 있는 컬럼 중 일부 컬럼에만 값이 공급된 경우
•Unique Index에 Range 조건(like, between, >, <, >=, <=)으로 값이 공급되는 경우

2.Access 방식
•해당 조건을 만족하는 범위 + 아닌 값 하나(1PlusScan)를 읽게 된다.
•Range 조건이 들어온 경우 Index구성 순서상 이후에 있는 컬럼에 공급된 조건들은 작업범위를 줄이는데 작용하지 못한다. 예외상황:9i 이후부터 index skip scan

3.적용범위
•10만건 이하의 건수를 access 할때
•10만건 이상이라도 부분범위처리가 가능할때
•10만건 이상이라도 인덱스만 scan 하고 table access 가없을때
•주로 OLTP

4.HINT /*+ INDEX(테이블명 혹은 ALIAS 인덱스명) */
•실행계획
select * from emp where mgr > 7839;

-------------------------------------------------------
SELECT STATEMENT GOAL: CHOOSE
TABLE ACCESS (BY [INDEX] ROWID) OF 'T_EMP'
INDEX (RANGE SCAN) OF 'T_EMP_IDX01' (NON-UNIQUE)

Data Access Pattern - Index Unique Scan

1.발생규칙
•Unique Index를 구성하고 있는 모든 Key값에 대해서 Equal(=) 로 조건이 공급된 경우 발생한다
2.Access 방식
•해당 조건을 만족하는 값 하나만 읽는다

3.적용범위
•OLTP 의 화면에서 적용하느것이 최적임.
•한건만 읽어야 할경우.

4.Hint

- /*+ index(테이블명 또는 테이블별칭) */

-plan 상에서의 index unique scan

select *
from emp
where empno = 7790 ;

-------------------------------------------------------
SELECT STATEMENT GOAL: CHOOSE
TABLE ACCESS (BY [INDEX] ROWID) OF 'EMP'
INDEX (UNIQUE SCAN) OF 'PK_EMP' (UNIQUE)

2008년 1월 28일 월요일

Data Access Pattern - Index Fast Full Scan

>발생규칙
•Where절이나 Select절에 사용된 컬럼이 모두 하나의 인덱스에 구성된 컬럼인 경우
•결합Index의 경우 최소한 한 Column이 NOT Null로 지정되어 있어야 한다.


>Access 방식
•인덱스 Leaf Block을 한번에 DB_FILE_MULTIBLOCK_READ_COUNT에서 정한 크기씩 끝까지 읽어 내려가며 결과 값의 Sort가 보장되지 않는다
•Parallel로 수행 가능하다
•Full Table Scan보다 읽어야 할 Block의 수가 적어 유리하다.


>적용범위
•FTS(FULL TABLE SCAN)과 같음.

>Hint
-/*+ index_ffs(테이블명(혹은 별칭) 인덱스명) */

>Plan 상에서의 Index Fast Full Scan

SELECT /*+ index_ffs(a emp_job_idx) */
empno, ename, job
FROM emp a
WHERE job = 'SALESMAN'

-------------------------------------------------------
SELECT STATEMENT GOAL: CHOOSE
INDEX (FAST FULL SCAN) OF 'EMP_JOB_IDX'