SQLP

[SQLP] 커서 공유

songsua 2024. 8. 15. 15:42

바인딩 변수 사용은 파싱의 횟수를 감소시키기 때문에 성능 개선이 된다.

이렇게 다른 쿼리들을 같은 실행계획으로 실행시키는 것을 '커서 공유' 라고 한다.

커서를 사용하는 순서는

1) 커서를 위한 메모리 공간 할당(PGA에 할당)

2) syntax, semantic check, privilege check 등

3) 바인드 변수 할당

4) 데이터를 어떻게 출력할 것인지 정의

5) 실행

6) 출력

--> 다른 사용자가 사용할 때도 동일한 실행 계획을 사용하겠다 

 

- 커서가 공유되어 사용되는 경우

부모 커서: SQL 명령문 그 자체를 보관한다.

자식 커서: 차이를 보관한다.

커서는 일반적으로 라이브러리 캐시에 저장되어 있는 SQL 명령문을 지칭한다. 

 

 

히스토그램

Table 형태의 값의 빈도를 그래픽으로 표현한 것

 

-종류

1) Frequency Histogram: 값의 Distinct Count 와 Bucket 의 수가 일치하는 경우

2) Height-Balanced Histogram : 값의 Distinct Count 가 Bucket의 수보다 많은 경우. 

값들을 적당한 Bucket 으로 분배한 뒤, 각 bucket에 같은 높이(전체 개수/Bucket 개수)를 할당한다.

3) Popular Value: 하나 이상의 Bucket 을 차지하는 값, 빈도가 매우 높은 값

4) Non popular value : 빈도가 낮아서 여러 개의 bucket 을 차지하지 못하고 다른 값들과 함께 공유하는 값들이다. 

예시)

#EMPLOYESS 테이블에서 DEPARTMENT_ID별로 정보들을 조회할려고 한다. DEPARTMENT_ID 별로 행의 개수를 출력하고 히스토그램을 생성해보자
SELECT department_id, count(*) from employees group by department_id order by count(*) Desc;

 

popular value 는 50 이고, non 은 70이다

질문) 그러면 카운트값이 1 이면 non 이라고 쳐도, 몇개 카운트부터 popular 라고 생각할 수 있는거야?

위의 예시로는 인덱스를 안타서 몇개 버킷을 사용하는지 안나온다;;

Plan hash value: 1741385034
 
---------------------------------------------------------------------------------
| Id  | Operation           | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |           |    11 |    33 |     5  (40)| 00:00:01 |
|   1 |  SORT ORDER BY      |           |    11 |    33 |     5  (40)| 00:00:01 |
|   2 |   HASH GROUP BY     |           |    11 |    33 |     5  (40)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMPLOYEES |   107 |   321 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------

 

Adaptive Cursor Sharing ★★객관식 출제

바인드 변수별로 새로운 커서를 만들지 않으면서 모든 쿼리에 대해서 같은 커서를 만들지 않는 것이 목표이다.

값의 변화를 고려해서 특정 실행 계획을 수행하다가, 만약 통계값이 변화가 있을 경우, 선택적으로 변화를 준다.

※ 특정 disk i/o 발생 시, 다른 실행계획을 추가 생성하여 히스토그램에 따라 실행 계획을 선택적으로 실행한다.

- Adaptive Cursor Sharing을 실행할려면 
1) 옵티마이저가 실행계획이 달라질 것이라고 판단하면 해 당 커서를 bind sensitive 커서로 둔다

2) bind sensitive 커서에 해당하는 구문 실행 시, 성능이 크게 저하된 경우 커서를 bind aware 로 변경한다.

3) 이 상태가 되면 새로운 child 커서를 생성하고 새로운 실행계획을 저장한다. 선택도가 비슷한 커서는 동일 계획을 사용한다.

Bind sensitive: 처음에 들어간 커서

Bind aware : 성능이 저하된 커서  이를 child 커서로 변경한다.



'SQLP' 카테고리의 다른 글

[SQLP] 데이터베이스 call 과 네트워크 부하 ★★★★★  (0) 2024.08.17
[SQLP] 테이블 스페이스  (0) 2024.08.15
[SQLP]바인딩 변수  (0) 2024.08.14
[SQLP] 조인 수행 원리2  (0) 2024.08.13
[SQLP] 조인 수행 원리  (0) 2024.08.12