Index Range Scan

RangeScan
Index Range Scan
Execution Plan
------------------
0   SELECT STATEMENT Optimizer=ALL_ROWS
1   0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE)
2   1   INDEX (RANGE SCAN) OF 'EMP_DEPTNO_IDX' (INDEX)

Index Full Scan

FullScan
Index Full Scan
CREATE INDEX EMP_ENAME_SAL_IDX ON EMP (ENAME, SAL);

SELECT *
FROM EMP
WHERE SAL > 2000
ORDER BY ENAME;

Execution Plan
------------------
0   SELECT STATEMENT Optimizer=ALL_ROWS
1   0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE)
2   1   INDEX (FULL SCAN) OF 'EMP_ENAME_SAL_IDX' (INDEX)

Index Full Scan의 효용성

FullScan

인덱스를 이용한 소트 연산 생략

SELECT /*+ FIRST_RWOS */
FROM EMP
WHERE SAL > 1000
ORDER BY ENAME

Index Unique Scan

UniqueScan
Index Unique Scan

Index Skip Scan

Img
-- 성별과 연봉 컬럼에 대한 조건식을 모두 사용했을 때
SELECT * FROM 사원 WHERE 성별 = '남' AND 연봉 BETWEEN 2000 AND 4000
-- Index Skip Scan 유도/방지하려고 할 때
-- index_ss, no_index_ss 힌트
SELECT /*+ INDEX_SS(사원 사원_IDX) */
FROM 사원
WHERE 연봉 BETWEEN 2000 AND 4000;

Execution Plan
------------------------------------------------------
0   SELECT STATEMENT Optimzer=ALL_ROWS
1   0   TABLE ACCESS (BY INDEX ROWID) OF '사원' (TABLE)
2   1       INDEX (SKIP SCAN) OF '사원_IDX' (INDEX)
SkipScan
Index Skip Scan

Index Skip Scan이 작동하기 위한 조건

Index Fast Full Scan

LogicalIndex
인덱스의 논리적 연결 구조
PhysicalIndex
인덱스의 물리적 연결 구조
Index Full Scan Index Fast Full Scan
인덱스 구조를 따라 스캔 세그먼트 전체를 스캔
결과집합 순서 보장 결과집합 순서 보장 안 됨
Single Block I/O Multiblock I/O
파티션 돼 있지 않다면, 병렬스캔 불가 병렬 스캔 가능
인덱스에 포함되지 않은 컬럼 조회 시에도 사용 가능 인덱스에 포함된 컬럼으로만 조회할 때 사용 가능

Index Range Scan Descending

Descending
Index Range Scan Descending
-- EMPNO 기준으로 내림차순 정렬하려 할 때, EMPNO 컬럼에 인덱스가 있다면 옵티마이저가 알아서 인덱스를 거꾸로 읽는 실행계획 수립
-- index_desc 힌트
SELECT *
FROM EMP
WHERE EMPNO > 0
ORDER BY EMPNO DESC

Execution Plan
----------------------------------------------------------------------
0   SELECT STATEMENT Optimzer=ALL_ROWS
1   0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE)
2   1       INDEX (RANGE SCAN DESCENDING) OF 'PK_EMP' (INDEX (UNIQUE))
-- MAX 값을 구하고자 할 때도, 해당 컬럼에 인덱스가 있으면 인덱스를 뒤에서부터 한 건만 읽고 멈추는 실행계획이 자동으로 수립
CREATE INDEX EMP_X02 ON EMP(DEPTNO, SAL);

SELECT DEPTNO, DNAME, LOC
    ,(SELECT MAX(SAL) FROM EMP WHERE DEPTNO = D.DEPTNO)
FROM DEPT D

Execution Plan
-----------------------------------------------------------------
0   SELECT STATEMENT Optimizer=ALL_ROWS
1   0   SORT (AGGREGATE)
2   1       FIRST ROW
3   2           INDEX (RANGE SCAN (MIN/MAX)) OF 'EMP_X02' (INDEX)
4   0       TABLE ACCESS (FULL) OF 'DEPT' (TABLE)