데이터베이스 연구실.log

조건 분해와 ROWID 활용

OR 조건에서 인덱스로 ROWID를 모아 테이블에 접근하는 흐름이며 힌트 순서의 의도와 성능 결과는 확인 불가

OR 조건ROWID인라인 뷰index_ffsrowid 힌트중간 문자열 검색

#핵심 요약

ename LIKE '%EN%' OR ename LIKE '%IN%'처럼 앞이 고정되지 않은 조건은 인덱스로 범위를 잡을 수 없음(인덱스 사용을 방해하는 조건)

실습 기법: 조건 컬럼 인덱스를 Index Fast Full Scan으로 읽어 조건에 맞는 ROWID만 모으고(인라인 뷰), 그 ROWID로 테이블 행을 찾아감

이 기법의 실제 실행 결과는 기재 없음

#개념과 동작 원리

VIEW와 ROWID를 사용하는 OR 조건 SQL 튜닝의 전후 SQL 비교임

SQL 구성의 의도:

  1. 인라인 뷰는 ename 인덱스만 Fast Full Scan으로 읽음
    인덱스는 테이블보다 작고 Multiblock I/O를 쓸 수 있음(인덱스 스캔 방식)
  2. 인덱스에 ename과 ROWID가 있으므로 LIKE 조건을 인덱스 안에서 거를 수 있음
  3. 조건에 맞은 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를 확인함
조인 순서의 의도와 성공 출력은 확인 불가
SQL*Plus (실습 계정)조회만 함
-- 튜닝 전
SELECT ename, sal, job
  FROM emp
 WHERE ename LIKE '%EN%'
    OR ename LIKE '%IN%';
SQL*Plus (실습 계정)조회만 함
-- 튜닝 후
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의 실행 통계로 비교해야 함
실습의 전후 성능은 확인 불가

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기