REPORT_TABLE에 아래와 같이 데이터가 들어있습니다. ( 기타 다른 칼럼도 더 포함되어있습니다)
"SnrioID", "Nth"
시나리오A.,1
시나리오A,2
시나리오A,3
시나리오B,1
시나리오B,2
SELECT * FROM REPORT_TABLE WHERE ( "SnrioID", "Nth" ) IN ( SELECT "SnrioID", MAX("Nth") FROM REPORT_TABLE GROUP BY "SnrioID" )
시나리오ID별 가장 큰 Nth를 가진 데이터만 가져오려고하는데 칼럼에 INDEX를 만들어 줬음에도 불구하고
PLAN을 보면 항상 REPORT_TABLE에 대한 Table FullScan이 나오네요..
"SnrioID", "Nth" 이 복합키로 PK 이고, "SnrioID", "Nth" 칼럼 각각에 대해서도 INDEX를 걸어줬는데도 index를 사용하지 않게되는 이유가 궁금합니다.
인덱스가 있다고 무조건 인덱스르르 타는것은 아닙니다.
인덱스를 타는 것이 무조건 좋은 것도 아닙니다.
우선 서브쿼리는 어차피 [인덱스풀스캔] 일수밖에 없겠구요.
서브쿼리 결과가 메인에 전달될 때 그 건수가 문제입니다.
그 건수가 전체 중 극히 일부분 이라면? 인덱스 스캔이 유리하지만
극히 일부가 아닌 상당량을 차지하게 된다면 풀스캔이 유리합니다.
시나리오 하나당 가진 순번의 수가 평균 얼마정도 되나요?
조인시 인덱스가 사용된다는 의미는 NL 조인을 한다는 것인데
NL 조인은 소량의 조인에 유리합니다.
대량의 조인의 경우엔 해시조인 등이 유리하지요.
위와 같이 최근 1건 가져오는 쿼리는 ROW_NUMBER 을 사용하는 것이 가장 좋습니다.
SELECT * FROM (SELECT a.* , ROW_NUMBER() OVER(PARTITION BY "SnrioID" ORDER BY "Nth" DESC) rn FROM report_table a ) WHERE rn = 1 ;