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= trace | borderStyle=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 변환 시 할당되는 메모리 공간을 사용하게 된다.|