Search

[필수:정합]정렬 기준 없는 페이징

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