4.11 메모리 관리

메모리는 중요하다.

  • CBQT가 발생되면 Logical Optimizer는 Cost Estimator에게 수많은 쿼리블럭의 Costing을 요청해야한다.
  • 메모리 관리를 잘못하면 메모리 누수 현상으로 인해 최악의 경우 DBMS를 Shutdown해야 하는 사태에 이르게 된다.(ORA-4031)
  • 오라클은 이러한 사태를 막기위해 Sub Heap이라는 메모리 공간을 미리 예약하고 Costing 시에 사용
    ※ Heap과 Sub Heap에 대한 내용은 Data Structure책을 참조

관련 파라미터

  • _optimizer_use_subheap(Default:True) : Logical Optimizer가 Cost Estimator를 Call 할 때 할당되는 메모리 공간(Sub Heap)을 사용할 것인지 아닌지를 제어하는 것
False : Physical Optimization이 발생될 때마다 Sub Heap을 사용할 수 없으므로 심각한 상태가 발생할 수 있다.
10053 Trace에서 Sub Heap과 관련된 내용을 찾을 수 없다.
이 메모리 공간은 CBQT가 수행되어 Costing이 발생한 모든 곳에 사용된다.
{code:SQL
title= 0. 예제borderStyle=solid}
SElECT /* + QB_NAME(MAIN_VIEW) */
e1.emp1oyee_id, e1.manager_id, e1.sa1ary
FROM employee e1
WHERE e1.department_id = 10
AND (e1.manager_id, e1.sa1ary) IN (SELECT /*+ QB NAME(SUBQ) */
e2.manager_id, MAX(e2.sa1ary)
FPOM employee e2
GFOUP BY e2.manager_id)
AND ROWNUM 1;
{code}
{code:SQL
title= traceborderStyle=solid}
*****************************
Cost-Based Subquery Unnesting
*****************************
SU: Using search type: exhaustive
SU: Starting iteration 1, state space = (2) : (1)
Registered qb: SEL$AA0D0E02 0x10a4fb98 (SUBQ INTO VIEW FOR COMPLEX UNNEST SUBQ)





-
QUERY BLOCK SIGNATURE





-
signature (): qb_name=SEL$024CEEEB nbfros=2 flg=0
fro(0): flg=0 objn=459680 hint_alias="E1"@"MAIN_VIEW"
fro(1): flg=5 objn=0 hint_alias="VW_NSO_1"@"SEL$024CEEEB"
SU: Costing transformed query.
kkoqbc: optimizing query block SEL$024CEEEB (#1) --> 쿼리블럭명은 SEL$024CEEEB , cost Estimator 실행
...중간생략
kkoqbc-subheap (create addr=0x2b5e14473bf8) --> subbeap 사용 메모리공간할당받음
kkoqbc-subheap (delete addr=0x2b5e14473bf8, in-use=32424, alloc=38064) --> subbeap 사용 메모리공간초기화
kkoqbc-end:
:
call(in-use=45288, alloc=98288), compile(in-use=184496, alloc=187944), execution(in-use=3544, alloc=4032)

kkoqbc: finish optimizing query block SEL$024CEEEB (#1)


* 오라클은 CBQT발생시 각각ㄱ의 Iteration수행 중에 새로운 쿼리블럭이 발생되면 SUB Heap을 사용하게 된다.
* _optimizer_use_subheap 파라미터 이외에도 여러가지 Sub Heap관련 파라미터가 존재한다.
ex. _optimizer_or_expansion_subheap = True(default), OR-Expansion 변환 시 할당되는 메모리 공간을 사용하게 된다.|