Search

[권장:성능]페이징 전 스칼라 서브쿼리

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 기본원리편
🔗