오늘은 프로젝트를 진행하며 쿼리의 성능을 조금이나마 개선하게 되면서 알게 된 row_number() 함수에 대하여 설명하고자 한다.
먼저 본래 나의 쿼리는 두 개의 테이블을 모두 FULL SCAN 하며 MAX(Reg_Date) 를 사용해 가장 최신에 등록된 데이터를 뽑아야했다. 이렇게 하니.. 배치 하나가 48분까지도 돌았다.
그래서 찾아낸 것이 row_number() 함수였고 이를 이용하니 훨씬 성능이 좋아졌다. 하지만 어떤 데이터들에는 row_number()함수가 max()보다 성능이 좋지 않았다. 그 이유는 아직은 모르겠지만 계속해서 모니터링 해 볼 예정이다.
바뀐 쿼리 예시는 하기와 같았다.
1. 원래 쿼리
SELECT B.*
FROM ( SELECT ID,
NAME,
COMPANY,
MAX(REG_DATE)
FROM TABLE
GROUP BY ID, NAME, COMPANY ) A
, TABLE B
WHERE A.ID = B.ID
AND A.NAME = B.NAME
AND A.COMPANY = B.COMPANY
SELECT *
FROM ( SELECT A.*
ROW_NUMBER() OVER(PARTITION BY ID, NAME, COMPANY ORDER BY REG_DATE DESC) AS RN
FROM TABLE A)
WHERE RN = 1
이는 PARTITION BY 뒤에 컬럼들로 데이터들을 묶고 REG_DATE 를 기준으로 내림차순 한다는 의미가 된다.
그런 다음 RN = 1 을 두면 ID, NAME, COMPANY로 묶인 데이터 그룹에서REG_DATE가 가장 높은 데이터가 나온다.