관리 메뉴

LIFE & IT

[ 페이징 처리 1 ] 오라클 데이터베이스 페이징 처리(1) - 실행 계획 본문

웹 프로그래밍/Spring Framework

[ 페이징 처리 1 ] 오라클 데이터베이스 페이징 처리(1) - 실행 계획

프린이! 2020. 2. 21. 21:20

오라클 페이징 처리를 이해하기 위해서 반드시 알아두어야 하는 것이 실행 계획(execution plan) 이다.

 

 

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

그림1. SQL문 처리 과정

 

SQL 파싱 : SQL 구문 오류, SQL 문을 실행해야하는 대상 객체(테이블, 제약 조건, 권한 등) 존재 검사

 

SQL 최적화 : SQL 이 실행 되는데 필요한 비용(cost) 계산.

*비용(cost) - 이 계산 값을 기초로 어떤 방식으로 실행하는 것이 가장 효율적인지 판단. = 실행계획(execution plan)

 

SQL 실행 : 실행계획을 통해 메모리상에서 데이터를 읽거나 물리적인 공간에서 데이터를 로딩하는 등의 작업을 한다.

 

개발자들은 DB도구, SQL PLUS 등을 이용해서 특정한 SQL에 대한 실행 계획을 알아 볼 수 있음.

ex) 게시물 번호의 역순으로 출력하라.(= select * from tbl_board order by bno desc; )

 

아래 그림과 같이 SQL Developer 에서 제공되는 실행 계획 버튼을 볼 수 있다.

그림2. SQL Developer 실행계획 버튼

 

그림3. SQL Developer 실행계획 창

 

실행 계획 분석 방법은 "안쪽에서 바깥쪽으로, 위에서 아래로" 보면 된다.

아래 접은글 참고 -"안쪽에서 바깥쪽으로, 위에서 아래로" 설명 +@ 내 설명 추가

더보기

SQL 실행 계획을 정확하게 읽고 분석하는 것은 

초보자에게 쉬운 일은 아니다.

 

나는 IT가 아니기에 디테일한 구조와 원리까진 모르겠지만,

그래도 SQL 유저라고 한다면 실행 계획 정도는 확실히 알고 가야 하겠다.

 

일단 실행 계획을 읽고 해석하는 방법 부터 익혀 보자.

 

실행계획의 단계 단계를 '스텝'이라고 한다.

각 스텝별로 그 단계에서 어떤 명령이 어떻게 수행되었고, 총

몇 건의 데이터가 처리되었으며,

이를 위해 얼마만큼의 비용과 시간이 들었는지가 표시된다.

 

실행계획을 읽기 위해서는 아래 세 가지의 규칙만 기억하면 된다.

 

①  위에서 아래로 읽어 내려가면서 제일 먼저 읽을 스텝 찾기

②  내려가는 과정에서 같은 들여쓰기가 존재하면, 무조건 위에서 아래 순으로 읽기

③  읽고자 하는 스텝보다 들여쓰기가 된 하위 스텝이 존재한다면, 가장 안쪽으로 들여쓰기 된 스텝을 시작으로 하여 한 단계씩 상위 스텝으로 읽어 나오기

 

심플한 예제를 보자.

 

 

Id

Operation

Name

Rows

Bytes

Cost(%CPU)

Time

0

select cstmer_no  

1

87

3(0)

00:00:01

* 1

    table access full tbwcstmr

1

87

3(0)

00:00:01

☆ 규칙 :   번 수행으로 읽을 스탭(ID=0)을 찾았고,  번 하위 스텝이 존재하므로 가장 안쪽 (ID=1) 시작으로 상위 스텝으로 읽어 나오기

 

> 원본 : 실행 계획을 읽는 순서, 즉 SQL 이 수행되는 순서는 다음과 같다. 

 

결과 : ID 1 → 0

 

하나의 예를 더 보자.

 

Id

Operation

Name

Rows

Bytes

Cost(%CPU)

Time

0

select cstmer_no  

3

300

4(0)

00:00:01

1

    nested loops  

3

300

4(0)

00:00:01

* 2

        index unique scan px_cstmr

1

13

1(0)

00:00:01

* 3

        table access full tbwcstmr

3

261

3(0)

00:00:01

☆ 규칙 :   번 수행으로 읽을 스탭(ID=0)을 찾았고, 하위스텝인 ID=1번을 읽는 과정에서 번 규칙인 같은 들여쓰기가 존재(ID=2,3) 하므로 위에서 아래로 읽고  번  ID=0 은 하위 스텝이 존재하므로 가장 안쪽 (ID=1) 시작으로 바깥쪽인 상위 스텝(ID=0)으로 읽어 나오기

 

> 원본 : 이같은 경우, 위에서 아래로 읽어가는 중에, 같은 들여쓰기로 되어 있는 스텝이 존재하는 것을 볼 수 있다.

같은 들여쓰기에 대해서는 위에서 아래로, 즉 ID 2를 먼저 수행하고 ID 3을 읽어 수행한다.

순서는 다음과 같다.

 

결과 : ID 2 → 3 → 1 → 0

 

이번엔 좀 더 섞여 있는 예를 보자.

 

Id Operation Name Rows Bytes Cost(%CPU) Time

0

select cstmer_no      

3(100)

 

1

    nested loops  

1

117

3(0)

00:00:01

2

        table access by insex rowid tbwcstmr

1

87

2(0)

00:00:01

* 3

            index unique scan pk_cstmr

1

 

1(0)

00:00:01

4

        table accescc by index rowid tbwcard

409

12270

1(0)

00:00:01

* 5

            index unique scan pk_card

1

 

0(0)

 

☆ 규칙 : 번 규칙으로 하위 스텝 ID=0 을 찾았고 하위스텝 ID=1 을 읽는 과정에서 번 규칙인 같은 들여쓰기가 존재(ID=2,4) 한다. 하지만 ID=2,4 가 각각 하위 스텝이 존재(ID=3,5)하므로  번 규칙에 의해 가장 안쪽에서 부터 바깥쪽으로 그리고 번 규칙에 의해 위에서 아래로 읽어 나온다.

 

> 원본 : 위에서 아래로 읽어 가는 중, 같은 들여쓰기로 되어 있는 스텝 ID 2와 4가 보인다.

같은 스텝에 대해서는 위에서 아래로 즉, ID 2를 읽고, ID 4를 나중에 읽는다.

하지만 ID 2를 읽으려니, 한번 더 들여쓰기가 된 ID 3이 존재하므로, ID 3을 먼저 읽고 ID 2를 읽게 된다.

또, 스텝 ID 4를 읽을 때도 하위 스텝인 ID 5가 존재하므로, ID 5를 읽고 나서 ID 4을 읽게 된다.

순서는 다음과 같다.

 

결과 : ID 3 → 2 → 5 → 4 →1 → 0

 

 

마지막 예이다.

 

Id

Operation

Name

Rows

Bytes

Cost(%CPU)

Time

0

select cstmer_no  

14

1638

17(0)

00:00:01

1

    nested loops  

1

     

2

        nested loops  

14

1638

17(0)

00:00:01

3

            table access full tbwcstmr

14

1218

3(0)

00:00:01

* 4

            indes unique scan pk_cstmr

1

 

0(0)

00:00:01

5

        table accescc by index rowid tbwcard

1

30

1(0)

00:00:01

 

실행계획을 읽는 순서는 다음과 같다.

ID 3 → 4 → 2 → 5 → 1 → 0

 

*출처: https://m.blog.naver.com/jump_penguin/20193916878