1.발생규칙
OR조건이나 IN 상수조건이 있는경우에 걸리는 두개의 조건을 개별적으로 검색하고, 나머지 조건도 전부 적용해서 검색 한 후, 나중에 이 결과를 합치게 된다.이 내용이 플랜에는 CONCATENATION으로 표현 된다.
2.Access 방식
SELECT /*+USE_CONCAT*/ columns
FROM tables
WHERE (조건1 OR 조건2)
AND 조건3;
위처럼 조건절이 되는경우 아래처럼 실행계획이 풀린다.
SELECT columnsFROM tables
WHERE 조건1
AND 조건3
UNION ALL
SELECT columns
FROM tables
WHERE 조건2
AND 조건3;
3.적용범위
-인덱스 조건이 똑똑하여 빠른 OUTPUT 이 보장될경우(OLTP)
-ORDER BY절이 있을 경우 결과에 대한 정렬 처리가 추가로 필요하게 되므로, 결과값이 많을 경우에는 불리하게 작용할 수 있다.
-대용량 배치쿼리에서는 피한다.
4.Hint
/*+USE_CONCAT*/
5.PLAN
SELECT /*+USE_CONCAT*/ columns
FROM tables
WHERE (조건1 OR 조건2)
AND 조건3;
CONCATENATION
TABLE ACCESS (BY ROWID) OF ‘TEST_TAB1’
INDEX (RANGE SCAN) OF ‘IDX1’
TABLE ACCESS (BY ROWID) OF ‘TEST_TAB1’
INDEX (RANGE SCAN) OF ‘IDX1’
1.발생규칙 :
-결합인덱스시 처음이나 중간의 조건이 빠졌을경우
-결합 인덱스에서 첫 번째 컬럼이 사용되지 않으면 무조건 인덱스 스캔이 불가능 하였다. 하지만 9i부터 인덱스 스킵 스캔으로 가능해짐.
2.Access 방식
-Index Skip Scan의 원리
① 어떤 테이블의 인덱스가 sal_typ(매출유형), item_cd(상품코드), sal_dt(매출일자)로 구성되어 있다고 가정했을 경우
② 쿼리의 조건에서 item_cd와 sal_dt 만 사용 되었다.
③ sal_typ의 값이 D(내수),E(수출),L(로컬) 이렇게 세 종류만 있다고 가정을 하였을 경우. Index Skip Scan을 적용하면..
④ sal_typ IN (‘D’,’E’,’L’) 의 조건을 추가한 것과 동일한 효과를 얻을 수 있다.
- 결국 생락 된 첫 번째 컬럼의 값이 조건 절에 자동으로 추가되는 것과 유사한 효과가 난다.
- WHERE sal_typ = ‘D’ and item_cd = … UNION ALL
WHERE sal_typ = ‘E’ and item_cd = … UNION ALL
WHERE sal_typ = ‘L’ and item_cd = … → 여기서 ‘D’,’E’,’L’을 논리적 서브 인덱스라고 한다.
3.적용범위
- Index Skip Scan은 서브 인덱스의 종류가 많지 않고, 뒤에 오는 컬럼의 종류가 많을 때 가장 좋은 결과를 얻을 수 있다.
4.Hint
SELECT /*+ INDEX_SS(miod_div miod_div_idx) */ i_bugt_cd
FROM miod_div
WHERE d_io = '20010403'
AND o_io = 6
AND i_io = '20'
AND i_io_div = '6200'
5.Plan
SELECT STATEMENT CHOOSE-Cost : 4519
TABLE ACCESS BY INDEX ROWID MATS.MIOD_DIV(1)
INDEX SKIP SCAN MATS.MIOD_DIV_IDX(NU) (I_MATR,D_IO,O_IO,I_IO,I_IO_DIV)
>Access 방식
•인덱스 Leaf Block을 한번에 DB_FILE_MULTIBLOCK_READ_COUNT에서 정한 크기씩 끝까지 읽어 내려가며 결과 값의 Sort가 보장되지 않는다
•Parallel로 수행 가능하다
•Full Table Scan보다 읽어야 할 Block의 수가 적어 유리하다.
1.발생규칙
-아무런 조건 없이 Table을 읽게 한 경우
-인덱스가 걸려있지 않은 컬럼에 대해서 조건을주고 Table을 읽게 한 경우
-인덱스가 걸려있는 컬럼에 조건을 부여했을지라도 Optimizer가 Full Table Scan이 유리하다고 판단한 경우
2.Access 방식
-테이블의 첫 Row가 들어있는 Block부터 HWM(High Water Mark)까지 읽는다
-한번에 DB_FILE_MULTIBLOCK_READ_COUNT에서 정한 크기 만큼 읽는다 .
-DB_FILE_MULTIBLOCK_READ_COUNT가 16이면 한번 i/o 할때 16 block 씩 scan 한다. (MultiBlock I/O)
-Parallel로 수행 가능하다
3. 적용범위
-10만건(평균적으로) 이상을 Read 할때 --> 인덱스를 경유하면 더느림
-주로 OLAP/DSS 시스템에서 사용
-OLTP 시스템의 야간 Batch 작업
4.Hint
- /*+ full(테이블명 또는 테이블별칭) */
-plan 상에서의 full scan
select * from emp;
-------------------------------------------------
SELECT STATEMENT GOAL: CHOOSE
TABLE ACCESS (FULL) OF 'EMP'