반응형

-- 튜닝 수업 환경 설정

(대소문자 구분을 끄기위해서 설정)

alter system set sec_case_sensitive_logon=FALSE;

 

ALTER USER SYSTEM IDENTIFIED BY MANAGER;

DROP USER SCOTT CASCADE;

 

CREATE USER SCOTT IDENTIFIED BY TIGER

 

GRANT CONNECT,RESOURCE,DBA TO SCOTT;

 ( pfile일 경우 spfile로 변경 )

 

1. 대용량 샘플 dmp 파일 imp 수행

 

[oracle@localhost ~]$ imp system/MANAGER full=y file=NEW_SCOTT_10.DMP;

 

-- imp 확인 (20table)

SELECT * FROM DBA_TABLES

WHERE OWNER='SCOTT';

 

20 rows selected.

 

-- public synonym 제공

select 'create public synonym '||TABLE_NAME||' for '||OWNER||'.'||TABLE_NAME||';'

from dba_tables

where owner='SCOTT';

 

EXPLAIN PLAN 명령어

 

SQL문의 실행계획과 상태 값을 제공하는 명령어

 

1) 옵티마이저의 유형 (공식기반 또는 비용기반)

2) 옵티마이저에 의해 결정된 실행 계획

3) 실행 계획의 선택 기준(비용계싼 결과 등)

4) SQL문을 실행하면서 사용한 DB구조의 상태 값

- 사용된 데이터버퍼 캐시 블록 수

- 데이터 파일로부터 읽은 블록 수

- 네트워크를 통해 전송된 데이터의 바이트 수

- Sorting 작업 발생 시 사용된 메모리 블록 수

- 처리된 데이터 량

 

SET AUTOTRACE 명령어

 

PLAN_TABLE을 생성 후 한번만 설정해주면 SQL문이 실행될 때 마다 실행계획을 한 화면에 출력

 

 문법

SET AUTOTRACE [ ON | OFF | TRACE | TRACEONLY ]

- ON : SQL문의 실행 결과와 실행계획 그리고 통계정보를 보여주는 옵션

- OFF : 어떤 결과도 보여 주지 않음

- TRACEONLY : 실행계획과 통계정보 만을 보여줌

 

* 켜놨다면 사용후 OFF로 반드시 바꿔줘야함 (조회할때마다 뜨기때문에)

 

SQL> SET AUTOTRACE TRACEONLY;

SQL> SELECT * FROM DEPT;

*

아래부터 올라감

sorts (momory) : PGA ( PGA 사용하다 모자라면 TEMP로 넘어감 )

sorts (disk) : TEMP

 

V$SQL_PLAN

이미 실행된 SQL에 대한 실행계획을 참조할 경우 사용

Shared pool 영역에서 직접 추출된 실행 정보

영원히 보관할 수는 없음

SQL문의 HASH_VALUEADDRESS값을 알아야 함

   => V$SQL, V$SQLAREA에서 참조

-- hash_value, address 찾기

select sql_text

, hash_value

, address

from v$sqlarea

where upper(sql_text) like '%DEPT%'

 

 

 

 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;

 

 

결과 분석 (Execution Plan)

SQL> set autotrace traceonly

SQL> select empno, ename, job, sal, dname

from emp, dept

where emp.deptno = dept.deptno;

 

 

SQL> CREATE INDEX DEPTNO_IDX ON EMP(DEPTNO);

= > 다시조회 해도 full scan

* 인덱스를 만들어도 데이터량이 적어서 풀스캔하게됨

 

-- INDEX를 타도록 Hint 설정

select /*+index(emp DEPTNO_IDX) */

empno, ename, job, sal, dname

from emp, dept

where emp.deptno=dept.deptno;

 

 

 

 

 

1) Parsing 단계에서 Data Dictionary로 부터 얻는 테이블의 상태정보 및 통계정보를 참조하기 위해 읽는 블록 수

* 다시 조회하면 줄어듬

2) DML 문이 실행될 때 발생하는 변경 전 데이터를 잠시 저장하기 위한 임시공간

3) SQL문이 실행될 때 디스크 상에 존재하는 테이블 및 인덱스를 저장하기 위한 메모리공간

* 가장 눈여겨 봐야할 튜닝 Point!

4) 데이터가 실제로 존재하는 디스크 상의 데이터 파일로부터 읽혀진 데이터 블록 수

* 다시 조회하면 줄어듬

5) DML문을 실행했을 때 변경 전 데이터와 변경 후 데이터를 로그버퍼 영역에 백업하기 위한 블록 수

6) 클라이언트와 서버 간의 전송된 데이터를 나타냄

* 튜닝 Point가 아님

7) sorting 작업을 위해 사용한 PGA 공간

* sorts (momory) : PGA ( PGA 사용하다 모자라면 TEMP로 넘어감 )

8) sorting 작업을 위해 사용한 TEMP 사용 공간

* sorts (disk) : TEMP

==> 7,8 번이 둘다 많을시 시스템 튜닝을 고려

9) SQL문이 실행된 후 조건을 만족하는 행의 수

* 튜닝 Point가 아님

 

 

 

 

 

※ Update문 기본 튜닝

-- BIG_EMP에도 있는 사원은 COMMSAL에 더해서 LARGE_EMPSALUPDATE 하려고 한다.

-- (SQL구문을 튜닝해서 더 효과적으로 만들기)

 

(튜닝 전)

update large_emp a

set a.sal = ( select b.comm + a.sal

from big_emp b

where b.empno=a.empno);

(튜닝 후)

update large_emp a

set a.sal = a.sal + (select b.comm

from big_emp b

where b.empno=a.empno);

 

 

* consistent gets 천만건 정도 차이나는걸 볼 수 있다

 더 좋은 효과를 위해선 index를 걸어주면 1/4로 주는 걸 볼 수 있다.

'Study Note > Database' 카테고리의 다른 글

SQL*TRACE  (0) 2016.02.16
DBMS_XPLAN.DISPLAY 다량데이터 조회시 참고사항  (0) 2016.02.16
DDL  (0) 2016.02.04
DML  (0) 2016.02.04
[Tool] Orange Character Set 설정하기  (0) 2016.02.04

+ Recent posts