개요
Master Detail 구조에서 Detail 테이블의 마지막 레코드에서 값을 뽑는 경우, 쿼리의 형태가 여러 개가 있어서 테스트 해봄
샘플 데이터 구조


ASSET_MASTER 테이블은 10만건 정도이고, ASSET_HISTORY 테이블은 100 만건 정도임
서버는 로컬 PC 임. ( Ryzen 5600G, 16G ), SQL 은 SSD 에 설치되어있음.
Max값을 가져오는 샘플 쿼리 4가지
-- max값 쿼리1 : 25%
SELECT A.AST_NO, C.HST_TYPE
FROM ASSET_MASTER A
JOIN (
SELECT AST_NO, MAX(HST_SEQ) AS MAXNO, SITE_CODE
FROM ASSET_HISTORY A
GROUP BY AST_NO, SITE_CODE
) B ON A.AST_NO = B.AST_NO AND A.SITE_CODE = B.SITE_CODE
JOIN ASSET_HISTORY C
ON B.AST_NO = C.AST_NO
AND B.MAXNO = C.HST_SEQ
AND B.SITE_CODE = C.SITE_CODE
-- 쿼리2 : 27%
SELECT A.AST_NO, B.HST_TYPE
FROM ASSET_MASTER A
LEFT OUTER JOIN ASSET_HISTORY B ON A.AST_NO = B.AST_NO AND A.SITE_CODE = B.SITE_CODE
LEFT OUTER JOIN ASSET_HISTORY C ON B.AST_NO = C.AST_NO AND B.HST_SEQ < C.HST_SEQ AND B.SITE_CODE = C.SITE_CODE
WHERE C.HST_SEQ IS NULL
-- 쿼리3 : 31%
SELECT A.AST_NO
, HST_TYPE = ( SELECT TOP 1 HST_TYPE FROM ASSET_HISTORY WHERE AST_NO = A.AST_NO AND SITE_CODE = A.SITE_CODE ORDER BY HST_SEQ )
FROM ASSET_MASTER A
-- 쿼리4 : 17%
SELECT A.AST_NO, B.HST_TYPE
FROM ASSET_MASTER A
JOIN (
SELECT A.SITE_CODE, A.AST_NO, ROW_NUMBER() OVER ( PARTITION BY SITE_CODE, AST_NO ORDER BY HST_SEQ DESC) AS NUM, HST_TYPE
FROM ASSET_HISTORY A
) B ON A.AST_NO = B.AST_NO AND A.SITE_CODE = B.SITE_CODE AND B.NUM = 1
결과적으로는 마지막 쿼리가 비용이 가장 적었습니다.
아마도 HISTORY 테이블을 두 번만 읽어서 그랬을 것으로 보입니다.