Optimizing Oracle Optimizer (2009년)
실행 계획 예측 0 0 94,196

by 구루비스터디 DBMS_XPLAN [2018.07.14]


DISPLAY

  • DISPLAY is generally used to display the execution plan produced
  • by an EXPLAIN PLAN command; you can either display the most
  • recent explained statement, or the statement for a specific statement id.
  • Display 는 일반적으로 explain plan command에 의해서 생성된 실행개획을 표시하는데 사용된다.
  • 마지막 사용된 문장과 statement id를 명시한 문장에 대하여 표시할 수 있다.


Display Table Function 함수설명


function display(table_name varchar2 default 'PLAN_TABLE',
         statement_id varchar2 default null,
         format varchar2 default 'TYPICAL',
         filter_preds varchar2 default null
         )


table_name
  • Execution plan이 저장되는 테이블을 지정한다.
  • Default는 "PLAN_TABLE"이다
  • 만약 NULL을 지정하면 해당 계정의 "PLAN_TABLE"을 의미한다.


statement_id
  • Explain plan 시 set Statement_id를 지정한 경우 사용할 수 있다.
  • Default는 NULL이다.
  • NULL인 경우 마지막 실행된 문장을 의미한다.
  • 또한 뒤에 나오는 "filter_preds" parameter 도 NULL이 된다.


format
  • 저장된 Plan을 어떻게 보여줄지 결정한다.
  • Default는 TYPICAL이다.
  • 매뉴얼에 공개되어 있는 포맷과 사용되기는 하나 매뉴얼에 없는 포멧이 존재한다.(함수안에 Define되어 있을듯 하다)
  • 포멧에 'ALL \-PROJECTION \-NOTE'와 같이 \-옵션을 주면 해당 내용을 제외하고 출력할 수 있다.
  • 또한 "BASIC ROWS" 기존포멧에 없는 경우 내용을 추가할 수 있다.


filter_preds:
  • 저장된 Plan에서 일부 Row 또는 Row Set을 제한하여 출력한다.
  • Default는 NULL이다.
  • 'plan_id = 10'
  • 'hash_value=76725 and snap_id=245'


Format

Basic

  • 실행계획의 단계별 Operation과 Object 이름만을 보여주는 기본적인 format



SQL>select * from table(dbms_xplan.display('plan_table',null,'basic'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------
Plan hash value: 2521935493

------------------------------------
| Id  | Operation         | Name   |
------------------------------------
|   0 | SELECT STATEMENT  |        |
|   1 |  TABLE ACCESS FULL| T_PLAN |
------------------------------------

8 개의 행이 선택되었습니다.

경   과: 00:00:00.04


Typical

  • 단계별 Operation과 Object 명, 예측 Row수와 Result Set의 크기(Bytes), Predicate 정보를 보여준다.



SQL>select * from table(dbms_xplan.display('plan_table',null,'typical'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------
Plan hash value: 2521935493

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        | 10000 | 90000 |     8   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T_PLAN | 10000 | 90000 |     8   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"='Many1')

13 개의 행이 선택되었습니다.

경   과: 00:00:00.06

SQL>set autotrace traceonly
SQL>
SQL>select col1, col2 from t_plan where col1 = 'Many1';

10000 개의 행이 선택되었습니다.

경   과: 00:00:00.28

Execution Plan
----------------------------------------------------------
Plan hash value: 2521935493

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        | 10000 | 90000 |     8   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T_PLAN | 10000 | 90000 |     8   (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"='Many1')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        711  consistent gets
          0  physical reads
          0  redo size
     174886  bytes sent via SQL*Net to client
       7726  bytes received via SQL*Net from client
        668  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      10000  rows processed

SQL>
SQL>set autotrace off


Serial


All

  • 단계별 Operation과 Object 명, 예측 Row수와 Result Set의 크기(Bytes), Predicate, Query Block, Column Projection 정보를 보여준다.



SQL>select * from table(dbms_xplan.display('plan_table',null,'all'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
Plan hash value: 2991289126

--------------------------------------------------------------------------------------------
| Id  | Operation                     | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |            |     1 |    33 |     2   (0)| 00:00:01 |
|*  1 |  VIEW                         |            |     1 |    33 |     2   (0)| 00:00:01 |
|   2 |   COUNT                       |            |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID| T_PLAN     |     1 |     9 |     2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | T_PLAN_IDX |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SUB / from$_subquery$_001@MAIN
   2 - SUB
   3 - SUB / T_PLAN@SUB
   4 - SUB / T_PLAN@SUB

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL2"<=200)
   4 - access("COL1"='Many2')

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "from$_subquery$_001"."COL1"[VARCHAR2,10], "COL2"[NUMBER,22],
       "from$_subquery$_001"."RN"[NUMBER,22]
   2 - "COL1"[VARCHAR2,10], "COL2"[NUMBER,22], ROWNUM[4]
   3 - "COL1"[VARCHAR2,10], "COL2"[NUMBER,22]
   4 - "T_PLAN".ROWID[ROWID,10], "COL1"[VARCHAR2,10]

34 개의 행이 선택되었습니다.

경   과: 00:00:00.20
SQL>


Outline


  • Typical format에 실행계획을 수립하는데 필요한 Hint들의 목록을 추가적으로 제공한다.
  • 특정 실행계획을 재현하기 위한 용도로 사용가능하다.



SQL>select * from table(dbms_xplan.display('plan_table',null,'outline'));

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 2521935493

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        | 10000 | 90000 |     8   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T_PLAN | 10000 | 90000 |     8   (0)| 00:00:01 |
----------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "T_PLAN"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"='Many1')

25 개의 행이 선택되었습니다.

경   과: 00:00:00.82

  • Outline의 힌트를 확인하고 이를 이용하여 실행계획을 핸들링할 수 도 있다.


Advanced

  • All format과 Outline format을 합친 내용과 같다.



SQL>select * from table(dbms_xplan.display('plan_table',null,'advanced'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
Plan hash value: 2521935493

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        | 10000 | 90000 |     8   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T_PLAN | 10000 | 90000 |     8   (0)| 00:00:01 |
----------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / T_PLAN@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      FULL(@"SEL$1" "T_PLAN"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"='Many1')

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "COL1"[VARCHAR2,10], "COL2"[NUMBER,22]

35 개의 행이 선택되었습니다.

경   과: 00:00:00.14

"데이터베이스 스터디모임" 에서 2009년에 "OPTIMIZING ORACLE OPTIMIZER " 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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