Home
Database
오라클 페이징 쿼리 (Oracle Top-N Query)
devfoxstar
devfoxstar
August 07, 2022
1 min

Table Of Contents

01
전통적인 방법 - 첫 번째
02
전통적인 방법 - 두 번째
03
새로운 방법
04
성능
05
결론

전통적으로 오라클은 페이징이 불편합니다.
다른 SQL 처럼 Top이나 Limit 기능이 없기 때문입니다.

그래서 오라클에서는 우회하는 방법으로 페이징 처리를 했습니다.


전통적인 방법 - 첫 번째

SELECT T2.*
FROM (
    SELECT 
        (ROWNUM) ROW_NUM
        T.*
    FROM (
        SELECT * FROM 테이블 ORDER BY 아이디 DESC    
    ) T
    WHERE ROWNUM <= 10
) T2
WHERE ROW_NUM >= 1

오라클에서는 조회를 하면 모든 ROW에 1부터 넘버링을 합니다.
해당 값을 이용하는 방법입니다.


전통적인 방법 - 두 번째

SELECT 
    T.*
FROM (
    SELECT
        ROW_NUMBER() OVER (ORDER BY 아이디 DESC) ROW_NUM,
        *
    FROM 테이블
) T
WHERE ROW_NUM >= 1 AND ROW_NUM <= 10

첫 번째와 두 번째 쿼리의 성능과 실행 계획은 크게 다르지 않습니다.
테이블의 전체 데이터를 정렬한 다음에 넘버링을 해서 조회하는 방법입니다.


새로운 방법

Oracle 12c 버전부터 새로운 페이징 방식이 가능해 졌습니다.
더 이상 모든 데이터를 가져올 필요가 없고, 간단히 필요한 ROW만 조회할 수 있습니다.

SELECT 
    * 
FROM 테이블 
ORDER BY 아이디 DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

성능

그런데 문제가 하나 있습니다.
새로 추가된 OFFSET.. FETCH.. 기능의 성능이 기대보다 좋지 않기 때문입니다.

데이터가 적은 테이블은 상관없지만, 대용량의 테이블은 서비스가 불가능 합니다.
오라클에서 성능 개선을 했다고는 하지만, 실행 계획을 보면 여전히 만족스러운 수준은 아닙니다.


결론

여전히 오라클을 사용하는 많은 개발자들은 전통적인 방법을 고수하고 있습니다.
새로운 방법은 아직까지 대용량의 데이터에 적합한 성능을 보여주지 못하고 있습니다.

새로운 방법은 소량의 데이터에 간편하게 사용할 때 활용하면 좋을 듯 합니다.


Tags

#Database#DB#Oracle#Paging#Top-N

Related Posts

Redis CLI, GUI (REDISINSIGHT)
March 11, 2023
1 min
© 2023, All Rights Reserved.

Quick Links

About Me

Media