BAD
2페이지 조회
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
LIMIT 100 OFFSET 100;
SQL
복사
실행계획 보기
3페이지 조회
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
LIMIT 100 OFFSET 200;
SQL
복사
실행계획 보기
검증 SQL
-- 검증SQL(페이지별 중복 존재)
SELECT v1.*
FROM (
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
LIMIT 100 OFFSET 100
) v1
INTERSECT
SELECT v2.*
FROM (
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
LIMIT 100 OFFSET 200
) v2
;
SQL
복사
•
ORDER BY 없이 LIMIT/OFFSET을 사용하면 조회 순서가 보장되지 않습니다. 예제처럼 페이지별로 실행계획이 달라질 수 있어, 서로 다른 페이지에서 일부 행이 중복되거나 누락될 위험이 있습니다.
GOOD
2페이지 조회
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
ORDER BY o.ord_dtm ,o.ord_no
LIMIT 100 OFFSET 100;
SQL
복사
실행계획 보기
3페이지 조회
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
ORDER BY o.ord_dtm ,o.ord_no
LIMIT 100 OFFSET 200;
SQL
복사
실행계획 보기
검증 SQL
-- 검증SQL(페이지별 중복 존재)
SELECT v1.*
FROM (
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
ORDER BY o.ord_dtm ,o.ord_no
LIMIT 100 OFFSET 100
) v1
INTERSECT
SELECT v2.*
FROM (
SELECT m.mbr_id ,m.nick_nm
,o.ord_no ,o.ord_st ,o.ord_dtm
FROM startdbpg.ms_mbr_big m
LEFT OUTER JOIN startdbpg.tr_ord_big o
ON (o.mbr_id = m.mbr_id
AND o.ord_dtm >= '2025-01-01'
AND o.ord_dtm < '2025-02-01')
WHERE m.nick_nm LIKE 'Air%'
ORDER BY o.ord_dtm ,o.ord_no
LIMIT 100 OFFSET 200
) v2
;
SQL
복사
•
페이징 처리에서는 ORDER BY로 조회 순서를 명시합니다. 이때 결과 집합의 각 행을 유일하게 구분할 수 있는 컬럼을 정렬 기준에 포함해야 합니다.
KEY POINT


