◎ 오라클 데이터베이스 페이징 처리
▷ 구현된 기능들 중 가장 미숙한 부분은 목록 페이지
▷ 목록 페이지는 기본적으로 페이징(pagination) 처리가 필요함
▷ 수 많은 데이터를 한 페이지에서 보여주면 처리 성능에 영향을 미치며, 브라우저에서도 역시 데이터의 양이나 처리 속도에 문제를 일으킴
▷ 일반적인 페이징 처리는 크게 번호를 이용하거나 '계속 보기'(무한 스크롤, 더 보기) 형태로 구현
1. order by의 문제
▷ 프로그램을 이용해서 정렬할 때 데이터 양이 많을수록 많은 시간과 리소스를 소모함
▶ 빠르게 처리 되는 것
▶ 필요한 양만큼 가져오는 것이 중요
▷ 페이징을 하는 이유 : 최소한의 필요한 데이터만 가져와서 빠르게 화면에 보여주기 위함
▷ 빠르게 동작하는 SQL을 위해서는 먼저 order by를 이용하는 작업을 가능하면 하지 말아야 함
▶ order by는 데이터가 많은 경우 엄청난 성능의 저하를 가져오기 때문
(1) 실행 계획과 order by
▷ 오라클의 페이징 처리를 제대로 이해하기 위해 반드시 알아둬야 하는 것이 실행 계획
▶ 실행 계획 : SQL을 데이터베이스에서 어떻게 처리할 것인가?
데이터베이스에 전달된 SQL문은 아래와 같은 과정을 거쳐 처리됨
1. SQL 파싱 : SQL 구문에 오류 있는지, SQL 실행 대상 객체가 존재하는지 검사
2. SQL 최적화 : SQL이 실행되는데 필요한 비용 계산, 계산된 값을 기초로 어떤 방식으로 실행하는 것이 가장 좋다는 것을 판단하는 '실행 계획'을 세움
3. SQL 실행 : 세워진 실행 계획을 통해 메모리상에서 데이터를 읽거나 물리적인 공간에서 데이터를 로딩하는 작업,
개발자들은 도구를 이용하거나 SQL에 대한 실행 계획을 알아볼 수 있음
아래의 SQL 구문을 실행했을 시 실행 계획 버튼을 통해서 SQL이 어떻게 처리되었는지 알려줍니다.
가장 간단하게 실행 계획을 보는 방법은 '안쪽에서 바깥으로, 위에서 아래로' 보면 됩니다.
실행 계획을 세우는 것은 데이터베이스에서 하는 역할이므로 데이터의 양이나 제약 조건 등의 여러 상황에 따라 데이터베이스는 실행 계획을 다르게 작성-- 재귀 복사를 통해 데이터의 개수를 늘림. 반복해서 여러 번 실행 insert into tbl_board(bno, title, content, writer) (select seq_board.nextval, title, content, writer from tbl_board);
위의 insert문을 여러 번 실행하면 현재 tbl_board 테이블의 데이터 수만큼 다시 insert가 진행되며, 결과를 보면 insert 문을 실행할 때마다 2배씩 데이터가 늘어나게 됨
해당 구문을 통해 약 60만개의 데이터를 넣었습니다.
◎ select * from tbl_board order by bno + 1 desc;
SQL 결과가 나타나는데 0.245초 정도 소요됩니다.
실행 계획을 보았을 때 tbl_board를 'full'로 조사(스캔)했고, 바깥쪽으로 가면서 'SORT'가 일어난 것을 확인할 수 있습니다.
이때 정렬이 가장 시간이 오래 걸립니다.
◎ +1은 정렬에 도움이 되지 않으므로 제외하고 실행했을 때 시간의 차이가 확연한 것을 볼 수 있습니다.
SQL 결과가 나타나는데 0.07초 정도 소요됩니다.
▷ select * from tbl_board order by bno desc;
실행 계획도 다르게 나타나는 것을 볼 수 있습니다.
기존 SQL이 tbl_board 테이블 전체를 스캔했지만, 이번에는 pk_board라는 것을 이용해서 접근하고 기존과 달리 sort 과정이 없는 것을 볼 수 있습니다.
2. order by 보다는 인덱스
▷ 데이터가 많은 상태에서 정렬이 문제가 되었다면 '인덱스'를 이용해 정렬을 생략할 수 있습니다.
▷ 인덱스라는 존재가 이미 정렬된 구조이므로 이를 이용해 별도의 정렬을 하지 않는 방법
select /*+ index_desc(tbl_board pk_board) */ * from tbl_board where bno > 0;
위의 코드를 실행하면 뒤에서부터 정렬되며 실행 시간도 0 ~ 0.1로 나타납니다.
◎ 실행 계획
▷ sort를 하지 않았다는 점
▷ tbl_board에 바로 접근하는 것이 아니라 pk_board를 이용해 접근한 점
▷ range scan descending, by index rowid로 접근했다는 점이 중요
(1) pk_board라는 인덱스
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 ); alter table tbl_board add constraint pk_board primary key(bno);
테이블 생성시 제약 조건으로 PK를 지정하고 PK 이름이 'pk_board'
데이터베이스에서 PK는 '식별자', '인덱스'의 의미를 가짐
◎ '인덱스' : 색인, 도서 뒤쪽에 정리되어 있는 색인
▷ 색인을 이용하면 책 전체를 볼 필요 없이 원하는 내용을 찾을 수 있습니다.
▷ 사람들이 쉽게 찾아볼 수 있게 알파벳 순서나 한글 순서로 정렬하며, 반대로 찾아나가는 것을 '스캔'한다고
tbl_table 테이블은 bno라는 칼럼을 기준으로 인덱스 생성인덱스에는 순서가 있기 때문에 그림으로 표현하면 다음과 같습니다.
▷ 왼쪽은 인덱스, 오른쪽은 실제 테이블
▷ 왼쪽은 bno 값이 순서대로 정렬된 것을 볼 수 있습니다,
인덱스와 실제 테이블을 연결하는 고리는 rowid라는 존재
rowid는 데이터베이스 내의 주소에 해당합니다.(데이터는 모두 자신의 주소를 가지고 있음)
◎ select * from tbl_board where bno = 100;
▷ tbl_board에서 bno가 100이라는 데이터를 찾을 때 내용이 많지 않으면 전체를 살펴보는 것이 빠름
▶ FULL SCAN이라고 함
▷ 하지만 내용이 많고 색인이 존재한다면 색인을 찾고 색인에서 주소를 찾아 접근하는 방식을 이용
▷ 실행 계획을 보면 데이터베이스 내에서 진행되는 것을 확인할 수 있음
▷ PK_BOARD는 인덱스이므로 먼저 인덱스를 이용해 100번 데이터가 어디에 있는지 rowid를 찾고
바깥쪽을 보면 'by index rowid'로 rowid를 통해 테이블에 접근함
오라클의 데이터베이스 페이징 처리를 위해 order by와 인덱스를 사용하는 방법에 대해 알아보았습니다.
sort 기능 사용 여부에 따라서 사용 시간이 차이가 나는 것을 확인할 수 있습니다.
다음 글에서 이어서 내용 추가해 볼게요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Spring' 카테고리의 다른 글
[코드로 배우는 스프링 웹 프로젝트] ch13 MyBatis와 스프링에서 페이징 처리(Criteria) (0) | 2023.03.29 |
---|---|
[코드로 배우는 스프링 웹 프로젝트] ch12 오라클 데이터베이스 페이징 처리 2(hint, rownum) (0) | 2023.03.29 |
[코드로 배우는 스프링 웹 프로젝트] ch11 화면 처리 4 (0) | 2023.03.29 |
[코드로 배우는 스프링 웹 프로젝트] ch11 화면 처리 3 (0) | 2023.03.29 |
[코드로 배우는 스프링 웹 프로젝트] ch11 화면 처리 2 (0) | 2023.03.29 |