오라클 데이터베이스 성능 튜닝.

Slides:



Advertisements
Similar presentations
Oracle DB 구조 및 트랜잭션 관리 이경화 Database 의 구조 Program Global Area (PGA) Instance Database Buffer Cache Redo Log Buffer Library Cache Shared.
Advertisements

1 Orange Part I WareValley. 2 Orange 기능 Development Tool Schema Browser Query Builder SQL Tool PL/SQL Tool Description Tool Table Editor Loader File Editor.
1 Orange Part II WareValley. 2 Loader Tool 3 Loader Tool 실행.
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL 언어 SQL.
제 3장 오라클 소개 오라클 소개 오라클 설치 방법 오라클 구조 제 3 장 오라클 개요.
Allow reverse scans allow reverse scnas. allow reverse scans allow reverse scnas.
DB2 Information Management DB2 UDB CLP Command Summary.
SQL Statement Tuning e-Architecture 팀 임성욱.
19.(코드+년도+월)별,(코드)별,전체총액을 한번에
Perfect! 대용량 데이터베이스 튜닝Ⅱ.
소리가 작으면 이어폰 사용 권장!.
데이터 모델링 방법론 2003년 03월.
DRIMS-Cloud 소개.
PL/SQL.
Analytic Function Analytic Function의 소개
데이터베이스 시스템.
SAP QUERY SAP R/3 4.6C.
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
관계 대수와 SQL.
대용량 데이터베이스 솔루션 발표자: 박보영 2007년 5월19일.
오라클 데이터베이스 성능 튜닝.
Database & Internet Computing Laboratory 한 양 대 학 교
박시우 ( 업무에 바로 쓰는 SQL 튜닝 박시우 (
제 5 장 인덱스 생성 및 관리.
Execution Plan의 수립 결과 SQL OPTIMIZER SQL해석 실행 계획 실행 수립 참조 참조 추출
SQL*Plus - Oracle ISQL -
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
AWR DB 보고서 분석.
7장 조인.
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
Toad for Oracle 설치 방법.
오라클 데이터베이스 성능 튜닝.
11장. 데이터베이스 서버 구축과 운영.
오라클 데이터베이스 성능 튜닝.
kHS 데이터베이스 테이블 및 인덱스 kHS.
2007. Database Term Project Team 2 윤형석, 김희용, 최현대 우경남, 이상제
14장 뷰.
SunnyKwak (sunnykwak.egloos.com) 2005년 2월 1일
6장. 물리적 데이터베이스 설계 물리적 데이터베이스 설계
4.2 SQL 개요 SQL 개요 SQL은 IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 1986년에 ANSI(미국 표준 기구)에서 SQL.
SQL Server 2000 세미나 Profiler를 이용한 문제해결
차례 튜닝 - 프로필러를 이용한 튜닝 프로필러 친해지기 프로필러 결과 테이블로 만들기 프로필러 결과 분석하기
제 17 장 (Oracle) 오라클에서 질의 최적화
뷰와 저장 프로시저 뷰의 개념을 이해한다. 뷰의 정의와 관리 방법을 이해한다. 뷰를 사용함으로써 생기는 장점을 알아본다.
SELECT empno, ename, job, sal, dname FROM emp, dept
3장 SQL*Plus 명령어.
9장 테이블 생성 및 변경, 삭제하기(DDL).
DP-ORA 쿼리 최적화 가이드 쿼리 최적화 방법 2014년 7월.
SQL.
YOU Youngseok 트랜잭션(Transaction) YOU Youngseok
강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
SQL Server 7.0 세미나 (Performance Tuning)
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
고급 T-SQL.
13장 무결성 제약조건.
정보처리기사 8조 신원철 양진원 유민호 이기목 김다연 윤현경 임수빈 조현진.
                              데이터베이스 프로그래밍 (소프트웨어 개발 트랙)                               퍼스널 오라클 9i 인스톨.
오라클 쿼리 문제 EMP (사원 테이블) DEPT (부서 테이블) 컬럼명 설명 EMPNO 사원번호 ENAME 사원명 JOB
기본적인 SELECT문 작성.
8장 테이블의 생성 및 변경 정인기.
15 사용자 권한 제어 데이터베이스 보안 권한 롤 동의어.
4.DECODE 함수를 이용한 IF 처리의 효율화
06. SQL 명지대학교 ICT 융합대학 김정호.
How I Approach Tuning a SQL Statement
뇌를 자극하는 Windows Server 장. 데이터베이스 서버.
Stored program 장종원
Presentation transcript:

오라클 데이터베이스 성능 튜닝

튜닝 도구 튜닝 도구 EXPLAIN PLAN DBMS_XPLAN AUTOTRACE V$SQL_PLAN SQL*TRACE TKPROF AWR

튜닝 도구 사용을 위한 실습 준비 실습용 계정 생성 및 권한 부여 scott 유저 생성 C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. 다음에 접속됨: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> CREATE USER SCOTT IDENTIFIED BY TIGER 2 DEFAULT TABLESPACE USERS 3 TEMPORARY TABLESPACE TEMP 4 QUOTA UNLIMITED ON USERS 5 ACCOUNT UNLOCK; 사용자가 생성되었습니다. SQL> GRANT CONNECT, RESOURCE TO SCOTT; 권한이 부여되었습니다. SQL>

튜닝 도구 사용을 위한 실습 준비 테스트용 데이터 생성 샘플 데이터 로드 -- NEW_SCOTT_10.DMP 파일을 C:\Documents and Settings\Administrator 디렉토리로 Copy 하세요 SQL> host Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\Documents and Settings\Administrator>imp system/oracle fromuser=scott touser=scott file=NEW_SCOTT_10.DMP log=scott_imp.log Import: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. 다음에 접속됨: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 엑스포트 파일은 규정 경로를 거쳐 EXPORT:V10.02.01 에 의해 생성되었습니다 KO16KSC5601 문자집합과 AL16UTF16 NCHAR 문자 집합에 임포트가 완성되었습니다 KO16MSWIN949 문자 집합을 사용해서 서버를 임포트합니다 (문자집합 변환이 가능합니다) KO16MSWIN949 문자 집합을 사용해서 클라이언트를 엑스포트합니다 (문자집합 변환이 가능합니다) . SCOTT 객체를 SCOTT(으)로 임포트하는 중입니다 IMP-00008: 엑스포트 파일에 인식할 수 없는 명령이 있습니다:

튜닝 도구 사용을 위한 실습 준비 테스트용 데이터 생성 샘플 데이터 로드 . . 테이블 "ACCOUNT"(를)을 임포트 중 28969 행이 임포트되었습니다 . . 테이블 "BIG_DEPT"(를)을 임포트 중 289 행이 임포트되었습니다 . . 테이블 "BIG_EMP"(를)을 임포트 중 28955 행이 임포트되었습니다 . . 테이블 "DEPT"(를)을 임포트 중 4 행이 임포트되었습니다 . . 테이블 "EMP"(를)을 임포트 중 14 행이 임포트되었습니다 . . 테이블 "LARGE_ACCOUNT"(를)을 임포트 중 460938 행이 임포트되었습니다 . . 테이블 "LARGE_DEPT"(를)을 임포트 중 289 행이 임포트되었습니다 . . 테이블 "LARGE_EMP"(를)을 임포트 중 1091410 행이 임포트되었습니다 . . 테이블 "PLAN_TABLE"(를)을 임포트 중 0 행이 임포트되었습니다 . . 테이블 "S_CHANGGO"(를)을 임포트 중 3 행이 임포트되었습니다 . . 테이블 "S_CHULHAJISI"(를)을 임포트 중 802095 행이 임포트되었습니다 . . 테이블 "S_GOGAEK"(를)을 임포트 중 378789 행이 임포트되었습니다 . . 테이블 "S_JAEGO"(를)을 임포트 중 274276 행이 임포트되었습니다 . . 테이블 "S_MAECHE"(를)을 임포트 중 140 행이 임포트되었습니다 . . 테이블 "S_PROMOTION"(를)을 임포트 중 1063 행이 임포트되었습니다 . . 테이블 "S_SANGPUM"(를)을 임포트 중 592 행이 임포트되었습니다 . . 테이블 "S_SPINOUT"(를)을 임포트 중 154673 행이 임포트되었습니다 . . 테이블 "S_SUJU"(를)을 임포트 중 827447 행이 임포트되었습니다 . . 테이블 "S_SUJU_DTL"(를)을 임포트 중 4136970 행이 임포트되었습니다 . . 테이블 "S_ZIPCODE"(를)을 임포트 중 49033 행이 임포트되었습니다 C:\Documents and Settings\Administrator>

튜닝 도구 사용을 위한 실습 준비 PLUSTRACE 설정 PLUSTRACE 설정 C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. 다음에 접속됨: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> show user USER은 "SYS"입니다 SQL> @C:\oracle\product\10.2.0\db_1\sqlplus\admin\plustrce.sql SQL> SQL> drop role plustrace; drop role plustrace * 1행에 오류: ORA-01919: 롤 'PLUSTRACE'(이)가 존재하지 않습니다 SQL> create role plustrace; 롤이 생성되었습니다.

튜닝 도구 사용을 위한 실습 준비 PLUSTRACE 설정 PLUSTRACE 설정 SQL> grant select on v_$sesstat to plustrace; 권한이 부여되었습니다. SQL> grant select on v_$statname to plustrace; SQL> grant select on v_$mystat to plustrace; SQL> grant plustrace to dba with admin option; SQL> SQL> set echo off SQL> GRANT PLUSTRACE TO SCOTT;

튜닝 도구 사용을 위한 실습 준비 Plan_table 생성 Plan_table 생성 SQL> conn scott/tiger 연결되었습니다. SQL> DROP TABLE PLAN_TABLE PURGE; 테이블이 삭제되었습니다. SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlxplan.sql 테이블이 생성되었습니다.

튜닝 도구 사용을 위한 실습 준비 Plan_table 생성 Plan_table 구조 SQL> DESC PLAN_TABLE 이름 널? 유형 ----------------------------------------------------------------- -------- -------------- STATEMENT_ID VARCHAR2(30) PLAN_ID NUMBER TIMESTAMP DATE REMARKS VARCHAR2(4000) OPERATION VARCHAR2(30) OPTIONS VARCHAR2(255) OBJECT_NODE VARCHAR2(128) OBJECT_OWNER VARCHAR2(30) OBJECT_NAME VARCHAR2(30) OBJECT_ALIAS VARCHAR2(65) OBJECT_INSTANCE NUMBER(38) OBJECT_TYPE VARCHAR2(30) OPTIMIZER VARCHAR2(255) SEARCH_COLUMNS NUMBER ID NUMBER(38) PARENT_ID NUMBER(38) DEPTH NUMBER(38) POSITION NUMBER(38) COST NUMBER(38) CARDINALITY NUMBER(38) BYTES NUMBER(38) OTHER_TAG VARCHAR2(255) PARTITION_START VARCHAR2(255) PARTITION_STOP VARCHAR2(255) PARTITION_ID NUMBER(38) OTHER LONG DISTRIBUTION VARCHAR2(30) CPU_COST NUMBER(38) IO_COST NUMBER(38) TEMP_SPACE NUMBER(38) ACCESS_PREDICATES VARCHAR2(4000) FILTER_PREDICATES VARCHAR2(4000) PROJECTION VARCHAR2(4000) TIME NUMBER(38) QBLOCK_NAME VARCHAR2(30) OTHER_XML CLOB

튜닝 도구 EXPLAIN PLAN EXPLAIN PLAN 사용법 EXPLAIN PLAN SET STATEMENT_ID = ‘이름’ FOR [분석 대상 SQL] 출력 예 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 28955 | 1131K| 41 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| BIG_EMP | 28955 | 1131K| 41 (0)| 00:00:01 | ----------------------------------------------------------------------------- 8 개의 행이 선택되었습니다.

튜닝 도구 EXPLAIN PLAN EXPLAIN PLAN 사용시 확인되는 정보 옵티마이저의 유형 생성된 실행계획 COST 정보 실행시에 필요한 여러 리소스에 대한 정보

튜닝 도구 EXPLAIN PLAN explain plan 사용 실습 SQL> explain plan 2 set statement_id='test' 3 into plan_table 4 for 5 select * from big_emp; 해석되었습니다. -- 마지막 실행된 explain plan을 자동으로 분석해 줌 SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlxpls.sql PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 28955 | 1131K| 41 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| BIG_EMP | 28955 | 1131K| 41 (0)| 00:00:01 | 8 개의 행이 선택되었습니다. SQL>

튜닝 도구 EXPLAIN PLAN PLAN_TABLE을 직접 조회하는 방법 SQL> SET LINESIZE 120 SQL> COL OPERATION FOR A50 SQL> COL OPTIONS FOR A20 SQL> COL OBJECT_NAME FOR A10 SQL> SELECT LPAD(' ', 2 * LEVEL) || OPERATION || DECODE(ID, 0, ' Cost=' || POSITION) OPERATION 2 ,OPTIONS 3 ,OBJECT_NAME 4 FROM PLAN_TABLE 5 CONNECT BY PRIOR ID = PARENT_ID 6 START WITH ID = 0 7 ORDER BY ID; OPERATION OPTIONS OBJECT_NAM -------------------------------------------------- -------------------- ---------- SELECT STATEMENT Cost=41 TABLE ACCESS FULL BIG_EMP SQL>

튜닝 도구 EXPLAIN PLAN DBMS_XPLAN을 사용하는 방법 select plan_table_output from table(dbms_xplan.display('plan_table','DB1')); 출력 예 PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 294 | 11760 | 41 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 294 | 11760 | 41 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- PLAN_TABLE_OUTPUT 1 - filter("DEPTNO"=10) 13 개의 행이 선택되었습니다. SQL>

튜닝 도구 DBMS_XPLAN DBMS_XPLAN을 사용하는 실습 SQL> select plan_table_output from table(dbms_xplan.display('plan_table','test')); PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 294 | 11760 | 41 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 294 | 11760 | 41 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) 13 개의 행이 선택되었습니다. SQL>

튜닝 도구 테스트 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'DB1' 3 FOR 4 SELECT * 5 FROM BIG_EMP 6 WHERE DEPTNO = 10; 해석되었습니다. SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlxpls.sql PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 294 | 11760 | 41 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 294 | 11760 | 41 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) 13 개의 행이 선택되었습니다. SQL>

