안녕하세요, 선배님들. 쿼리 작성 도중 궁금한 점이 생겨, 조심스레 질문을 올려봅니다.. 아래의 쿼리를 실행하면 두 번째 테이블(tsm)과 , 세 번째 테이블(tcm)은 type이 ref인데 tam은 type이 ALL로 풀스캔을 의미하고 있습니다.. 첫 번째 테이블(tsm) 테이블은 ASSIGN_SQ, CHARGE_SQ를 둘 다 FK로 참조하고 있고요.. 어떠한 이유에서 tam만 풀스캔을 의미하는지 궁금합니다. 선배님들의 답변 미리 감사드립니다. (꾸벅) (explain 결과는 첨부파일에 포함되어 있습니다!) explain SELECT tam.ASSIGN_NM , tcm.CHARGE_NM , COUNT(*) AS visitCnt , COUNT(CASE tsm.CONTRACT_YN WHEN 'Y' THEN 1 END) AS contractCnt FROM TB_SALES_MG tsm INNER JOIN TB_ASSIGN_MG tam ON tam.ASSIGN_SQ = tsm.ASSIGN_SQ INNER JOIN TB_CHARGE_MG tcm ON tcm.CHARGE_SQ = tsm.CHARGE_SQ GROUP BY tsm.CHARGE_SQ ORDER BY tsm.SALES_DT DESC , tsm.SALES_SQ DESC
쿼리를 보면 조인 조건만 있고 검색 조건은 없습니다.
인덱스는 조건 검색과 조인 검색 두가지 형태로 사용됩니다.
이 경우에는 조인 할 때만 인덱스가 사용되는 거죠.
조건 검색이 없으니 풀스캔 입니다.
테이블 읽는 순서가 가장 빠른 테이블을 풀스캔 하겠네요.
다른 테이블을 먼저 읽었다면 그 테이블이 풀스캔 되겠네요.
-- 실행계획 해석 --
1. tam 이 먼저 테이블 풀스캔 하고
2. tam.ASSIGN_SQ 를 조건으로 tsm 의 RefTB_ASSIGN_MG5 인덱스 스캔을 하네요.
3. tsm.CHARGE_SQ 를 조건으로 tcm 의 PRIMARY 인덱스 스캔을 하네요.