☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND]오라클 데이터베이스 페이징 처리

조반짝 2023. 10. 2. 11:52
728x90
반응형

실행 계획과 ORDER BY

 

select * from tbl_board order by bno desc;

테스트를 위해 데이터가 많아지도록 데이터 수를 늘려준다,


인덱스와 오라클 힌트(hint)

주석같지만 영향을 주고 에러가 나도 sql실행에 지장을 주지 않는다.

select /*+Index_desc(tbl_board pk_board)*/ from tbl_board

힌트를 자주 사용하지 않지만 알아두면 좋다

쿼리문 힌트 사용 유무 차이점

 

힌트 사용 안함

힌트 사용함

힌트를 추가하면 힌트를 한번 더 조사해서 처리한다.

 


PK_BOARD 라는 인덱스

테이블을 생성할 때 제약 조건 PK를 지정하고 PK의 이름 'pk_board'라고 지정

식별자, 인덱스의 의미를 가지고 있다.

rowid : 의사열 칼럼, 오라클에서 로그값을 구분하기 위해 가상으로 만든 칼럼 

 

 


인덱스를 이용하는 정렬

인덱스는 미리 정렬이 되어있음 데이터를 찾는데 시간이 빠름 

뒤에서부터 찾아 올라간다.

 

 


ROWNUM과 인라인뷰

 

ROWNUM : 넘버링을 하지만 오라클이 사용하기위해  가상으로 만들어서 우리가 따로 만들 필요없다. 확인만 가능

로우넘은 실제데이터가 아니기 때문에 상황에 따라서 그 값이 매번 달라질 수 있다.

 

로우넘을 열개면 열개씩 끊어서 가져올 수 있기 때문에 페이징 처리를 할 수 있다.


인덱스를 이용한 접근 시 rownum

rownum 기준으로 10개 정렬

아무 결과가 나오지 않는 예시

로우넘 범위안에 있지 않기 때문에 결과값이 안나온다.


인라인 뷰 처리

페이지별로 10개씩 끊어서 보여주겠다.

예를 들어 총 50개의 데이터가 있다면 10개씩 보여준다. 

RN > 변수로 지정한다.

 

<쿼리문>

drop table tbl_board cascade CONSTRAINTS;

drop SEQUENCE seq_board;
-- create sequence seq_board;

-- Sequence 생성시 2부터 추가될 경우
create sequence seq_board
increment by 1
start with 0
maxvalue 9999999
minvalue 0;

create table tbl_board (
bno number(10, 0),
title varchar2(200) not null,
content varchar2(2000) not null,
writer varchar2(50) not null,
regdate date default sysdate,
updatedate date default sysdate
);

-- tbl_board 테이블 구조 보기
desc tbl_board;

alter table tbl_board add constraint pk_board primary key (bno); 

-- 다음 쿼리문 5번 실행
insert into tbl_board (bno, title, content, writer)
values (seq_board.nextval, '테스트 제목', '테스트 내용', 'user00');

select * from tbl_board;

commit;

select * from tbl_board;

select * from tbl_board where bno =3;

DELETE from tbl_board where bno=40;

UPDATE tbl_board set title = '수정된 제목', content = '수정된 내용', writer = '김국진', updatedate = sysdate where bno = 5; 

commit;
-- Page 270
select * from tbl_board order by bno desc;

-- Page 271 : 재귀 복사를 통해서 데이터의 개수를 늘려줍니다. 반복해서 여러번 실행해줍니다.
insert into tbl_board (bno, title, content, writer)
(select seq_board.nextval, title, content, writer from tbl_board);

-- Page 272
commit;

-- Page 272
select count(*) from tbl_board;

-- Page 272
-- 연산을 처리하면(+1) 속도가 느림 
select * from tbl_board order by bno + 1 desc;

-- Page 273
-- 연산처리를 안해서 속도가 빠름
select * from tbl_board order by bno desc;

-- Page 274 : 12.2 order by 보다는 인덱스 활용함
-- 아래 쿼리 구문에서 오라클 힌트 사용 안함
SELECT
    *
FROM
tbl_board
where bno>0;

-- 아래 쿼리 구문에서는 오라클 힌트 사용
SELECT
/*+ index_desc(tbl_board pk_board) */
    *
FROM
tbl_board
where bno>0;

SELECT
    *
FROM tbl_board;

select rownum rn, bno, title from tbl_board where bno between 1 and 300;

select rownum rn, bno, title from tbl_board where bno between 301 and 400;

select 
/*+ FULL(tbl_board)*/
rownum rn, bno, title
from tbl_board where bno > 0
order by bno;

select 
/*+ INDEX_DESC(tbl_board pk_board)*/
ROWNUM rn, bno, title, content
from tbl_board
where rownum <= 10;

-- Page287 : 아무 결과가 나오지 않는 예시입니다. 결과가 안 나오는 이유는 아래 rownum < 10 때문입니다. 
-- 왜냐하면 rownum이 1이기 때문입니다.
SELECT
/*+ INDEX_DESC(tbl_board pk_board)*/
ROWNUM rn, bno, title, content
from tbl_board
where ROWNUM > 10 and ROWNUM <=20;

-- rownum 은 반드시 1이 포함 되도록해야합니다.
SELECT
/*+ INDEX_DESC(tbl_board pk_board)*/
ROWNUM rn, bno, title, content
from tbl_board
where ROWNUM <=20;

-- 인라인뷰 적용: ROWNUM은 반드시 1이 포함되도록 해야합니다.
-- 아래의 쿼리 구문은 총 20개의 데이터 중에서 2PAGE 해당하는 10개 데이터를 화면으로 표시해줍니다.
SELECT BNO, TITLE, CONTENT
FROM(
SELECT
/*+ INDEX_DESC(tbl_board pk_board)*/
ROWNUM rn, bno, title, content
from tbl_board
where ROWNUM <=20
)
WHERE RN > 10;

 

 

728x90
반응형