SELECT /*+ GATHER_PLAN_STATISTICS INDEX(EMP EMP_SAL) */ SAL, ENAME
FROM EMP
WHERE SAL > 1600;
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
1) 인덱스 테이블에서 조건을 찾음
2) 조건에 만족하는 다음 행이 있는지 확인 -> INDEX RANGE SCAN
3) 조건에 만족하지 않을 때 까지 읽음
INDEX UNIQUE SCAN
만족하는 행을 하나 찾고, 그 다음 행을 읽지 않고 바로 테이블 액세스
UNIQUE 제약이 설정된 컬럼이라 데이터가 유일하여 조건 부합 행 또한 단 하나 뿐일 것이라는 것이 보장된 경우
INDEX RANGE SCAN
만족하는 행을 찾고, 조건에 만족하지 않을 때까지 다음 행을 읽은 후 테이블 액세스
컬럼
UNIQUE 제약이 설정된 컬럼이 아니라 데이터 중복이 가능한 경우
CREATE INDEX EMP_ENAME ON EMP(ENAME);
CREATE UNIQUE INDEX EMP_ENAME ON EMP(ENAME);
값이 중복된 경우 UNIQUE INDEX 생성 불가
PK 컬럼, UNIQUE 컬럼이 아니라도 값이 중복되지 않으면 UNIQUE INDEX 생성 가능
CREATE UNIQUE INDEX EMP_ENAME ON EMP(ENAME);
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM EMP
WHERE ENAME = 'BLAKE';
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SELECT /*+ INDEX(EMP EMP_SAL) */ ENAME, SAL
FROM EMP
WHERE SAL = 1600;
SELECT /*+ INDEX(EMP EMP_ENAME) */ ENAME, SAL
FROM EMP
WHERE ENAME = 'SCOTT';
SELECT /*+ INDEX(EMP EMP_JOB) */ ENAME, SAL
FROM EMP
WHERE JOB = 'MANAGER';
[이지업클래스] 실무에서 바로 쓰는 SQL 튜닝법 수강 후 정리한 내용입니다.