튜닝 관점
EXPLAIN은 연산자 이름을 외우는 표가 아니라 어디서 많이 읽고, 어디서 다시 찾고, 왜 예상이 빗나갔는지 바로 고르는 지도다. 먼저 병목 신호를 찾고, 그 신호에 맞는 첫 조치를 붙여 읽는다.
읽는 범위
풀 스캔인데 읽는 양이 과하다
TABLE ACCESS FULL + Rows ↑
병목
필터가 늦게 적용돼 조건보다 훨씬 많은 블록을 읽는다.
먼저
WHERE 컬럼 인덱스와 access 조건으로 읽는 범위를 먼저 줄인다.
재방문
인덱스 뒤에 테이블 재조회가 붙는다
INDEX RANGE SCAN → TABLE ACCESS BY ROWID
병목
후보는 빨리 찾지만 행 수만큼 테이블을 다시 찾아가며 랜덤 I/O가 쌓인다.
먼저
조회 컬럼까지 포함한 커버링 인덱스로 재방문을 줄일 수 있는지 본다.
조인 반복
NL 조인의 내부 테이블이 풀 스캔된다
NESTED LOOPS + inner TABLE ACCESS FULL
병목
외부 결과가 늘수록 내부 전체 탐색이 반복돼 비용이 급격히 커진다.
먼저
내부 조인 키 인덱스와 조인 순서를 함께 점검한다.
예상 오차
예상 행수와 실제 행수가 다르다
E-Rows ≠ A-Rows
병목
통계가 빗나가면 옵티마이저가 처음부터 비싼 경로를 고를 수 있다.
먼저
GATHER_PLAN_STATISTICS로 실제 행수를 확인하고 통계나 히스토그램을 검토한다.