튜닝 도구 테스트 SQL> SET LINESIZE 120 SQL> COL OPERATION FOR A50 SQL> COL OPTIONS FOR A20 SQL> COL OBJECT_NAME FOR A10 SQL> SELECT LPAD(' ', 2 * LEVEL) || OPERATION || DECODE(ID, 0, ' Cost=' || POSITION) OPERATION 2 ,OPTIONS 3 ,OBJECT_NAME 4 FROM PLAN_TABLE 5 WHERE STATEMENT_ID = 'DB1' 6 CONNECT BY PRIOR ID = PARENT_ID 7 START WITH ID = 0 8 ORDER BY ID; OPERATION OPTIONS OBJECT_NAM -------------------------------------------------- -------------------- ---------- SELECT STATEMENT Cost=41 TABLE ACCESS FULL BIG_EMP SQL>

튜닝 도구 테스트 SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'DB1')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 294 | 11760 | 41 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 294 | 11760 | 41 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) 13 개의 행이 선택되었습니다.

튜닝 도구 테스트 -- 인덱스 생성 후의 변경 실행계획 SQL> CREATE INDEX I_BIG_EMP_EMPNO 2 ON BIG_EMP(DEPTNO); 인덱스가 생성되었습니다. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'DB2' 3 FOR 4 SELECT * 5 FROM BIG_EMP 6 WHERE DEPTNO = 10; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'DB2')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 294 | 11760 | 41 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 294 | 11760 | 41 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) 13 개의 행이 선택되었습니다. SQL>

