C.W.K.
Stream
Lesson 03 of 16 · published

ORDER BY, LIMIT, 페이지네이션

~12 min · queries, ordering

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

정렬은 공짜 아님

SQL 은 명시적 ORDER BY 없으면 정렬 보장 없음. 어제 '우연히' 정렬돼서 온 쿼리가 plan 이 다른 access path 고르면 내일 조용히 순서 바뀜. 순서 중요할 때 항상 ORDER BY.

정렬

  • 오름차순이 default; ORDER BY price DESC 가 내림차순.
  • 다중 컬럼은 사전식: ORDER BY category, price DESC.
  • NULLS FIRST / NULLS LAST 가 NULL 위치 제어 (PostgreSQL extension).
  • 계산 표현식 또는 컬럼 위치 (ORDER BY 2 DESC) 로도 정렬 — 둘 다 적법, 표현식이 더 readable.

페이지네이션 — OFFSET 이 스케일 멈추는 이유

LIMIT 10 OFFSET 100 도 처음 100 행 읽고 버려야 함. 1000 페이지에선 요청당 10000 행 버림. 커서 기반 (keyset) 페이지네이션이 스케일 답: 마지막 본 값으로 필터, 그다음 LIMIT. OFFSET 없음, 페이지 깊이 무관 일정 비용.

Code

정렬·sql
SELECT name, price, created_at
FROM   products
ORDER  BY category ASC, price DESC NULLS LAST;
OFFSET 페이지네이션 (스케일에서 느림)·sql
-- 페이지 1
SELECT * FROM products ORDER BY created_at DESC LIMIT 20;
-- 페이지 N
SELECT * FROM products ORDER BY created_at DESC LIMIT 20 OFFSET (N-1)*20;
Keyset 페이지네이션 (일정 비용)·sql
-- 첫 페이지
SELECT id, name, created_at
FROM   products
ORDER  BY created_at DESC, id DESC
LIMIT  20;

-- 다음 페이지: 마지막 (created_at, id) 를 커서로
SELECT id, name, created_at
FROM   products
WHERE  (created_at, id) < ('2026-04-01 00:00:00', 12345)
ORDER  BY created_at DESC, id DESC
LIMIT  20;

External links

Exercise

OFFSET 페이지네이션 쿼리 잡고 (sort_column, id) composite 커서로 keyset 변환. 어느 '페이지' 직접 요청해도 같은 결과 반환 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.