MSSQL MAX값 가져와서 JOIN 하는 쿼리 4개 비교

개요

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

샘플 데이터 구조

mssql max값 샘플 테이블 구조
mssql max값 샘플 테이블 구조

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 테이블을 두 번만 읽어서 그랬을 것으로 보입니다.

Comments

No comments yet. Why don’t you start the discussion?

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다