반응형
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 |