Optimizing Oracle Optimizer (2011년)
10053 Event 0 0 2,434

by 구루비스터디 Transformation 10053 Event [2018.07.14]


10053 Event

  • Oracle 10g R2 부터는 10053 Event에서 CBQT를 포함한 Transformation의 모든 과정이 기록된다.

select /*+ */
  sum(x), count(y), sum(z)
from
  (
  select /*+ qb_name(depth1) */
    x, y, z, push_key, max_value, sum_value
  from 
    (
    select /*+ qb_name(depth2) */
      *
    from
      (
      select /*+ qb_name(depth3) */
        *  
      from
        (
        select /*+ qb_name(depth4) */
          t1.c1 as x, t2.c2 as y, t3.c2 as z, t1.c2 as push_key, 
          max(t1.c3) as max_value,
          sum(t1.c3) as sum_value
        from
          t1, t2, t3
        where
          t1.c1 = t2.c1
          and t2.c1 = t3.c1 
        group by
          t1.c1, t2.c2, t3.c2, t1.c2
        order by
          t1.c1, t2.c2, t3.c2, t1.c2
        )
      )  
    ) 
  ) where push_key = 1
order by 1 

Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=1 Bytes=41)
   1    0   SORT (AGGREGATE) (Card=1 Bytes=41)
   2    1     VIEW (Cost=8 Card=1 Bytes=41)
   3    2       HASH (GROUP BY) (Cost=8 Card=1 Bytes=91)
   4    3         HASH JOIN (Cost=7 Card=1 Bytes=91)
   5    4           MERGE JOIN (CARTESIAN) (Cost=4 Card=1 Bytes=65)
   6    5             TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=2 Card=1 Bytes=39)
   7    5             BUFFER (SORT) (Cost=2 Card=1 Bytes=26)
   8    7               TABLE ACCESS (FULL) OF 'T3' (TABLE) (Cost=2 Card=1 Bytes=26)
   9    4           TABLE ACCESS (FULL) OF 'T2' (TABLE) (Cost=2 Card=1 Bytes=26)

access predicate 4 - "T1"."C1"="T2"."C1" AND "T2"."C1"="T3"."C1"
filter predicate 6 - "T1"."C2"=1


  • push_key = 1 조건이 안으로 Pushing 되었음


  • rownum 조건을 추가

select /*+ */
  sum(x), count(y), sum(z)
from
  (
  select /*+ qb_name(depth1) */
    x, y, z, push_key, max_value, sum_value, rownum as r
  from 
    (
    select /*+ qb_name(depth2) */
      *
    from
      (
      select /*+ qb_name(depth3) */
        *  
      from
        (
        select /*+ qb_name(depth4) */
          t1.c1 as x, t2.c2 as y, t3.c2 as z, t1.c2 as push_key, 
          max(t1.c3) as max_value,
          sum(t1.c3) as sum_value
        from
          t1, t2, t3
        where
          t1.c1 = t2.c1
          and t2.c1 = t3.c1 
        group by
          t1.c1, t2.c2, t3.c2, t1.c2
        order by
          t1.c1, t2.c2, t3.c2, t1.c2
        )
      )  
    ) 
  ) where push_key = 1
order by 1 

Execution Plan
--------------------------------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=1 Bytes=52)
   1    0   SORT (AGGREGATE) (Card=1 Bytes=52)
   2    1     VIEW (Cost=8 Card=1 Bytes=52)
   3    2       COUNT
   4    3         VIEW (Cost=8 Card=1 Bytes=52)
   5    4           SORT (GROUP BY) (Cost=8 Card=1 Bytes=91)
   6    5             HASH JOIN (Cost=7 Card=1 Bytes=91)
   7    6               MERGE JOIN (CARTESIAN) (Cost=4 Card=1 Bytes=65)
   8    7                 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=2 Card=1 Bytes=39)
   9    7                 BUFFER (SORT) (Cost=2 Card=1 Bytes=26)
  10    9                   TABLE ACCESS (FULL) OF 'T3' (TABLE) (Cost=2 Card=1 Bytes=26)
  11    6               TABLE ACCESS (FULL) OF 'T2' (TABLE) (Cost=2 Card=1 Bytes=26)

access predicate 6- "T1"."C1"="T2"."C1" AND "T2"."C1"="T3"."C1"

filter predicate 2- "PUSH_KEY"=1

  • Inline View가 다 처리된 후 마지막 단계에서 Push_key = 1 조건이 처리된다는 것을 알 수 있음


  • 10054 Event를 사용하여 추적

.....
CVM : CVM bypassed : ORDER BY Clause
CVM : CVM bypassed : Rownum Column

  • ORDER BY 와 rownum으로 때문에 Complex View Merging이 이루어지지 않은 것을 알 수 있음



**************************
Predicate Move-Around (PM)
**************************
PM: Considering Predicate move-around in SEL$1(#1).
PM: Checking validity of Predicate move-around
PM:   PM bypassed : Reference to ROWNUM
PM: passed validity check.


  • Simple Predicate Pushing(또는 Predicate Move-Around)를 시도했지만 실패했다는 것을 알 수 있음
"데이터베이스 스터디모임" 에서 2009년에 "OPTIMIZING ORACLE OPTIMIZER " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3941

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입