튜닝 도구 테스트 SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'DB3' 3 FOR 4 SELECT /*+ INDEX(BIG_EMP I_BIG_EMP_EMPNO) */ 5 * 6 FROM BIG_EMP 7 WHERE DEPTNO = 10; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'DB3')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Plan hash value: 809045272 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 5336 | 208K| 943 (0)| 00:00:12 | | 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 5336 | 208K| 943 (0)| 00:00:12 | |* 2 | INDEX RANGE SCAN | I_BIG_EMP_EMPNO | 5336 | | 11 (0)| 00:00:01 | Predicate Information (identified by operation id): 2 - access("DEPTNO"=10) 14 개의 행이 선택되었습니다. SQL>

튜닝 도구 AUTOTRACE AUTOTRACE 사용 방법 autotrace 명령어는 SQL*PLUS의 환경 설정 명령어임 SQL*PLUS 상에서 SET 명령어를 통해 설정 가능함 SET AUTOTRACE [ ON | OFF | TRACE{ONLY}] 명령어를 통해 설정 가능함 출력 예 Execution Plan ---------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 5336 | 208K| 42 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 5336 | 208K| 42 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) Statistics 1 recursive calls 0 db block gets 539 consistent gets 0 physical reads 0 redo size 256694 bytes sent via SQL*Net to client 4290 bytes received via SQL*Net from client 357 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 5336 rows processed

