[ORACLE] PAGING 처리

반응형

1. Paging 처리 정의

  • 데이터베이스에서 읽어와 화면에 출력할 때 한꺼번에 모든 데이터를 가져오는 것보다 출력될 페이지의 데이터만 나눠서 가져오는 것을 페이징(Paging)이라고 한다.

 

1) 표준 패턴
var num_page_no number;
exec :num_page_no :=2; -- 페이지번호

var num_page_size number;
exec :num_page_size := 10; -- 한페이지출력개수(사이즈)

select a,b,c
from (
    select x.rnum no,a,b,c
    from (
        select rownum rnum, a,b,c from t_board t    
        order by reg_dt desc
        )x
    where rnum < (:num_page_no * :num_page_size)
    )
where no > ((:num_page_no-1) * :num_page_size) + 1;

Execution Plan
----------------------------------------------------------
Plan hash value: 753453754

---------------------------------------------------------------------------------
| Id  | Operation             | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |         |  2000 | 80000 |     6  (17)| 00:00:01 |
|*  1 |  FILTER               |         |       |       |            |          |
|*  2 |   VIEW                |         |  2000 | 80000 |     6  (17)| 00:00:01 |
|   3 |    SORT ORDER BY      |         |  2000 | 72000 |     6  (17)| 00:00:01 |
|   4 |     COUNT             |         |       |       |            |          |
|   5 |      TABLE ACCESS FULL| T_BOARD |  2000 | 72000 |     5   (0)| 00:00:01 |
---------------------------------------------------------------------------------

-- 2개 서브쿼리 절에 reg_dt 컬럼으로 Sorting을 한 후, 원하는 값을 뽑아낸다.

 

2) Index를 태울수 있으면
var num_page_no number;
exec :num_page_no :=2; -- 페이지번호

var num_page_size number;
exec :num_page_size := 10; -- 한페이지출력개수(사이즈)

-- reg_dt 기준으로 정렬된 유니크한 값을 원할 때,
create index t_board_idx1 on ora1.t_board(reg_dt,a,b,c);

select a,b,c
from (
    select /*+ INDEX_DESC(t t_board_idx1)*/ rownum rnum , a,b,c from t_board t
    where reg_dt is not null and rownum <= (:num_page_no*:num_page_size)
    )
where rnum >  ((:num_page_no-1) * :num_page_size) + 1;

Execution Plan
----------------------------------------------------------
Plan hash value: 645718038

---------------------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |              |  2000 | 80000 |    15   (0)| 00:00:01 |
|*  1 |  VIEW                        |              |  2000 | 80000 |    15   (0)| 00:00:01 |
|*  2 |   COUNT STOPKEY              |              |       |       |            |          |
|*  3 |    INDEX FULL SCAN DESCENDING| T_BOARD_IDX1 |  2000 | 72000 |    15   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("RNUM">(TO_NUMBER(:NUM_PAGE_NO)-1)*TO_NUMBER(:NUM_PAGE_SIZE)+1)
   2 - filter(ROWNUM<=TO_NUMBER(:NUM_PAGE_NO)*TO_NUMBER(:NUM_PAGE_SIZE))
   3 - filter("REG_DT" IS NOT NULL)

1. 인덱스 사용 가등하도록 조건절을 구사한다. 
2. 소트 연산을 생략할 수 있도록 인덱스를 구성한다. 

## PLAN 설명##
COUNT STOPKEY -> NO SORT + STOPKEY
->조건절에 부합하는 레코드가 아무리 많아도 그 중 ROWNUM으로 지정한 건수 만큼 결과 레코드를 얻으면 거기서 멈춘다는 뜻이다.

 

 

2. Row Limiting Caluse

# 오라클 12c 이상부터는 Row Limiting Caluse 사용가능

  • Offset : 첫번째 데이터로 부터 얼마나 떨어져있는지
  • FETCH : 몇 개의 데이터를 볼건지

 

1) query 
select  c1, c2 from test10 
order by c1
offset 0 row fetch first 5 rows only;


SELECT *
FROM table_name
ORDER BY column_name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

 

2. 비율로 출력
select c1, c2 from test10
order by c1
fetch first 50 percent rows only;​
반응형

'Database > Oracle' 카테고리의 다른 글

[ORACLE] Object변경 작업(dependency check, lock)  (0) 2022.08.26
[ORACLE] Direct Path I/O  (0) 2022.08.25
[ORACLE] RAC Patch  (0) 2022.06.27
[ORACLE] RAC Recovery  (0) 2022.06.16
[ORACLE] ASM 접속 및 용량 조회  (0) 2022.06.13