2013년 8월 13일 화요일

[ORACLEJAVA커뮤니티강좌]오라클 통계정보 해석하기 , SET AUTOTRACE 이용 하기

SET AUTOTRACE 이용 하기

SQL*Plus
에서 사용자는 자동으로 Optimizer에서 실행계획과 통계정보를 얻을 수 있습니다. 이런 경우  AUTOTRACE를 사용하며 DML문을 성공적으로 수행 시 만들어지며 DML문의 성능 튜닝을 위한 방법으로 자주 이용 됩니다.

SET AUTOTRACE
를 사용하기 위해선 실행 계획용 테이블(PLAN_TABLE)이 존재해야 하며 구문을 활성화 하기 위해 SET AUTOTRACE ON, 비활성화 하기위해 SET AUTOTRACE OFF하고 하면 됩니다. 참고로 SET AUTOTRACE에서 사용 할 수 있는 옵션은 다음과 같습니다.

SET AUTOTRACE OFF :
기본값으로 AUTOTRACE를 수행하지 않습니다.
SET AUTOTRACE ON EXPLAIN :
실행계획만을 출력
SET AUTOTRACE ON STATISTICS :
통계정보만을 출력
SET AUTOTRACE ON :
옵티마이저의 실행계획과 통계정보, 질의의 실행 결과를 함께 출력
SET AUTOTRACE TRACEONLY [EXPLAIN] : SET AUTOTRACE ON
과 유사하지만 옵티마이저의 실행계획과 통계정보를 출력, 만약 EXPAIN이라고 하면 실행계획만 출력 합니다.

SQL> conn / as sysdba
연결되었습니다.

SQL> @d:\app\A\product\11.2.0\dbhome_1\sqlplus\admin\plustrce.sql
SQL>
SQL> drop role plustrace;
drop role plustrace
          *
1
행에 오류:
ORA-01919:
'PLUSTRACE'()가 존재하지 않습니다


SQL> create role plustrace;
롤이 생성되었습니다.

SQL>
SQL> grant select on v_$sesstat to plustrace;
권한이 부여되었습니다.

SQL> grant select on v_$statname to plustrace;
권한이 부여되었습니다.

SQL> grant select on v_$session to plustrace;
권한이 부여되었습니다.

SQL> grant plustrace to dba with admin option;
권한이 부여되었습니다.

SQL>
SQL> set echo off

SQL> grant plustrace to scott;
권한이 부여되었습니다.

SQL> conn scott/tiger
연결되었습니다.

SQL> @d:\app\A\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlxplan.sql
테이블이 생성되었습니다.

여기 까지 하면 SQL*Plus에서 TRACE 하기위한 plustrace 롤을 SCOTT 이 부여 받았고 , 실행계획을 저장 할 테이블인 PLAN_TABLE도 생성된다.


/*
아래 set autotrace on SQL문이 실행될 때 마다 실행 계획과 통계정보, 그리고 SQL의 실행 결과까지 보기 위해서 입니다.

만약 set autotrace trace라고만 하면 실행 계획과 통계정보만 보여 줍니다.기능을 해제하기 위해서는 OFF라고 하면 됩니다.
*/
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
SQL>set autotrace trace   --쿼리 결과는 안 나온다.

SQL> select * from emp;
 
14 개의 행이 선택되었습니다.


Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1467  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed


SQL> set autotrace off   --trace 기능 해제

SQL> select count(*) from emp;

  COUNT(*)
----------
        14


SQL> set autotrace on; 

SQL> select deptno, min(sal) from emp
  2  group by deptno
  3  having min(sal) > (select min(sal) from emp
  4                       where deptno = 30)

  5  order by deptno;

    DEPTNO   MIN(SAL)
---------- ----------
        10       1300


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   FILTER
   2    1     SORT (GROUP BY)
   3    2       TABLE ACCESS (FULL) OF 'EMP'
   4    1     SORT (AGGREGATE)
   5    4       TABLE ACCESS (FULL) OF 'EMP'




Statistics
----------------------------------------------------------
        191  recursive calls  //
재귀호출의 횟수          
         5  db block gets //
현재의 블록이 요구된 횟수
(DML or SELECT FOR UPDATE등에 의한 current mode로 읽힌 블록 수)
         28  consistent gets //
한 블록에 대해 요구된 consistent read 횟수
(SELECT했을 때 읽기 일관성 모드로 읽힌 블록 수)
          7  physical reads //
디스크로부터 읽어들인 데이터 블록의 총 개수
          0  redo size 리두로그가 만들어진 크기(SIZE)
        448  bytes sent via SQL*Net to client //Client
에 보내진 바이트수
        503  bytes received via SQL*Net from client //client
로부터 받은 바이트 수
          2  SQL*Net roundtrips to/from client  //
클라이언트에 송/수신된 Net메시지 합계 수
          3  sorts (memory) //
메모리에서 일어난 소트의 수
         0  sorts (disk) //
디스트에서 일어나 소트의 수
       1  rows processed //
연산을 하는 동안 처리한 ROW의 수
    
재귀적 호출이란, 오라클은 내부 처리를 위한 테이블을 관리 하며 이 테이블을 변화 시킬 때 내부적인 SQL문장을 생성하는데 이를 재귀적인 호출이라고 합니다. 예를 들면 테이블의 존재나 권한의 체크 등을 위한 SQL

댓글 없음:

댓글 쓰기