튜닝 도구 AUTOTRACE AUTOTRACE을 사용하는 실습 SQL> SET AUTOTRACE TRACEONLY SQL> SELECT * 2 FROM BIG_EMP 3 WHERE DEPTNO = 10; 5336 개의 행이 선택되었습니다. Execution Plan ---------------------------------------------------------- Plan hash value: 3814977537 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 5336 | 208K| 42 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| BIG_EMP | 5336 | 208K| 42 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DEPTNO"=10) Statistics 1 recursive calls 0 db block gets 539 consistent gets 0 physical reads 0 redo size 256694 bytes sent via SQL*Net to client 4290 bytes received via SQL*Net from client 357 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 5336 rows processed SQL>

튜닝 도구 AUTOTRACE AUTOTRACE을 사용하는 실습 SQL> SELECT /*+ INDEX(BIG_EMP I_BIG_EMP_EMPNO) */ 2 * 3 FROM BIG_EMP 4 WHERE DEPTNO = 10; 5336 개의 행이 선택되었습니다. Execution Plan ---------------------------------------------------------- Plan hash value: 809045272 ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 5336 | 208K| 943 (0)| 00:00:12 | | 1 | TABLE ACCESS BY INDEX ROWID| BIG_EMP | 5336 | 208K| 943 (0)| 00:00:12 | |* 2 | INDEX RANGE SCAN | I_BIG_EMP_EMPNO | 5336 | | 11 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("DEPTNO"=10) Statistics 1 recursive calls 0 db block gets 893 consistent gets 0 physical reads 0 redo size 282338 bytes sent via SQL*Net to client 4290 bytes received via SQL*Net from client 357 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 5336 rows processed SQL>

