쿼리 성능 향상을 위해 필수적인 기법인 Row Limiting은 SQL 쿼리에서 특정 개수의 행(Row)만 조회하도록 제한하는 기법을 의미합니다. 주로 부분범위처리를 할때 사용합니다.
예전엔 where절에 rownum 조건으로 제한하곤 했는데, 오라클 12C 이상 버전부터 새로운 기능이 추가되어 기본적인 사항부터 차근차근 한번 알아보고자 합니다.
Oracle에서 Row Limiting(행 제한)을 설정하는 방법은 Oracle 버전에 따라 다르게 적용됩니다. 최신 버전(Oracle 12c 이상)에서는 표준 SQL 방식인 OFFSET과 FETCH를 사용할 수 있으며, 이전 버전에서는 ROWNUM 또는 ROW_NUMBER()를 활용해야 합니다.
Oracle 12c부터 도입된 OFFSET과 FETCH 절을 사용하면 페이징 처리 및 행 제한을 쉽게 구현할 수 있습니다.
FETCH FIRST n ROWS ONLY)SELECT *
FROM employees
ORDER BY employee_id
FETCH FIRST 10 ROWS ONLY; ✅ 위 쿼리는 employee_id 기준으로 정렬된 데이터 중 상위 10개 행을 반환합니다.
오라클 12c부터 /*+ first_rows(n) */ 힌트를 사용하면 힌트에 지정한 n으로 카디널리티를 계산하므로 비교적 인덱스를 잘 사용합니다. 페이징 처리에 윈도우 함수 또는 Row Limiting 기능을 사용한다면 /*+ first_rows(n) */ 힌트를 같이 사용해주는 것이 좋습니다.
OFFSET n ROWS FETCH NEXT n ROWS ONLY)SELECT *
FROM employees
ORDER BY employee_id
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; ✅ 위 쿼리는 처음 5개 행을 건너뛰고, 그 다음 10개 행을 가져옵니다.
윈도우 함수 기능이 점점 좋아지고 12C부터는 Row Limiting도 지원 하지만, 인덱스 활용이 중요한 온라인성 쿼리에서 ‘Top N Stopkey’ 알고리즘이 잘 동작하지 않는 경우가 있어서 무턱대고 새로 추가된 기능을 사용하기보단 실행계획을 잘 보고 사용해야한다.
ROWNUM은 Oracle에서 제공하는 가상 열로, 실행되는 순서대로 번호를 부여합니다. 하지만 ORDER BY보다 먼저 적용되므로, 정렬된 데이터를 정확하게 제한하려면 서브쿼리를 사용해야 합니다.
SELECT *
FROM (
SELECT *
FROM employees
ORDER BY employee_id
)
WHERE ROWNUM <= 10; ✅ ROWNUM은 ORDER BY보다 먼저 평가되므로, 반드시 서브쿼리를 사용하여 정렬 후 제한을 적용해야 합니다.
ROWNUM을 사용할 경우 ORDER BY를 적용하기 어렵기 때문에, ROW_NUMBER() 함수를 활용하면 보다 유연한 행 제한이 가능합니다.
SELECT *
FROM (
SELECT employees.*, ROW_NUMBER() OVER (ORDER BY employee_id) AS rn
FROM employees
)
WHERE rn BETWEEN 6 AND 15; ✅ ROW_NUMBER()를 사용하면 ORDER BY가 제대로 적용되며, 특정 범위의 행을 가져올 수 있습니다.
| 방법 | 설명 | 장점 | 단점 |
|---|---|---|---|
FETCH FIRST | 최신 SQL 표준 방식 | 간결하고 빠름 | Oracle 12c 이상에서만 사용 가능 |
ROWNUM | 빠르고 간단함 | Oracle 11g 이하에서 사용 가능 | ORDER BY 적용이 어렵고 서브쿼리가 필요함 |
ROW_NUMBER() | ORDER BY와 함께 유연한 행 제한 가능 | 페이징 처리에 적합 | 성능이 상대적으로 느릴 수 있음 |
FETCH FIRST ... OFFSET 방식 사용 (권장 ✅)ROW_NUMBER() 또는 ROWNUM 사용 ROWNUMROW_NUMBER()이제 버전에 따라 가장 적절한 방법을 사용하여 행 제한을 적용하면 됩니다! 🚀
코스피 8% 폭락, 서킷브레이커 발동, SK텔레콤 Claude AI 차단까지. 한국의 AI 레버리지 버블이 단 하루…
SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…
SNS 사진 1장으로 30초 만에 딥페이크 영상이 완성됩니다. 당신의 얼굴이 이미 범죄에 악용되고 있을 수…
달러/원 환율이 급등하는 이유와 실생활 영향을 정리했습니다. 지금 당장 활용할 수 있는 환전·투자 대응 전략까지…
미래에셋·미래에셋벤처투자·미래에셋생명이 동반 급등한 이유는 스페이스X 상장 기대감입니다. 세 회사가 스페이스X와 어떻게 연결되어 있는지 상세히 분석했습니다.
스페이스X 상장이 계속 미뤄지는 진짜 이유를 파헤쳤습니다. 화성 계획, 스타링크 분리, 국방 계약... 머스크가 절대…