조건 분해와 ROWID 활용
OR 조건에서 인덱스로 ROWID를 모아 테이블에 접근하는 흐름이며 힌트 순서의 의도와 성능 결과는 확인 불가
#핵심 요약
ename LIKE '%EN%' OR ename LIKE '%IN%'처럼 앞이 고정되지 않은 조건은 인덱스로 범위를 잡을 수 없음(인덱스 사용을 방해하는 조건)
실습 기법: 조건 컬럼 인덱스를 Index Fast Full Scan으로 읽어 조건에 맞는 ROWID만 모으고(인라인 뷰), 그 ROWID로 테이블 행을 찾아감
이 기법의 실제 실행 결과는 기재 없음
#개념과 동작 원리
VIEW와 ROWID를 사용하는 OR 조건 SQL 튜닝의 전후 SQL 비교임
SQL 구성의 의도:
- 인라인 뷰는
ename인덱스만 Fast Full Scan으로 읽음
인덱스는 테이블보다 작고 Multiblock I/O를 쓸 수 있음(인덱스 스캔 방식) - 인덱스에
ename과 ROWID가 있으므로 LIKE 조건을 인덱스 안에서 거를 수 있음 - 조건에 맞은 ROWID로만 테이블을 방문함
ROWID 접근은 행 한 건을 가져오는 가장 빠른 방법임(순차 접근과 랜덤 접근)
이 방식이 Full Table Scan보다 나은지는 테이블 크기, 인덱스 크기, 조건에 맞는 건수에 따라 다르며 수업 자료에 비교 결과가 없음
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| INDEX_FFS | 정렬 순서를 보장하지 않고 인덱스 전체를 읽는 경로를 지정하는 힌트임 |
| NO_MERGE | 인라인 뷰를 외부 쿼리 블록으로 합치는 변환을 막는 힌트임 |
| LEADING | 조인 순서에 대한 힌트임 |
| USE_NL | 지정 테이블을 내부 입력으로 쓰는 Nested Loops 조인을 유도함 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | OR 필터 뒤 ROWID 조인 경로와 실제 사용된 힌트 |
| 필요 권한 | EMP SELECT 권한 필요 실제 커서 계획 조회에는 DBMS_XPLAN 관련 동적 뷰 접근 권한 필요 |
| 바꿀 입력값 | EMP, EMP_ENAME의 실제 정의와 EN, IN 검색 패턴 |
| 결과 해석 | 전후 결과 동등성, Hint Report, 행 수와 Buffers를 확인함 조인 순서의 의도와 성공 출력은 확인 불가 |
-- 튜닝 전
SELECT ename, sal, job
FROM emp
WHERE ename LIKE '%EN%'
OR ename LIKE '%IN%';-- 튜닝 후
SELECT /*+ leadeing(e) use_nl(v) rowid(e) */
e.ename, e.sal, e.job
FROM emp e,
(SELECT /*+ no_merge index_ffs(emp emp_ename) */ ROWID AS rn
FROM emp
WHERE ename LIKE '%EN%'
OR ename LIKE '%IN%') v
WHERE e.rowid = v.rn;결과 해석:
실습 힌트의 leadeing(e)는 leading의 오타로 보임
잘못된 힌트는 오류 없이 무시되므로 의도한 조인 순서가 적용되지 않을 수 있음
실습 의도가 "뷰 v에서 ROWID를 먼저 모은 뒤 e를 찾아간다"라면 조인 순서는 leading(v) use_nl(e)가 되어야 하는데, 실습에서는 leading(e) use_nl(v)로 적었음
어느 쪽이 의도인지 수업 자료에서 확인할 수 없음
#구문과 옵션 설명
OR 조건은 두 조건을 모두 만족한 행도 한 번만 선택함
이를 두 조회의 UNION ALL로 바꾸면 중복 가능성이 달라지므로 별도 동등성 확인이 필요함
일반 B-tree에서 전체 키가 NULL인 행은 빠지지만 기존 LIKE 조건은 NULL인 ENAME을 선택하지 않음
인덱스의 실제 컬럼과 조건 평가 가능 여부를 먼저 확인함
#사용 조건과 주의사항
힌트는 잘못된 이름, 별칭, 충돌 때문에 무시될 수 있음
계획의 Hint Report에서 사용 여부와 무시 사유를 확인하고, 계획의 조인 입력 순서도 함께 확인함
입력한 힌트 이름만으로 뷰를 먼저 읽었다고 결론 내리지 않음
ROWID는 같은 SQL의 행 접근에 사용하되 장기 보관하는 업무 키로 쓰지 않음
성능 개선 여부는 같은 결과를 반환하는 SQL의 실행 통계로 비교해야 함
실습의 전후 성능은 확인 불가