2020년 7월 19일 일요일

오라클, SQL, 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> 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 TRACEONLY라고 해도 된다.

SQL> SET AUTOTRACE TRACEONLY

SQL> SET AUTOTRACE TRACE

SQL> SELECT * FROM MYEMP1;

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

경 과: 00:02:12.39

Execution Plan

----------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 10M| 629M| 25300 (2)| 00:05:04 |

| 1 | TABLE ACCESS FULL| MYEMP1 | 10M| 629M| 25300 (2)| 00:05:04 |

----------------------------------------------------------------------------

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

749456 consistent gets

91820 physical reads

0 redo size

815171348 bytes sent via SQL*Net to client

7333846 bytes received via SQL*Net from client

666668 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

10000002 rows processed

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

SQL> SELECT count(*) FROM myemp1;

COUNT(*)

----------

10000002

SQL> set autotrace on;

-- 부서별 급여의 최소값을 구하는데 그 최소값이 ‘1’번 부서의 급여최소값 보다 큰 부서 출력

SQL> SELECT DEPTNO, MIN(SAL)

FROM MYEMP1

GROUP BY DEPTNO

HAVING MIN(SAL) > (SELECT MIN(SAL) FROM MYEMP1

WHERE DEPTNO = '1');

D MIN(SAL)

- ----------

3 3

2 2

Execution Plan

------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 8 | 25954 (4)| 00:05:12 |

|* 1 | FILTER | | | | | |

| 2 | HASH GROUP BY | | 1 | 8 | 25954 (4)| 00:05:12 |

| 3 | TABLE ACCESS FULL| MYEMP1 | 10M| 76M| 25215 (1)| 00:05:03 |

| 4 | SORT AGGREGATE | | 1 | 8 | | |

|* 5 | TABLE ACCESS FULL| MYEMP1 | 2510K| 19M| 25229 (1)| 00:05:03 |

------------------------------------------------------------------------------

Statistics

----------------------------------------------------------

594 recursive calls

0 db block gets

183794 consistent gets

183640 physical reads

0 redo size

665 bytes sent via SQL*Net to client

520 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

11 sorts (memory)

0 sorts (disk)

2 rows processed

Statistics

----------------------------------------------------------

594 recursive calls //재귀호출의 횟수

0 db block gets //현재의 블록이 요구된 횟수

(DML or SELECT FOR UPDATE등에 의한 current mode로 읽힌 블록 수)

183794 consistent gets //한 블록에 대해 요구된 consistent read 횟수

(SELECT했을 때 읽기 일관성 모드로 읽힌 블록 수)

183640 physical reads //디스크로부터 읽어들인 데이터 블록의 총 개수

0 redo size 리두로그가 만들어진 크기(SIZE)

665 bytes sent via SQL*Net to client //Client에 보내진 바이트수

520 bytes received via SQL*Net from client //client로부터 받은 바이트 수

2 SQL*Net roundtrips to/from client //클라이언트에 송/수신된 Net메시지 합계 수

11 sorts (memory) //메모리에서 일어난 소트의 수

0 sorts (disk) //디스트에서 일어나 소트의 수

2 rows processed //연산을 하는 동안 처리한 ROW의 수

재귀적 호출이란, 오라클은 내부 처리를 위한 테이블을 관리 하며 이 테이블을 변화 시킬 때 내부적인 SQL문장을 생성하는데 이를 재귀적인 호출이라고 한다. 예를 들면 테이블의 존재나 권한의 체크 등을 위한 SQL등…

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...