홈 › SQL 실무 › 01 / 9

페이징 쿼리

ROWNUM, LIMIT, OFFSET FETCH, 키셋 페이징
섹션 6진행 0 / 9

6. 정리

표준 페이징은 ORDER BY ... OFFSET n ROWS FETCH NEXT m ROWS ONLY 입니다. Oracle 12c·MSSQL 2012 부터 지원하고 MSSQL 은 ORDER BY 가 필수입니다. Tibero 는 버전을 확인합니다.

옛 Oracle 은 정렬한 인라인 뷰에서 ROWNUM <= 끝 으로 자르고 바깥에서 rn > 시작 으로 거릅니다. WHERE ROWNUM > 10 은 ROWNUM 이 WHERE 평가 중에 부여되어 항상 0건입니다. MySQL 은 LIMIT n OFFSET m(LIMIT m, n), MSSQL 은 첫 페이지에 TOP n 입니다. ROW_NUMBER() 는 셋 모두에서 되는 대안입니다.

정렬이 동점이면 결과 순서가 비결정적이라 페이지 사이에 중복·누락이 생깁니다. ORDER BY 끝에 기본 키를 덧붙입니다.

OFFSET 은 앞 행을 모두 읽고 버리므로 뒤 페이지일수록 느립니다. 키셋 방식은 (정렬 컬럼, id) 복합 인덱스와 OR 로 푼 조건으로 어느 위치에서든 빠르지만 임의 페이지 이동은 안 됩니다. 행 값 비교 (a, b) < (x, y) 는 MySQL 만 지원하므로 풀어 씁니다.

COUNT(*) OVER () 로 총 건수를 함께 받을 수 있으나 대용량에서는 비싸서 "더 보기" 방식이나 근사치로 대체하기도 합니다. 다음 레슨은 검색 화면의 조건이 있을 때만 WHERE 가 붙는 동적 검색 조건을 다룹니다. 이 레슨의 페이징과 함께 쓰는 패턴입니다.