개발일지 - 2023.10.25 (Oracle row_number() 함수

김한규·2023년 10월 25일
0

오늘은 프로젝트를 진행하며 쿼리의 성능을 조금이나마 개선하게 되면서 알게 된 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
  1. 바꾼 쿼리
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가 가장 높은 데이터가 나온다.

profile
사회에 기여하는 개발자가 되기 위해 성장하고 있습니다!

0개의 댓글