BAD: 260.470ms, hit=52080
OFFSET으로 건너뛸 행까지 스칼라 서브쿼리 실행
SELECT o.ord_no ,o.ord_dtm
,m.mbr_gd ,m.mbr_id
,(SELECT c.base_cd_nm
FROM startdbpg.cm_base_cd c
WHERE c.base_cd_dv = 'ord_st'
AND c.base_cd = o.ord_st
) AS ord_st_nm
,(SELECT s.shop_nm
FROM startdbpg.ms_shop_big s
WHERE s.shop_id = o.shop_id
) AS shop_nm
FROM startdbpg.tr_ord_big o
INNER JOIN startdbpg.ms_mbr_big m
ON m.mbr_id = o.mbr_id
WHERE o.ord_dtm >= '2024-01-01'
AND o.ord_dtm < '2024-01-02'
ORDER BY m.mbr_gd, m.mbr_id, o.ord_no
LIMIT 100 OFFSET 10000
;
SQL
복사
실행계획 보기
•
하루치 주문 21,708건을 정렬한 뒤, OFFSET으로 버릴 10,000건까지 포함해 스칼라 서브쿼리를 각각 10,100번 실행합니다(loops=10100).
GOOD: 86.039ms, hit=2080
페이징 후 스칼라 서브쿼리
SELECT o.ord_no ,o.ord_dtm
,o.mbr_gd ,o.mbr_id
,(SELECT c.base_cd_nm
FROM startdbpg.cm_base_cd c
WHERE c.base_cd_dv = 'ord_st'
AND c.base_cd = o.ord_st
) AS ord_st_nm
,(SELECT s.shop_nm
FROM startdbpg.ms_shop_big s
WHERE s.shop_id = o.shop_id
) AS shop_nm
FROM (
SELECT o1.ord_no ,o1.ord_dtm ,o1.ord_st ,o1.shop_id
,m.mbr_gd ,m.mbr_id
FROM startdbpg.tr_ord_big o1
INNER JOIN startdbpg.ms_mbr_big m
ON m.mbr_id = o1.mbr_id
WHERE o1.ord_dtm >= '2024-01-01'
AND o1.ord_dtm < '2024-01-02'
ORDER BY m.mbr_gd, m.mbr_id, o1.ord_no
LIMIT 100 OFFSET 10000
) o
ORDER BY o.mbr_gd, o.mbr_id, o.ord_no
;
SQL
복사
실행계획 보기
•
101페이지에 보여 줄 100건을 먼저 확정하고, 그 100건에만 스칼라 서브쿼리를 실행합니다(loops=100).
•
회원 조인은 정렬 기준(mbr_gd)에 필요해서 페이징 전에, 코드명·매장명은 화면 표시용이라 페이징 후에 둡니다.
KEY POINT
•
스칼라 서브쿼리를 페이징 전에 두면, OFFSET으로 버릴 행까지 실행됩니다.
•
페이징을 먼저 하고, 보여 줄 행에만 스칼라 서브쿼리를 실행합니다.
•
정렬이나 조건에 필요한 조인은 페이징 전에, 화면 표시용 조회는 페이징 후에 둡니다.
DEEP DIVE — SQL TUNER for PostgreSQL 기본원리편관련 페이지: [권장:성능]페이징 전 조인



