INDEX가 있는데도 Table FullScan을 하네요 0 2 1,443

by 하형욱 [2016.06.22 17:52:38]


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이 나오네요..

혹시나 해서 IN을 SELF JOIN을써서 일치조건으로 해도 PLAN은 동일하게 Table FullScan이 나옵니다.

 

 

"SnrioID", "Nth" 이 복합키로 PK 이고, "SnrioID", "Nth" 칼럼 각각에 대해서도 INDEX를 걸어줬는데도 index를 사용하지 않게되는 이유가 궁금합니다.

 

by 마농 [2016.06.22 18:35:03]

인덱스가 있다고 무조건 인덱스르르 타는것은 아닙니다.
인덱스를 타는 것이 무조건 좋은 것도 아닙니다.


우선 서브쿼리는 어차피 [인덱스풀스캔] 일수밖에 없겠구요.


서브쿼리 결과가 메인에 전달될 때 그 건수가 문제입니다.
그 건수가 전체 중 극히 일부분 이라면? 인덱스 스캔이 유리하지만
극히 일부가 아닌 상당량을 차지하게 된다면 풀스캔이 유리합니다.
시나리오 하나당 가진 순번의 수가 평균 얼마정도 되나요?


조인시 인덱스가 사용된다는 의미는 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
;

 


by 하형욱 [2016.06.22 19:00:14]

감사합니다 정말 큰 것을 배워갑니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입