본문 바로가기

BackEnd/Oracle

오라클 페이징 처리

반응형

1. 오라클 페이징 처리

 

수많은 데이터를 한 페이지에서 보여주면,처리 성능에 영향을 미침 

 

또한,브라우저에서도 역시 데이터의 양이나 처리 속도에 문제를 일으키게됨

 

데이터의 양이 많을수록 정렬이라는 작업이 얼마나 많은 리소스를 소모하는지 알 수 있다

 

빠르게 동작하는 SQL을 위해서는 먼저 order by를 이용하는 작업을 가능하면 하지 말

 

아야 한다.

 

오라클의 페이징 처리를 제대로 이해하기 위해서 반드시 알아두어야 하는 것이 실행 계획

(execution plan)이다

 

실행 계획은 말 그대로 'SQL을 데이터베이스에서 어떻게 처리할 것인가?’에 대한 것

 

SQL이 데이터베이스에 전달되면 데이터베이스는 여러 단계를 거쳐서 해당 SQL을 어떤 순서와 

 

방식으로 처리할 것인지 계획을 세움

 

데이터베이스에 전달된 SQL문은 아래와 같은 과정을 거쳐서 처리

 

 

SQL 파싱 단계에서는 SQL 구문에 오류가 있는지 SQL을 실행해야 하는 대상 객체(테이

 

블,제약 조건,권한 등)가 존재하는지를 검사한다.

 

SQL 최적화 단계에서는 SQL이 실행되는데 필요한 비용(cost)을 계산. 이 계산된 값을 기초로 해서 어

 

떤 방식으로실행하는 것이 가장 좋다는 것을 판단하는 ’실행 계획(execuion plan)’을 세움

 

SQL 실행 단계에서는 세워진 실행 계획을 통해서 메모리상에서 데이터를 읽거나 물리적

 

인 공간에서 데이터를 로딩하는 등의 작업을 하게 된다.

 

가장 간단하게 실행 계획을 보는 방법은 '안쪽에서 바깥쪽으로,위에서 아래로' 봐주면 됨

 

실행 계획을 세우는 것은 데이터베이스에서 하는 역할이기 때문에 데이터의 양이나 제약 조건 등

 

의 여러 상황에 따라서 데이터베이스는 실행 계획을 다르게 작성

 

 

2. order by 보다는 인덱스

 

데이터가 많은 상태에서 정렬 작업이 문제가 되면, 가장 일반적인 해결책은 '인덱스(index)를 이용해

 

서 정렬을 생략하는 방법

 

인덱스'라는 존재가 이미 정렬된 구조이므로 이를 이용해서 별도의 정렬을 하지 않는 방법

 

select /* INDEX_DESC(tbl_board pk_board) */ * from tbl_board where bno > 0

 

 

1) SORT를 하지 않았다는점

2) TBL_BOARD를 바로 접근하는 것이 아니라 PK_BOARD를 이용해서 접근한 점

3) RANGE SCAN DESCENDING, BY INDEX ROWID로 접근했다는 점

 

PK의 이름이 |pk_board’라고 지정.

 

데이터베이스에서 PK는 상당히 중요한 의미를 가지는데,흔히 말하는 ’식별자’의 의미와 ’인덱스'의 

 

의미를 가짐

 

데이터베이스에 테이블을 만들 때 PK를 부여하면 지금까지 얘기한 ’인덱스’라는 것이 만

들어짐.

 

데이터베이스를 만들 때 pk를 지정하는 이유는 ’식별|이라는 의미가 있지만,구조상으로는 ’인덱스’라

 

는 존재(객체)가 만들어지는 것을 의미

 

그림의 왼쪽은 인덱스이고 오른쪽은 실제 테이블

 

왼쪽 그림을 보면 bno 값이 순서대로 정렬된 것을 볼 수 있다. 

 

오른쪽은 테이블 모습. 테이블은 마치 책장에책을 막 넣은 것처럼 중간에 순서가 섞여 있는 경우가 대부분

 

인덱스와 실제 테이블을 연결하는 고리는 ROWID라는 존재 .  ROWID는 데이터베이스 내의 주

 

소에 해당하는데 모든 데이터는 자신만의 주소를 가지고 있다.

 

색인이 존재한다면 당연히 색인을 찾고 색인에서 주소를 찾아서 접근하는 방식을 이용할 것.

 

PK_BOARD는 인덱스이므로 먼저 인덱스를 이용해서 100번 데이

 

터가 어디에 있는지 ROWID를 찾아내고, 바깥쪽을 보면 ’BY INDEX ROWID’라고 되어

 

있는 말 그대로 ROWID를 통해서 테이블에 접근

 

bno의 역순으로 정렬한 결과’를 원하다면 이미 정렬된 인덱스를 이용해서 뒤에서부터 찾

 

아 올라가는 방식을 이용할 수 있다.

 

이때 ’뒤에서부터 찾아 올라간다’는 개념이 DESCENDING'

 

 

인덱스를 역순으로 찾기 때문에 가장 먼저 찾은 bno 값은 가장 큰 값을 가진 데이터가 된다.

 

이후에는 테이블에 접근해서 데이터를 가져오게 되는데,이런 과정이 반복되면 정렬을 하지 않아도 

 

동일하게 정렬된 결과를 볼 수 있게 된다.

 

다음은 같은 결과를 가져오는 sql

 

select * from tbl_board order by bno desc;

 

select /*+INDEX_DESC (tbl_board pk_board) * /  * from tbl_board;

 

 

 

 

 

 

반응형

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

비밀번호 만료 재설정  (0) 2022.01.17
inner join과 outer join의 차이점  (0) 2019.07.04
기본키,외래키  (0) 2019.06.29