튜닝 도구 V$SQL_PLAN V$SQL_PLAN 오라클의 Data Dictionary 중에 하나임 오라클의 SGA 영역 중 Shared Pool 메모리에 저장된 SQL에 관한 정보임 V$SQL_PLAN을 활용하는 SQL SELECT ID ,LPAD(' ', DEPTH) || OPERATION OPERATION ,OPTIONS ,OBJECT_NAME ,OPTIMIZER ,COST FROM V$SQL_PLAN WHERE HASH_VALUE = &1 AND ADDRESS = '&2' START WITH ID = 0 CONNECT BY (PRIOR ID = PARENT_ID AND PRIOR HASH_VALUE = HASH_VALUE AND PRIOR CHILD_NUMBER = CHILD_NUMBER) ORDER SIBLINGS BY ID, POSITION;

튜닝 도구 V$SQL_PLAN V$SQL_PLAN을 사용한 실습 SQL> conn system/oracle 연결되었습니다. SQL> SELECT ADDRESS 2 ,HASH_VALUE 3 ,SUBSTR(SQL_TEXT,1,30) STATEMENT 4 FROM V$SQL 5 WHERE UPPER(SQL_TEXT) LIKE '%BIG_EMP%DEPT%'; ADDRESS HASH_VALUE STATEMENT -------- ---------- ------------------------------------------------ 6ACDB624 1558258734 SELECT /*+ INDEX(BIG_EMP I_BIG

튜닝 도구 V$SQL_PLAN V$SQL_PLAN을 사용한 실습 SQL> COL OPERATION FOR A30 SQL> COL OPTIONS FOR A30 SQL> COL OBJECT_NAME FOR A10 SQL> COL OPTIMIZER FOR A10 SQL> SELECT ID 2 ,LPAD(' ', DEPTH) || OPERATION OPERATION 3 ,OPTIONS 4 ,OBJECT_NAME 5 ,OPTIMIZER 6 ,COST 7 FROM V$SQL_PLAN 8 WHERE HASH_VALUE = &1 9 AND ADDRESS = '&2' 10 START WITH ID = 0 11 CONNECT BY (PRIOR ID = PARENT_ID 12 AND PRIOR HASH_VALUE = HASH_VALUE 13 AND PRIOR CHILD_NUMBER = CHILD_NUMBER) 14 ORDER SIBLINGS BY ID, POSITION; 1의 값을 입력하십시오: 1558258734 구 8: WHERE HASH_VALUE = &1 신 8: WHERE HASH_VALUE = 1558258734 2의 값을 입력하십시오: 6ACDB624 구 9: AND ADDRESS = '&2' 신 9: AND ADDRESS = '6ACDB624‘ ID OPERATION OPTIONS OBJECT_NAM OPTIMIZER COST --- -------------------- ----------------- ----------------- ---------- ---------- 0 SELECT STATEMENT ALL_ROWS 943 1 TABLE ACCESS BY INDEX ROWID BIG_EMP 943 2 INDEX RANGE SCAN I_BIG_EMP_EMPNO 11 SQL> show user USER은 "SYSTEM"입니다 SQL>

튜닝 도구 결과 분석 각 도구를 사용한 분석 SQL> CONN SCOTT/TIGER 연결되었습니다. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID = 'ANAL2' 3 FOR 4 SELECT EMPNO 5 ,ENAME 6 ,JOB 7 ,SAL 8 ,DNAME 9 FROM EMP E 10 ,DEPT D 11 WHERE E.DEPTNO = D.DEPTNO 12 AND E.EMPNO = 7369; 해석되었습니다. SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'ANAL2')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Plan hash value: 1123238657 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 38 | 5 (20)| 00:00:01 | |* 1 | HASH JOIN | | 1 | 38 | 5 (20)| 00:00:01 | |* 2 | TABLE ACCESS FULL| EMP | 1 | 25 | 2 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| DEPT | 4 | 52 | 2 (0)| 00:00:01 |

튜닝 도구 결과 분석 각 도구를 사용한 분석 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("E"."DEPTNO"="D"."DEPTNO") 2 - filter("E"."EMPNO"=7369) 16 개의 행이 선택되었습니다. SQL> CREATE UNIQUE INDEX PK_EMP ON EMP(EMPNO); 인덱스가 생성되었습니다. SQL> ALTER TABLE EMP 2 ADD CONSTRAINT PK_EMP PRIMARY KEY(EMPNO) 3 USING INDEX; 테이블이 변경되었습니다. SQL> CREATE UNIQUE INDEX PK_DEPT ON DEPT(DEPTNO); SQL> ALTER TABLE DEPT 2 ADD CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO) SQL>

튜닝 도구 결과 분석 각 도구를 사용한 분석 SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'ANAL1')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------- Plan hash value: 2385808155 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 1 | 38 | 2 (0)| 00:00:01 | | 2 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 25 | 1 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:00:01 | | 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 52 | 1 (0)| 00:00:01 | |* 5 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("E"."EMPNO"=7369) 5 - access("E"."DEPTNO"="D"."DEPTNO") 18 개의 행이 선택되었습니다. SQL>

튜닝 도구 SQL*TRACE SQL*TRACE 사용시 확인되는 정보 옵티마이저의 유형 생성된 실행계획 COST 정보 실행시에 소모된 여러 리소스에 대한 정보 SQL 수행 과정(PARSE, EXECUTE, FETCH)의 각 과정에서 소모된 시간, Block 개수, 진행된 Row의 수 등의 실제 수행시의 정보를 제공함

튜닝 도구 SQL*TRACE SQL*TRACE 사용하기 위해 주로 설정하는 초기화 값 몇가지 Parameter 를 설정하여 더욱 안정되게 진행함 TIMED_STATISTICS, SQL_TRACE, USER_DUMP_DEST, MAX_DUMP_FILE_ SIZE 설정값 확인 및 TRACE 준비 SQL> CONN / AS SYSDBA 연결되었습니다. SQL> SHOW USER USER은 "SYS"입니다 SQL> SET LINESIZE 120 SQL> SHOW PARAMETER TIMED_STATISTICS NAME TYPE VALUE ------------------------------------ ---------------------- ------------------------------ timed_statistics boolean TRUE SQL> SHOW PARAMETER USER_DUMP_DEST ------------------------------------ ---------------------- ----------------------------------------- user_dump_dest string C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP SQL> GRANT ALTER SESSION TO SCOTT; 권한이 부여되었습니다. SQL>

튜닝 도구 SQL*TRACE SQL> CONN SCOTT/TIGER 연결되었습니다. SQL> ALTER SESSION SET SQL_TRACE = TRUE; 세션이 변경되었습니다. SQL> SELECT EMPNO 2 ,ENAME 3 ,JOB 4 ,SAL 5 ,DNAME 6 FROM EMP E 7 ,DEPT D 8 WHERE E.DEPTNO = D.DEPTNO 9 AND E.EMPNO = 7369; SQL> exit Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options에서 분리되었습니다. C:\Documents and Settings\Administrator>cd C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\UDUMP C:\oracle\product\10.2.0\admin\ORCL\udump>tkprof orcl_ora_26544.trc T26544.TKF SYS=NO TKPROF: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. C:\oracle\product\10.2.0\admin\ORCL\udump>

튜닝 도구 TKPROF SQL*TRACE를 통해서 생성된 RAW 트레이스 파일을 사람이 분석하기 용이한 Format으로 변경해 주는 Tool TKPROF를 통해서 분석된 내용 실행된 SQL문 구문분석 수행을 위한 CPU 시간 디스크로부터 읽은 Block 수 메모리로부터 읽은 Block 수 조건을 만족하는 Row 수 옵티마이저의 유형 분석된 실행 계획 실행계획의 비용 계산 결과

튜닝 도구 TKPROF 사용 문법 TKPROF [트레이스 파일명] [분석결과 파일명] [옵션] 옵션 OPTIONS 설 명 EXPLAIN=[table명] 실행계획 정보를 함께 보여 줌(해당 사용자에는 PLAN_TABLE이 생성되어 있어야 함 PRINT=n 트레이스 파일 내에 분석된 SQL 문의 수를 n 만큼 제한하여 출력할 때 사용 RECORD=[파일명] 트레이스 파일 내에 분석된 SQL문을 지정한 파일에 저장해 줌 SORT=[옵션] 트레이스 파일 내에 분석된 SQL 문장을 지정한 옵션에 의해 분류(Sorting)하여 출력함 SYS=[NO] 트레이스 파일 내에 생성된 SQL 문장 중에 오라클 서버가 내부적인 작업을 위해 실행한 SQL 문을 출력시 포함할지를 결정함

튜닝 도구 TKPROF TKPROF를 통해 분석된 파일의 내용 TKPROF: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. Trace file: orcl_ora_26544.trc Sort options: default ******************************************************************************** count = number of times OCI procedure was executed cpu = cpu time in seconds executing elapsed = elapsed time in seconds executing disk = number of physical reads of buffers from disk query = number of buffers gotten for consistent read current = number of buffers gotten in current mode (usually for update) rows = number of rows processed by the fetch or execute call ALTER SESSION SET SQL_TRACE = TRUE call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 0 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 total 1 0.00 0.00 0 0 0 0 Misses in library cache during parse: 0 Misses in library cache during execute: 1 Optimizer mode: ALL_ROWS Parsing user id: 62

튜닝 도구 TKPROF TKPROF를 통해 분석된 파일의 내용 SELECT EMPNO ,ENAME ,JOB ,SAL ,DNAME FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.EMPNO = 7369 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.00 0 0 0 0 Execute 1 0.01 0.00 0 0 0 0 Fetch 2 0.00 0.00 0 4 0 1 total 4 0.03 0.00 0 4 0 1 Misses in library cache during parse: 1 Optimizer mode: ALL_ROWS Parsing user id: 62 Rows Row Source Operation ------- --------------------------------------------------- 1 NESTED LOOPS (cr=4 pr=0 pw=0 time=134 us) 1 TABLE ACCESS BY INDEX ROWID EMP (cr=2 pr=0 pw=0 time=65 us) 1 INDEX UNIQUE SCAN PK_EMP (cr=1 pr=0 pw=0 time=31 us)(object id 56172) 1 TABLE ACCESS BY INDEX ROWID DEPT (cr=2 pr=0 pw=0 time=39 us) 1 INDEX UNIQUE SCAN PK_DEPT (cr=1 pr=0 pw=0 time=15 us)(object id 56173) ******************************************************************************** OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS Execute 2 0.01 0.00 0 0 0 0 total 5 0.03 0.00 0 4 0 1 Misses in library cache during execute: 1

튜닝 도구 TKPROF TKPROF를 통해 분석된 파일의 내용 OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 0 0.00 0.00 0 0 0 0 Execute 0 0.00 0.00 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 total 0 0.00 0.00 0 0 0 0 Misses in library cache during parse: 0 2 user SQL statements in session. 0 internal SQL statements in session. 2 SQL statements in session. ******************************************************************************** Trace file: orcl_ora_26544.trc Trace file compatibility: 10.01.00 Sort options: default 1 session in tracefile. 2 user SQL statements in trace file. 0 internal SQL statements in trace file. 2 SQL statements in trace file. 2 unique SQL statements in trace file. 51 lines in trace file. 5 elapsed seconds in trace file.

튜닝 도구 AWR AWR(Automatic Workload Repository)는 현재 시점의 오라클의 상태에 대한 정보를 Disk에 기록한 자료임 AWR의 특징 Default로 1시간에 한번씩 DB의 상태정보를 기록함 기록된 정보를 통해서 시간의 구간 별로 Report 출력이 가능함 성능 분석의 자료로 사용 가능함 Active Session 대한 샘플링 데이터에 대한 데이터도 기록함 Report 생성용 SQL Script를 오라클에서 제공함

튜닝 도구 AWR AWR Report 생성 C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN>sqlplus system/oracle SQL*Plus: Release 10.2.0.1.0 - Production on Copyright (c) 1982, 2005, Oracle. All rights reserved. 다음에 접속됨: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> @awrrpt.sql

튜닝 도구 AWR AWR Report 생성 생성된 HTML용 Report 확인