jupid.tistory.com · 2015-01-22 · 2 part 1 개요 • dbms 시스템튜닝의목표 • dbms...

194
1 Oracle 9i &10g Oracle 9i &10g New features New features SQL & PL/SQL & DBMS Tuning SQL & PL/SQL & DBMS Tuning () 오픈메이드 컨설팅 오 동 규 책임 컨설턴트 Special Key Note Special Key Note

Upload: others

Post on 03-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

1

Oracle 9i &10g Oracle 9i &10g New featuresNew featuresSQL & PL/SQL & DBMS Tuning SQL & PL/SQL & DBMS Tuning

(주) 오픈메이드 컨설팅

오 동 규 책임 컨설턴트

Special Key NoteSpecial Key Note

Page 2: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

2

PART 1 개요• DBMS 시스템 튜닝의 목표

• DBMS 시스템 튜닝의 주체

• DBMS 시스템 튜닝의 순서

• DBMS 시스템 튜닝을 위한 기본사항

목차목차

PART 2 9i & 10g New features• ANSI SQL Join • Partition Outer Join • Rollup • Cube • Grouping Set • Multi Table Insert • Merge • With • Regular Expression • Model • Using Inline view In DML

• Array Processing • Using Returning Clause• Analytic Function• New Connect By Functionality• External Table• Partition New Features• User-Specified Quote Character Assignment• NLS_SORT• Bulk Bind Improvements• Sorted Hash Clusters• Nested table function

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

Page 3: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

3

목차목차

• 튜닝툴의 사용(explain plan, autotrace, tkprof, 실행계획의 이해 ) • sql 엑세스패턴

• sql 조인 패턴

• 서브쿼리를 이용한 데이터 연결

• Optimizer(구조, 작동방식 ANALYZE, DBMS_STAT)• Query Transform

> M-VIEW QUERY REWRITE> SUB QUERY UNNESTING> VIEW MERGING> PUSH PREDICATE> OR-EXPANSION> STAR QUERY TRANSFORMATION> Partition Pruning (이미 설명)> 10053 EVENT

• 부분범위처리

• BIND 변수를 사용하라.(예외사항) • IN 을 이용한 엑세스 효율화

• 제약조건이 PLAN 에 미치는 영향

• HINT

PART 4 SQL 튜닝

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

Page 4: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

4

PART 5 PL/SQL 튜닝• PL/SQL 을 쓰는이유. • 패키지의 사용의 당위성. • %TYPE 과 %ROWTYPE을 이용하라. • NATIVE COMPILER 의 사용. • DBMS_SHARED_POOL 의 사용

• 결과집합을 CLIENT 에 반환하는것은 REF CURSOR 를 사용하라.• BULK COLLECT. • FORALL• FORALL 및 BULK COLLECT 와의 연동

• DML 후의 SELECT 는 RETURNNING 절로 대체하라.• 인자를 대량으로 넘길때는 NOCOPY Hint 를 사용하라.• 대용량 데이터 처리 function 에서는 PARALLEL_ENABLE 힌트를 사용하라

• compile-time warnings• Pipelined Function

목차목차

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

DBA 1D

Page 5: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

5

PART 1 개요

> DBMS 시스템 튜닝의 목표

> DBMS 시스템 튜닝의 주체

> DBMS 시스템 튜닝의 순서

> DBMS 시스템 튜닝을 위한 기본사항

PART1 개요

Page 6: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

6

튜닝의 목표

> 구축 및 운영 System이 최적의 자원으로 최적의성능(시간/응답속도)을 발휘할 수 있도록 설계와 구현 응용시스템을조화롭게 유지 개선하는 기술

• 즉, 문제가 되는 요인을 조기에 발견하여 데이터베이스로부터 사용자가 만족할만한 정보를 얻게 하기 위해 정보시스템을 개발하고 유지하기 위한 것

> 시스템 종류에 따라 세부 목표가 다를수 있다• OLTP 에서는 동시사용자수의 최대화

• OLAP MART 에서는 Best Throughtput• DW 에서는 ETL 최적화

PART1 개요

Page 7: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

7

DBMS 시스템 튜닝의 주체

> 요구사항 분석가(Business Analyst)

> 데이터베이스 설계자(Database Designer)

> 응용 프로그램 개발자(Application Developer)

> 데이터베이스 관리자(Database Administrator)

> 소프트웨어/하드웨어 관리자(System Administrator)

PART1 개요

Page 8: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

8

DBMS 시스템 튜닝의 순서(효과가 큰순)

1. 비즈니스 튜닝실제적인 데이터베이스에서 일어나는 튜닝이 아니고 업무의 흐름에 대한 튜닝을 의미함. 불필요한 공정 등을 제거 함으로서 생산시간과 생산단가, 생산인력을 줄이는 것을 비즈니스튜닝이라고 한다.

2. 디자인 튜닝데이터베이스가 분석되고 설계되는 단계에서 만들어지는 데이터베이스의 논리적구조(테이블의 구조, 테이블의 크기, 인덱스 여부 및 종류 등)가 좋은 성능을 기대할 수 없게만들어진 경우의 튜닝을 의미함. 또는, 애플리케이션 프로그램이 개발될 때 프로그램이 좋은성능을 발휘할 수 있도록 만들어지지 못한 경우이다.

3. 애플리케이션 튜닝데이터베이스에서 사용자가 실행한 SQL문(SELECT, UPDATE, INSERT, DELETE)의실행원리와 실행방법을 제대로 모르고 사용한다면 좋은 성능은 기대할 수 없는 것임. 이러한SQL문을 분석하여 성능을 발휘할 수 있도록 조율하는 것을 애플리케이션 튜닝이라고 한다.

4. 서버 튜닝데이터베이스의 메모리 영역과 물리적 구조에 관해 튜닝하는 방법. 이러한 원리와마찬가지로 데이터베이스 메모리 영역의 크기가 처리하려고 하는 테이블의 데이터 크기보다작아서 성능이 저하되는 문제가 발생하는 경우에 메모리를 더 크게 할당해주게 되는데 이런문제를 조율하는 것을 서버튜닝이라고 한다.

5. 시스템 튜닝UNIX, 윈도우와 같은 운영체제에서 시스템의 성능향상을 위해 조율하는 방법을 의미함.

PART1 개요

Page 9: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

9

DBMS 시스템 튜닝을 위한 기본사항

> 모델 및 업무파악

> SQL, PL/SQL 에 정통

> 집합이론에 충실

> DBMS 구조 및 신기능(9i, 10g)

> 스키마 생성및 관리전략

> 옵티마이져 아키텍쳐 및 옵티마이져 에 영향을 미치는 Factor

> 조인 및 Acces 패턴

> 튜닝툴의 사용

PART1 개요

Page 10: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

10

PART 2 9i & 10g New features> ANSI SQL Join > Partition Outer Join > Rollup > Cube > Grouping Set > Multi Table Insert > Merge > With > Regular Expression > Model > Using Inline view In DML> Array Processing > Using Returning Clause> Analytic Function> New Connect By Functionality> External Table> Partition New Features> User-Specified Quote Character Assignment> NLS_SORT> Bulk Bind Improvements

> Sorted Hash Clusters> Nested Table Functions

PART 2 New features

Page 11: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

11

ANSI SQL Join(SQL 1999)

> JOIN TYPE (9i)• INNER : 두 테이블을 조인하여 양쪽에 모두 만족하는 결과를 반환 ( default )

> from emp e join dept d> on ( e.deptno= d.deptno )

• LEFT OUTER : INNER조인 결과와 왼쪽에 대응되지 않는 행들을 반환> (LEFT가 기준)> from emp e left outer join dept d> on ( e.deptno= d.deptno )

• RIGHT OUTER : INNER조인 결과와 오른쪽에 대응되지 않는 행들을 반환> (RIGHT가 기준)> from emp e right outer join dept d> on ( e.deptno= d.deptno )

• FULL OUTER : INNER, LEFT OUTER, RIGHT OUTER 결과를 모두 반환> 첫번째 집합을 기준으로 outer join을 한 다음, 두번째 집합을 기준으로 ANTI 조인을 한다.> from emp e full outer join dept d > on ( e.deptno= d.deptno )

• Cross Join , Natural Join , Using

PART 2 New features

Page 12: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

12

> 2.ON 절 :조인 컬럼들간의 조인 관계 및 조인하기 위한조건• Equal Join 이 아니더라도 상관없음• Example:SELECT p.name part_name, c.inv_class inv_classFROM part p JOIN inventory_class c ON ( p.unit_cost BETWEEN c.low_cost AND c.high_cost) ;

• 1. ON절에 Driving Table의 조건 있는 경우

select empno, ename, dname, d.deptnofrom emp_1 e right outer join dept d on ( e.deptno= d.deptno and d.deptno > 10 )

조건에 만족하지 않아도 드라이빙 집합에 참여하지만조인은 하지 않는다.

Rows Execution Plan------- --------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE15 NESTED LOOPS (OUTER)6 TABLE ACCESS (FULL) OF 'DEPT'

11 VIEW11 TABLE ACCESS (FULL) OF 'EMP_1'

ANSI SQL Join(SQL 1999) PART 2 New features

Page 13: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

13

> 2.ON 절

• 2. WHERE절에 Driving Table의 조건이 있는 경우

select empno, ename, dname, d.deptnofrom emp_1 e right outer join dept d on ( e.deptno= d.deptno )where d.deptno > 10

조건에 만족하지 않는건은결과에서 제외됨

Rows Execution Plan------- ---------------------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE14 HASH JOIN (OUTER)5 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'5 INDEX (RANGE SCAN) OF 'PK_DEPT' (UNIQUE)

15 TABLE ACCESS (FULL) OF 'EMP_1'

ANSI SQL Join(SQL 1999)PART 2 New features

Page 14: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

14

> 2.ON 절

• 3. ON절에 Drived Table 의 조건이 있는 경우

select empno, ename, dname, d.deptnofrom emp_1 e right outer join dept d on ( e.deptno= d.deptno and e.empno > 7600 )

조건에 만족하는 건만 조인한다

Rows Execution Plan------- ---------------------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE13 HASH JOIN (OUTER)6 TABLE ACCESS (FULL) OF 'DEPT'

11 TABLE ACCESS (BY INDEX ROWID) OF 'EMP_1'11 INDEX (RANGE SCAN) OF 'EMP_1_PK' (UNIQUE)

* ON절에 있는 조건을 만족하는 건을 추출 후 outer join을 하므로

e.empno is null 조건은 필요 없다

ANSI SQL Join(SQL 1999)PART 2 New features

Page 15: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

15

> 2.ON 절

• 4. WHERE절에 Drived Table 의 조건이 있는 경우

select empno, ename, dname, d.deptnofrom emp_1 e right outer join dept d on ( e.deptno= d.deptno ) where e.empno > 7600 or e.empno is null

조인한 후에 조건을 체크하므로empno is null조건이 있어야 한다.

Rows Execution Plan------- ---------------------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE13 FILTER17 HASH JOIN (OUTER)6 TABLE ACCESS (FULL) OF 'DEPT'

15 TABLE ACCESS (FULL) OF 'EMP_1'

• 결론

* Drived Table의 조건은 WHERE절 보다 ON절에 명시하는 것이 유리하다.

ANSI SQL Join(SQL 1999)PART 2 New features

Page 16: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

16

> Cross Join

• Cartesian Product와 같다.• 조인 방법은 힌트로 조정 가능하며, 플랜은 CROSS JOIN을 명시하지 않은

SQL과 같다. • select empno, ename, dname, dept.deptno

from emp cross join dept

• Plan :SELECT STATEMENT MERGE JOIN CARTESIAN

TABLE ACCESS FULLBUFFER SORTTABLE ACCESS FULL DEPT

ANSI SQL Join(SQL 1999)PART 2 New features

Page 17: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

17

> Natural Join

• 2개의 테이블에서 같은 이름을 가진 컬럼들로 euqal join을 한다. (동일 이름의컬럼이 여러 개 있을 경우, 모두 euqal join함)

• 조인키인 동일 컬럼들은 alias 사용할 수 없다.• 조인방법은 힌트 사용으로 조정가능하며, “Natural join” syntax 사용한

쿼리와 그렇지 않은 쿼리의 플랜은 동일하다.

• select empno, ename, dname, deptnofrom emp natural join dept

• Plan : SELECT STATEMENT Hint=CHOOSE NESTED LOOPS

TABLE ACCESS FULL EMPTABLE ACCESS BY INDEX ROWID DEPT

INDEX UNIQUE SCAN PK_DEPT 82

ANSI SQL Join(SQL 1999)PART 2 New features

Page 18: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

18

> Using 절

• 조인할 키를 지정하는 것으로, 2개의 테이블에 동일 컬럼 중에 조인할 키들을명시하면, 이 키들로 equal join한다.

• Natural join시 모든 동일 컬럼이 조인키가 아닐 때 사용한다.• Using에 사용된 동일 컬럼은 alias와 같이 사용할 수 없다.• NATURAL JOIN과 같이 사용할 수 없다.

SELECT p.name, pt.name, product_type_idFROM products p INNER JOIN product_types pt USING (product_type_id);

ANSI SQL Join(SQL 1999)PART 2 New features

Page 19: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

19

Partition Outer Join(10g)

> 개념• 년별 또는 월별 집계 데이터를 나타낼때 특정년

혹은 특정월에 데이터가 없더라도 생성하여 나타냄.• 주로 OLAP 에서 많이 활용함

테이블 구조Select yymmFrom Year_monthWhere yymm = ‘2002’

Select deptno, yymm, sale_amtfrom dept_sale_history

요구사항

PART 2 New features

Page 20: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

20

1. 부서번호별로 빠진 년월을 생성

SELECT e.deptno, m.yymm, NVL(e.sale_amt,0)FROM year_month m LEFT OUTER JOIN dept_sale_history e

PARTITION BY (e.deptno) ON (m.yymm = e.yymm )WHERE m.yymm like '2002%‘;

2. 기존방식SELECT e.deptno, m.yymm, NVL(e.sale_amt,0)FROM year_month m LEFT OUTER JOIN dept_sale_history e

ON (m.yymm = e.yymm AND e.DEPTNO = 10)WHERE m.yymm like '2002%‘Union allSELECT e.deptno, m.yymm, NVL(e.sale_amt,0)FROM year_month m LEFT OUTER JOIN dept_sale_history e

ON (m.yymm = e.yymm AND e.DEPTNO = 20)WHERE m.yymm like '2002%‘

;

해결방법

Partition Outer Join(10g)PART 2 New features

Page 21: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

21

Rollup

> Rollup Basic(8i) select deptno, job, class, sum(sal) from emp group by rollup(deptno, job, class)

> 기존방식select deptno, job, class, sum(sal)from empgroup by deptno, job, classunion allselect deptno, job, null, sum(sal)from empgroup by deptno, jobunion allselect deptno, null, null, sum(sal)from empgroup by deptnounion allselect null, null, null, sum(sal)from emp;

:n+1 LEVEL의 SUBTOTAL생성

> 1.Composite rollup (9i) select deptno, job, class, sum(sal) from emp group by rollup( (deptno, job), class) ;

*(deptno, job) 을 한컬럼처럼 처리함.

> 2. 기존방식select deptno, job, class, sum(sal)from empgroup by deptno, job, classunion allselect deptno, job, null, sum(sal)from empgroup by deptno, jobunion allselect null, null, null, sum(sal)from emp;

PART 2 New features

Page 22: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

22

select deptno, job, class, sum(sal) from emp group by rollup(deptno, job, class)

select deptno, job, class, sum(sal) from emp group by rollup( (deptno, job), class)

RollupPART 2 New features

Page 23: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

23

select deptno, job, class, sum(sal)from empgroup by rollup(deptno, job), rollup(class)

> 해석 group by rollup(deptno,job) union all group by class , deptno,job union all group by class , deptno union all group by class

select deptno, job, class, sum(sal)from empgroup by rollup(deptno), rollup( job, class)

> 해석 group by rollup( job, class) union all group by deptno, job, class union all group by deptno, job union all group by deptno

Concatenated Groupings(9i)RollupPART 2 New features

Page 24: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

24

Cube> 특징

• group by 절의 컬럼에 대해 모든 가능한 조합생성

• group by 절의 컬럼의 수가 n 이라면, 2n LEVEL의 SUBTOTAL를 생성

> 사용법

SELECT deptno, job, COUNT (*) cnt FROM emp GROUP BY CUBE (deptno, job)

:group by 절의 컬럼에 대해 모든 가능한 조합생성

> 해석

GROUP BY deptno, job Union all GROUP BY deptno Union all GROUP BY job Union all Group by null

PART 2 New features

Page 25: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

25

Cube

> 결과

:group by 절의 컬럼에 대해 모든 가능한 조합생성

DNAME JOB Total CNTACCOUNTING MANAGER 1

ACCOUNTING PRESIDENT 1

ACCOUNTING All Jobs 2

RESEARCH ANALYST 2

RESEARCH CLERK 2

RESEARCH MANAGER 1

RESEARCH All Jobs 5

SALES CLERK 1

SALES MANAGER 1

SALES SALESMAN 4

SALES All Jobs 6

OPERATIONS CLERK 1

OPERATIONS All Jobs 1

All Departments ANALYST 2

All Departments CLERK 4

All Departments MANAGER 3

All Departments PRESIDENT 1

All Departments SALESMAN 4

All Departments All Jobs 14

GROUP BYGROUP BY

DNAMELEVEL

DNAMELEVEL

GRANDTOTAL

GRANDTOTAL

JOBLEVELJOB

LEVEL

PART 2 New features

Page 26: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

26

Rollup & Cube

> GROUP BY에 지정된 EXPRESSION중 하나와 일치해야 함

> Grouping함수를 사용하지 않으면 SubTotal의 구분과 Level을 알수없음.

> GROUP BY 에 의한 STANDARD AGGREGATION은 0, > ROLLUP과 CUBE에 의하여 생성된 SUBTOTAL은 1을 반환

SELECTSELECT DECODEDECODE((aa..deptnodeptno,,11,,'All 'All Departments'Departments',,bb..dnamedname)) dnamedname,,jobjob,, cntcnt ‘‘Total CNTTotal CNT’’

FROMFROM ( SELECT( SELECT DECODEDECODE((groupinggrouping((deptnodeptno),),11,,11,,deptnodeptno)) ASAS deptnodeptno,,DECODEDECODE((groupinggrouping((jobjob),), 11,, 'All Jobs''All Jobs',, jobjob)) ASAS jobjob,,COUNTCOUNT(*)(*) cntcnt

FROMFROM EMPEMPGROUPGROUP BYBY rolluprollup ((deptnodeptno,, jobjob))

)) aa,, dept bdept bWHEREWHERE aa..deptnodeptno==bb..deptnodeptno(+)(+)

GROUPING FUNCTION

PART 2 New features

Page 27: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

27

Rollup & Cube

> GROUPPING COLUMNS의 수는 255까지 가능하나 지나친COLUMN의 지정은 RESOURCE에 많은 부담을 주므로 피해야 함

> HAVING 절은 ROLLUP과 CUBE에 영향을 받지 않으며 RESULT SET의 SUBTOTAL과 NON SUBTOTAL에 모두 적용가능.

> ORDER BY 절은 ROLLUP이나 CUBE의 사용에 영향을 받지 않으며, 모든 RESULT SET에 적용가능

> PL/SQL 8.1.5 이하에서 사용하기 위해서는 Dynamic SQL를 사용

유의사항

PART 2 New features

Page 28: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

28

Groupping Set

> 다차원분석을 위한 집합 생성시 사용자가 원하는 집합을 ‘선택적’으로생성할 수 있음. (rollup 이나 cube 는 집합이 강제된다.)

> Rollup 이나 Cube 보다 해석이 쉬움

> 사용법• GROUP BY GROUPING SETS (a, b)

• GROUP BY GROUPING SETS ((a, b, c), (a, b), ())

GROUP BY a UNION ALLGROUP BY b

GROUP BY (a, b, c) UNION ALLGROUP BY (a, b) UNION ALLGROUP BY ()

PART 2 New features

Page 29: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

29

Groupping Set

SELECT GROUPING(DEPTNO) NO,DECODE(GROUPING(DEPTNO),0,TO_CHAR(DEPTNO),JOB) as GRP, SUM(SAL)

FROM EMPGROUP BY GROUPING SETS (DEPTNO, JOB) ;

SELECT 0 no, to_char(DEPTNO), SUM(SAL) FROM EMPGROUP BY DEPTNOUNION ALLSELECT 1 no, job, SUM(SAL)FROM EMPGROUP BY JOB;

사용예제

JOB Grouping

DEPT Grouping

PART 2 New features

Page 30: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

30

Groupping Set

SELECT GROUPING_ID(DEPTNO, JOB) NO,DECODE(GROUPING_ID(DEPTNO, JOB),1,TO_CHAR(DEPTNO),

2, JOB, 3, 'TOTAL SUM') as GRP, SUM(SAL)

FROM EMPGROUP BY GROUPING SETS (DEPTNO, JOB, ()) ;

SELECT 1 no, to_char(DEPTNO), SUM(SAL) FROM EMP GROUP BY DEPTNOUNION ALLSELECT 2 no, job, SUM(SAL) FROM EMP GROUP BY JOBUNION ALLSELECT 3 no, 'TOTAL SUM', SUM(SAL) FROM EMP

사용예제

Dept Grouping

Job Grouping

Grand Total

PART 2 New features

Page 31: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

31

Groupping Set

GROUPING_ID()

Division_id Job_id Bit Vector GROUPING_ID()

Non-null Non-null 00 0

Non-null Null 01 1

Null Non-null 10 2

Null Null 11 3

SQL> SELECT division_id, job_id,

2 GROUPING(division_id) AS div_grp,

3 GROUPING(job_id) AS job_grp,

4 GROUPING_ID (division_id, job_id) AS grp_id,

5 SUM (salary)

6 FROM employees2

7 GROUP BY CUBE(division_id, job_id);

PART 2 New features

Page 32: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

32

Groupping Set

DIV JOB DIV_GRP JOB_GRP GRP_ID SUM(SALARY)--- --- ---------- ---------- ---------- -----------

1 1 3 8881000ENG 1 0 2 245000MGR 1 0 2 6246000PRE 1 0 2 800000TEC 1 0 2 115000WOR 1 0 2 1475000

BUS 0 1 1 1610000BUS MGR 0 0 0 530000BUS PRE 0 0 0 800000BUS WOR 0 0 0 280000OPE 0 1 1 1320000OPE ENG 0 0 0 245000OPE MGR 0 0 0 805000OPE WOR 0 0 0 270000SAL 0 1 1 4936000SAL MGR 0 0 0 4446000SAL WOR 0 0 0 490000SUP 0 1 1 1015000SUP MGR 0 0 0 465000SUP TEC 0 0 0 115000SUP WOR 0 0 0 435000

GROUPING_ID()

PART 2 New features

Page 33: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

33

Groupping Set

정리

PART 2 New features

Page 34: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

34

Multi Insert(9i)> 개념

• 하나의 Insert문에서 여러 개의 table에 동시에 Insert 할 수 있음

• FIRST 일경우 첫번째로 만족하는 WHEN 절만 타고 RETURN 된다.• WHEN 조건절도 생략가능. 생략할경우 무조건 INSERT 됨

INSERT ALL/FIRST -- ALL 이나 FIRST 중 선택. 생략시 DEFAULT 로 ALL

[when 조건절1 then into [table1] values (col1,col2,,,) ]

[when 조건절2 then into [table2] values (col1,col2,..) ]

[else into [table2] values (col1,col2,…)]

[SUB-QUERY];

INSERT ALL/FIRST

WHEN ottl < 100000 THEN

INTO small_orders VALUES(oid, ottl, sid, cid)

WHEN ottl > 100000 and ottl < 200000 THEN

INTO medium_orders VALUES(oid, ottl, sid, cid)

ELSE

INTO large_orders VALUES(oid, ottl, sid, cid)

/* SOURCE-QUERY 구문 */

SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,

o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem

FROM orders o, customers c

WHERE o.customer_id = c.customer_id;

INSERT ALL/FIRST

WHEN ottl < 100000 THEN

INTO small_orders VALUES(oid, ottl, sid, cid)

WHEN ottl > 100000 and ottl < 200000 THEN

INTO medium_orders VALUES(oid, ottl, sid, cid)

ELSE

INTO large_orders VALUES(oid, ottl, sid, cid)

/* SOURCE-QUERY 구문 */

SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,

o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem

FROM orders o, customers c

WHERE o.customer_id = c.customer_id;

PART 2 New features

Page 35: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

35

Merge(9i)> 개념

• 한번의 SELECT로 INSERT와 UPDATE를 동시에 할 수 있음

• when matched then 절에 delete 문 사용가능(v10g)

merge into [Target table][Target table명의 alias] ①

using [ Source table/view/subquery][Source table/view/subquery의 alias] ②

on [join 조건] ③

when matched then ④

update set col1=value1 col2=value2

delete where col3 like ’10%’ and …when not matched then ⑤

insert (col명,…) values (value1,…);

① Insert나 Update가 될 Target table명 및 alias 를 정의한다

② 다른table data를 검색 및 비교한다면 Source table명을 alias를 함께 정의

(view 및 subquery도 사용 가능)

③ Target table 과 Source table 간 join 조건을 on 절에 정의

④ 조인 조건에 의해 만족하는 data가 존재한다면(matched) 미리 정의된

update문을 실행

⑤ 만약 만족하는 data가 없다면(not matched) insert문에 의해 data는 새롭게 입력

PART 2 New features

Page 36: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

36

Merge(9i)

MERGE INTO products p

USING product_changes pc ON (

p.product_id = pc.product_id

)

WHEN MATCHED THEN

UPDATE

SET

p.product_type_id = pc.product_type_id,

p.name = pc.name,

p.description = pc.description,

p.price = pc.price

WHEN NOT MATCHED THEN

INSERT (

p.product_id, p.product_type_id, p.name,

p.description, p.price

) VALUES (

pc.product_id, pc.product_type_id, pc.name,

pc.description, pc.price

);

MERGE INTO products p

USING product_changes pc ON (

p.product_id = pc.product_id

)

WHEN MATCHED THEN

UPDATE

SET

p.product_type_id = pc.product_type_id,

p.name = pc.name,

p.description = pc.description,

p.price = pc.price

WHEN NOT MATCHED THEN

INSERT (

p.product_id, p.product_type_id, p.name,

p.description, p.price

) VALUES (

pc.product_id, pc.product_type_id, pc.name,

pc.description, pc.price

);

< SQL 예제 >

PART 2 New features

Page 37: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

37

WITH(9i)

> 개념• WITH 구문을 이용한 SUB-QUERY의 활용

WITH[inline_view이름1] AS

(SELECT col1 FROM t1 where col1),[inline_view이름2] AS

(SELECT col1 FROM t2 where col1)SELECT col1 FROM inline_view이름1WHERE col1 > (SELECT col1 FROM inline_view이름2

WHERE col1);

WITHdept_costs AS (

SELECT department_name, SUM(salary) dept_totalFROM employees e, departments dWHERE e.department_id = d.department_idGROUP BY department_name),

avg_cost AS (SELECT SUM(dept_total)/COUNT(*) avgFROM dept_costs)

SELECT * FROM dept_costsWHERE dept_total > ( SELECT avg

FROM avg_cost )ORDER BY department_name;

WITHdept_costs AS (

SELECT department_name, SUM(salary) dept_totalFROM employees e, departments dWHERE e.department_id = d.department_idGROUP BY department_name),

avg_cost AS (SELECT SUM(dept_total)/COUNT(*) avgFROM dept_costs)

SELECT * FROM dept_costsWHERE dept_total > ( SELECT avg

FROM avg_cost )ORDER BY department_name;

PART 2 New features

Page 38: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

38

> 제한사항

DISTINCT 처리가 포함된 경우

그룹함수를 사용한 경우 : SUM, MIN, MAX, AVG, COUNT, STDDEV, VARIANCE, GLB등

analytic function을 사용한 경우

집합 처리 : UNION, UNION ALL, INTERSECT, MINUS

MODEL절을 사용한 경우

GROUP BY나 HAVING을 사용한 경우

순환관계 전개 처리 : CONNECT BY … START WITH 구문

ROWNUM을 사용한 경우

여러 개의 뷰와 조인한 뷰는 실행시 반드시 최종 뷰 내로 병합(Merge)이 가능해야 한다.

조인된 테이블 중에서 반드시 ‘키보존(Preserve) 테이블’만 수정할 수 있다.

Using Inlinview In DMLPART 2 New features

Page 39: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

39

Array Processing

> 한번 DBMS 호출에 여러 건의 DATA를 처리하는 방법

> DBMS 호출 (CALL)은 시스템 OVERHEAD의 주범

> ARRAY PROCESSING은 시스템 OVERHEAD를 감소

> ARRAY 단위는 사용자가 지정 가능, 지나치면 OVERHEAD 발생

>> 한번한번 FETCH FETCH 시시 여러여러 건을건을 동시에동시에 액세스액세스

>> 액세스와액세스와 동시에동시에 데이터의데이터의 가공처리가공처리

>> 여러여러 건을건을 동시에동시에 INSERT INSERT 혹은혹은 UPDTAEUPDTAE

> 8i 부터 사용가능.

PART 2 New features

Page 40: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

40

Array Processing

declaretype ridArray is table of rowid;type vcArray is table of t2.object_name%type;

l_rids ridArray;l_names vcArray;

cursor c is select rowid, object_name from t2;begin

open c;loop

fetch c bulk collect into l_rids, l_names LIMIT 100;

forall i in 1 .. l_rids.countupdate t2set object_name = lower(l_names(i))where rowid = l_rids(i);

exit when c%notfound;

end loop;close c;commit;end;/

배열단위 지정한번에 100건 fetch

배열변수 선언

배열 선언

PART 2 New features

Page 41: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

41

Using Returning Clause

> DML 문의 변경값을 SELECT 하지않고 메모리에서 읽어온다.

RETURNING : 단일 값이 아닌 여러 값(ROWS)을 RETURN한다면 BULK COLLECT를 사용하여야 한다.

CREATE OR REPLACE PROCEDURE update_salaryIS

TYPE ename IS TABLE OF scott.emp.ename%TYPE;TYPE sal IS TABLE OF scott.emp.sal%TYPE;

t_ename ename;t_sal sal;i number;

BEGIN

UPDATE emp SET sal = sal * 1.1

RETURNING ename, sal bulk collect INTO t_ename, t_sal;

dbms_output.put_line('update rows :'||t_ename.last);

for i in 1 .. t_ename.count loopdbms_output.put_line('ename :'||t_ename(i)||' sal :'||t_sal(i));end loop;

end;/

V9i

PART 2 New features

Page 42: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

42

Using Returning Clause

> V10g 부터 집계함수 사용가능.CREATE OR REPLACE PROCEDURE update_salary1 IS

V_AVG_SAL NUMBER(12);

t_ename ename;t_sal sal;i number;

BEGIN

UPDATE emp SET sal = sal * 1.1

RETURNING SUM(sal) INTO V_AVG_SAL;

dbms_output.put_line(‘avg(sal) = ’||to_char(V_AVG_SAL));

end;/

V10g

PART 2 New features

Page 43: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

43

Analytic Function

• 작년대비 올해의 매출실적을 비교하시오.

• A직원의 판매순위는 전체에서의 몇퍼센트에 포함이 되는가?

• 연간 판매실적에서 1월달의 판매실적은 전체에서의 몇 퍼센트인가?…

> 위의 쿼리 결과를 얻기는 간단해 보이나 self-join등 비싼 연산을 필요로 한다.

> Analytic function을 쓰는 이유

• 쿼리 성능 향상

• 개발자의 생산성 향상

• 사용하기 위해 배우는 노력의 최소화

• 표준화된 문법

• 일반 SQL로의 표현한계

• 디버깅, 유지관리의 어려움

PART 2 New features

Page 44: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

44

Analytic Function

> 분석함수의 순서

JOIN, WHERE,GROUP BY, HAVING

Analytic Functions

Last ORDER BY of query

SELECT job, deptno, sum(sal) s1, (2)RANK() OVER (PARTITION BY job ORDER BY SUM(sal) DESC) s2 (3)

FROM empWHERE sal < 5000GROUP BY job, deptnoHAVING sum(sal) > 1000 (1)ORDER BY job, s2 (4)

PART 2 New features

Page 45: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

45

Analytic Function

> 랭킹(Ranking) 함수

- RANK, DENSE_RANK, ROW_NUMBER()

- CUME_DIST, PERCENT_RANK

- Ntile/Percentile

> 윈도우(window) 함수 (Running summary, Moving Average )

> REPORTING 함수 :서로 다른 두 가지의 Aggregation level을 비교하고자

하는 목적으로 사용하는 Function family

- RATIO_TO_REPORT

- LAG/LEAD()

- Hypothetical Rank/Distribution

종류

PART 2 New features

Page 46: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

46

Analytic Function

> analytic clause

- partitioning

- ordering

- windowing

<FUNCTION> (<argument>) OVER (<analytic clause>)

문법

PART 2 New features

Page 47: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

47

Analytic Function

> 사용자가 지정한 범위(파티션) 내에서 순위를 리턴해준다.

> RANK()와 DENSE_RANK()의 차이

- RANK() : 동률을 이루는 값이 있을 경우 해당하는 숫자만큼은

비워두고 다음 순위를 매긴다.- DENSE_RANK() : 동률을 이루는 값이 있더라도 연속된

순위를 매긴다.

> 이때 NULL은 default로 가장 큰 값으로 취급한다.

> NULLS LAST/ NULLS FIRST로 널값의 순위를 변경할 수 있다.

RANK() and DENSE_RANK()

PART 2 New features

Page 48: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

48

Analytic Function

SQL> SELECT2 prd_type_id, SUM(amount),3 RANK() OVER (ORDER BY SUM(amount) DESC) AS rank,4 DENSE_RANK() OVER (ORDER BY SUM(amount) DESC) 5 AS dense_rank6 FROM all_sales7 WHERE year=20038 GROUP BY prd_type_id9 ORDER BY prd_type_id;

PRD_TYPE_ID SUM(AMOUNT) RANK DENSE_RANK----------- ----------- ---------- ----------

1 905081.84 2 22 186381.22 6 53 478270.91 4 34 402751.16 5 45 1 16 905081.84 2 2

PART 2 New features

Page 49: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

49

Analytic Function

SQL> SELECT2 prd_type_id, SUM(amount),3 RANK() OVER (ORDER BY SUM(amount) DESC NULLS4 LAST) AS rank,5 DENSE_RANK() OVER (ORDER BY SUM(amount) DESC6 NULLS LAST) 7 AS dense_rank8 FROM all_sales9 WHERE year=200310 GROUP BY prd_type_id11 ORDER BY prd_type_id;

PRD_TYPE_ID SUM(AMOUNT) RANK DENSE_RANK----------- ----------- ---------- ----------

1 905081.84 1 12 186381.22 5 43 478270.91 3 24 402751.16 4 35 6 56 905081.84 1 1

PART 2 New features

Page 50: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

50

Analytic Function

SQL> SELECT prd_type_id, month, SUM(amount),2 RANK() OVER(PARTITION BY prd_type_id ORDER BY 3 SUM(amount) DESC) AS rank4 FROM all_sales5 WHERE year=20036 AND amount IS NOT NULL7 GROUP BY prd_type_id, month8 ORDER BY prd_type_id, month;

Partition by

> PARTITON BY절에 명시한 컬럼이 작업처리의 단위가 된다.

> 제품종류별 매출액 순위?

PART 2 New features

Page 51: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

51

Analytic Function

Partition by

PRD_TYPE_ID MONTH SUM(AMOUNT) RANK----------- ---------- ----------- ----------

1 1 38909.04 121 2 70567.9 71 3 91826.98 41 4 120344.7 11 5 97287.36 31 6 57387.84 91 7 60929.04 81 8 75608.92 61 9 85027.42 51 10 105305.22 21 11 55678.38 101 12 46209.04 112 1 14309.04 92 2 13367.9 11

PART 2 New features

Page 52: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

52

Analytic Function

Ntiles ( Equiheight buckets )> 전체 행들을 분석 함수 내에서의 ORDER BY 절에서 지정한 순서에 맞춰 사용자가 지정한 버킷 수만큼

나눈다.> 매출액 TOP 25% 를 구하라.

select empno, ename, sal, NTILE(4) OVER (ORDER BY sal desc) sales_quartile

from emp ;

PART 2 New features

Page 53: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

53

Analytic Function

> 사용자가 퍼센트를 입력하여주면 해당하는 값을 리턴한다.

> 수치값은 0~1 사이임.

> PERCENTILE_CONT: 입력받은 수치 값이 어느 두 값의사이일 경우 두 값의 사이에서 계산된 값을 리턴한다.

> PERCENTILE_DISC: 입력받은 수치 값이 어느 두 값의사이일 경우 다른 계산과정 없이 작은 값을 그대로리턴한다.

> 단일 ROW 만 RETURN 한다.

Percentile

PERCENTILE_XXXX ( <수치값> ) WITHIN GROUP(ORDER BY 컬럼)

PART 2 New features

Page 54: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

54

Analytic Function

Percentile

> 하위 40% 에 해당하는 급여는 얼마인가?

select PERCENTILE_CONT(0.4) WITHIN GROUP (ORDER BY (sal) ) CONT,PERCENTILE_DISC(0.4) WITHIN GROUP (ORDER BY (sal) ) DISC

from emp

PART 2 New features

Page 55: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

55

Analytic Function

> 전체 행이 아닌 사용자가 지정한 범위내에서만 연산이일어나도록 하게 한다.

> Window 의 범위는 partition by 범위를 벗어날수 없다.

Window 함수

FUNCTION OVER

(ORDER BY 컬럼 ROWS BETWEEN XXX PRECEDING

AND XXX FOLLOWING | CURRENT ROW)COL1 COL2 COL3---- ---- -----XXXX XXXX XXXXXYYYY YYYY YYYYYZZZZ ZZZZ ZZZZZLLLL LLLL LLLLLMMMM MMMM MMMMMNNNN NNNN NNNNNQQQQ QQQQ QQQQQPPPP PPPP PPPPP

<- START_1

<- START_2

<- current row

<- END_2

<- END_1

PART 2 New features

Page 56: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

56

Analytic Function

Window 함수

SQL> SELECT month, SUM(amount) as month_amount,2 SUM(SUM(amount)) OVER3 (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING4 AND CURRENT ROW)5 as cumulative_amount6 FROM all_sales7 WHERE year=20038 GROUP BY month9 ORDER BY month;

MONTH MONTH_AMOUNT CUMULATIVE_AMOUNT---------- ------------ -----------------

1 95525.55 95525.552 116671.6 212197.153 160307.92 372505.074 175998.8 548503.875 154349.44 702853.316 124951.36 827804.677 170296.16 998100.838 212735.68 1210836.519 199609.68 1410446.19

10 264480.79 1674926.9811 160221.98 1835148.9612 137336.17 1972485.13

PART 2 New features

Page 57: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

57

Analytic Function

Window 함수

SQL> SELECT month, SUM(amount) as month_amount,2 AVG(SUM(amount)) OVER3 (ORDER BY month ROWS BETWEEN 1 PRECEDING 4 AND 1 FOLLOWING)5 AS moving_average6 FROM all_sales7 WHERE year=20038 GROUP BY month9 ORDER BY month;

MONTH MONTH_AMOUNT MOVING_AVERAGE---------- ------------ --------------

1 95525.55 106098.5752 116671.6 124168.3573 160307.92 150992.7734 175998.8 163552.0535 154349.44 151766.5336 124951.36 149865.6537 170296.16 169327.7338 212735.68 194213.849 199609.68 225608.717

10 264480.79 208104.1511 160221.98 187346.31312 137336.17 148779.075

<- CURRENT

PART 2 New features

Page 58: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

58

Analytic Function

FIRST_VALUE() and LAST_VALUE()

> 해당 윈도우에서 첫번째 행의 값과 마지막 행의 값을찾는 함수

SQL> SELECT month, SUM(amount) as month_amount,2 FIRST_VALUE(SUM(amount)) OVER3 (ORDER BY month ROWS BETWEEN 1 PRECEDING 4 AND 1 FOLLOWING)AS previous_month_amount,5 LAST_VALUE(SUM(amount)) OVER6 (ORDER BY month ROWS BETWEEN 1 PRECEDING 7 AND 1 FOLLOWING)AS next_month_amount8 FROM all_sales9 WHERE year=2003

10 GROUP BY month11 ORDER BY month;

PART 2 New features

Page 59: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

59

Analytic Function

FIRST_VALUE() and LAST_VALUE()

MONTH MONTH_AMOUNT PREVIOUS_MONTH_AMOUNT NEXT_MONTH_AMOUNT------ ------------ --------------------- -----------------

1 95525.55 95525.55 116671.62 116671.6 95525.55 160307.923 160307.92 116671.6 175998.84 175998.8 160307.92 154349.445 154349.44 175998.8 124951.366 124951.36 154349.44 170296.167 170296.16 124951.36 212735.688 212735.68 170296.16 199609.689 199609.68 212735.68 264480.79

10 264480.79 199609.68 160221.9811 160221.98 264480.79 137336.1712 137336.17 160221.98 137336.17

PART 2 New features

Page 60: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

60

Analytic Function

Reporting 함수-RATIO_TO_REPORT()

> 사용자가 지정한 범위내에서 각 값들이 차지하는 퍼센트 율

SQL> SELECT month, prd_type_id,2 SUM(amount) as prd_type_amount,3 RATIO_TO_REPORT(SUM(amount)) OVER 4 (PARTITION BY month) AS prd_type_ratio5 FROM all_sales6 WHERE year=20037 AND month <= 38 GROUP BY month, prd_type_id9 ORDER BY month, prd_type_id;

PART 2 New features

Page 61: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

61

Analytic Function

RATIO_TO_REPORT()

MONTH PRD_TYPE_ID PRD_TYPE_AMOUNT PRD_TYPE_RATIO---------- ----------- --------------- --------------

1 1 38909.04 .407315531 2 14309.04 .1497928041 3 24909.04 .2607578811 4 17398.43 .1821337851 52 1 70567.9 .6048421382 2 13367.9 .1145771552 3 15467.9 .1325763942 4 17267.9 .1480043132 53 1 91826.98 .57281624 3 2 16826.98 .1049666173 3 20626.98 .1286709983 4 31026.98 .193546145

PART 2 New features

Page 62: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

62

Analytic Function

LAG() and LEAD()

> Order by 컬럼기준으로 이전값/다음값 을 구한다.> 전월대비 판매실적과 같은 비교에 유용하게 쓰일 수 있다.

SQL> SELECT month, SUM(amount) as month_amount,2 LAG(SUM(amount), 1) OVER (ORDER BY month)3 AS previous_month_amount,4 LEAD(SUM(amount), 1) OVER (ORDER BY month) 5 AS next_month_amount6 FROM all_sales7 WHERE year=20038 GROUP BY month9 ORDER BY month;

PART 2 New features

Page 63: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

63

Analytic Function

LAG() and LEAD()

MONTH MONTH_AMOUNT PREVIOUS_MONTH_AMOUNT NEXT_MONTH_AMOUNT------ ------------ --------------------- -----------------

1 95525.55 116671.62 116671.6 95525.55 160307.923 160307.92 116671.6 175998.84 175998.8 160307.92 154349.445 154349.44 175998.8 124951.366 124951.36 154349.44 170296.167 170296.16 124951.36 212735.688 212735.68 170296.16 199609.689 199609.68 212735.68 264480.7910 264480.79 199609.68 160221.9811 160221.98 264480.79 137336.17

MONTH MONTH_AMOUNT PREVIOUS_MONTH_AMOUNT NEXT_MONTH_AMOUNT------ ------------ --------------------- -----------------

12 137336.17 160221.98

PART 2 New features

Page 64: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

64

Analytic Function

Hypothetical Rank and Distribution

SQL> SELECT prd_type_id, SUM(amount),2 RANK() OVER (ORDER BY SUM(amount) DESC) AS rank,3 PERCENT_RANK() OVER (ORDER BY SUM(amount) DESC)4 AS percent_rank5 FROM all_sales6 WHERE year=20037 AND amount IS NOT NULL8 GROUP BY prd_type_id9 ORDER BY prd_type_id;

PRD_TYPE_ID SUM(AMOUNT) RANK PERCENT_RANK----------- ----------- ---------- ------------

1 905081.84 1 02 186381.22 4 13 478270.91 2 .3333333334 402751.16 3 .666666667

PART 2 New features

Page 65: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

65

Analytic Function

Hypothetical Rank and Distribution

SQL> SELECT RANK(500000) WITHIN GROUP(ORDER BY 2 SUM(amount) DESC)AS rank3 FROM all_sales4 WHERE year=20035 AND amount IS NOT NULL6 GROUP BY prd_type_id7 ORDER BY prd_type_id;

> 매출액 50만원 이면 몇등인가?

PART 2 New features

Page 66: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

66

New Connect By Functionality

> ORDER SIBLINGS BY(9i)• 계층구조 안에서 레벨별로 정렬한다

> SYS_CONNECT_BY_PATH(9i)• FULL PATH 를 나타낸다

SELECT LEVEL,last_name, SYS_CONNECT_BY_PATH(last_name, '/')

FROM employeesSTART WITH employee_id = 100CONNECT BY PRIOR employee_id = manager_idORDER SIBLINGS BY last_name;

SYS_CONNECT_BY_PATH

ORDER SIBLINGS BY

PART 2 New features

Page 67: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

67

New Connect By Functionality(10g)

> connect_by_root ename• 최상위계층의 이름을 나타낸다

> connect_by_isleaf• 말단사원이면 1 아니면 0을 return 한다

> connect_by_iscycle• cycle 이면 1 아니면 0을 return 한다

> NOCYCLE• cycle 일경우 에 cycle 을 방지하고 cycle 에러를 막는다

주) connect_by_iscycle과 NOCYCLE은 connect by의 LOOP 에러를 방지하기 위해 사용

“ORA-01436: CONNECT BY loop in user data”

SELECT last_name "Employee", CONNECT_BY_ROOT last_name "Manager",DECODE(CONNECT_BY_ISLEAF, 1, 'Y', 'N') as LEAF_YN,DECODE(CONNECT_BY_ISCYCLE, 1, 'Y', 'N') as CYCLE_YN,SYS_CONNECT_BY_PATH(last_name, '/') "Path"

FROM employeesWHERE LEVEL > 1 and department_id = 110CONNECT BY NOCYCLE PRIOR employee_id = manager_id

CONNECT_BY_ROOT

CONNECT_BY_ISLEAF CONNECT_BY_ISCYCLE

PART 2 New features

Page 68: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

68

Bulk Bind Improvements(10g)Bulk Bind Improvements(10g)

> 배열값중 하나또는 여러 개가 삭제될경우에 에러방지.> Exception 처리가 필요없음.

• 예제)

DECLARETYPE typ_famtyp IS TABLE OF families%ROWTYPE;v_fam typ_famtyp;

BEGINSELECT *BULK COLLECT INTO v_famFROM families;

FOR rec IN 1..v_fam.LAST() LOOP

IF v_fam(rec).emp_dep_code!=0 THEN v_fam.delete(rec);

END IF; END LOOP;

FORALL inds IN INDICES OF v_fam INSERT INTO employees VALUES v_fam(inds); END; /

PART 2 New features

Page 69: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

69

Nested Table Functions

Function Return value Description

x MULTISET INTERSECT [DISTINCT] y NESTED TABLE Performs an INTERSECT set operation on nested tables x and y, returning a nested table whose elements are in both x and y. x, y and the returned nested table must all be of the same type. The DISTINCT keyword forces the elimination of duplicates from the returned nested table.

x MULTISET UNION [DISTINCT] y NESTED TABLE Performs a UNION set operation on nested tables x and y returning a nested table whose elements include all those in x as well as those in y. x, y and the returned nested table must all be of the same type. The DISTINCT keyword forces the elimination of duplicates from the returned nested table.

SET(x) NESTED TABLE Returns nested table x without duplicate elements.

x IS [NOT]A SET BOOLEAN Returns TRUE [FALSE] if the nested table x is composed of unique elements

x IS [NOT] EMPTY BOOLEAN Returns TRUE [FALSE] if the nested table x is empty

e [NOT] MEMBER [OF] x BOOLEAN Returns TRUE[FALSE] if an expression e is a member of the nested table x

y [NOT] SUBMULTISET [OF] x BOOLEAN Returns TRUE [FALSE] if nested table y contains only elements that are also in nested table x.

PART 2 New features

Page 70: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

70

> Scalar_subquery사용자 함수와 거의 동일한 개념으로 사용되며 단지 사용자가 생성한함수가 아닌 SQL문을 사용한다.

> MULTISETScalar_Subquery의 결과 집합을 특정 Collection Type으로변경한다.

> CASTMultiset과 함께 사용되며 지정된 Type의 Datatype으로 변환작업을수행한다.

> 사용 DBMS Version : oracle 8.1.7 부터 사용 가능

> 기본 Syntax

CAST( MULTISET(<CAST( MULTISET(<select_statementselect_statement>) AS >) AS <<collection_typecollection_type>)>)

Nested Table Functions Cast(MultiSet(Scalar_subquery))PART 2 New features

Page 71: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

71

CREATE OR REPLACE TYPE SCOTT.EMP_INFO_TYPE AS OBJECT( DEPTNO NUMBER(2), EMPNO NUMBER(4), ENAME

VARCHAR(10), SAL NUMBER(7,2) ) ;

CREATE OR REPLACE TYPE SCOTT.EMP_INFO_ARRAY_TYPE AS TABLE OF EMP_INFO_TYPE ;

SELECT X.DNAME, Y.EMPNO, Y.ENAME, Y.SALFROM (SELECT D.DEPTNO, DNAME,

CAST(MULTISET(SELECT A.DEPTNO, A.EMPNO, A.ENAME, A.SALFROM EMP AWHERE A.DEPTNO = D.DEPTNO) AS EMP_INFO_ARRAY_TYPE) AS

SAL_INFOFROM DEPT D

WHERE D.DEPTNO > 0 ) X, TABLE(SAL_INFO) YWHERE X.DEPTNO = Y.DEPTNO(+)

> 수행 원리1) multiset으로 서브쿼리를 Collection으로 (집합생성)2) CAST 타입변환 ( DEPTNO NUMBER(2), EMPNO NUMBER(4), ENAME

VARCHAR(10), SAL NUMBER(7,2) )

Nested Table Functions Cast(MultiSet(Scalar_subquery))PART 2 New features

Page 72: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

72

• 1.사용자 함수를 대체 가능하며 수행속도는 사용자 함수보다 더 유리(조인으로 수행한 것과 거의 동일한 수행속도를 얻을 수 있다)

• 2.사용자 함수의 Single Rows, Column Return의 제한 사항을 해결함. (Multi Rows, Columns Return)

• 3.수행된 결과 집합은 조인에 의해 수행된 것과 동일하게 나타남.(Subquery에 대한 조인 실패시 Main 결과 집합을 추출할 수 없지만Outer 조인으로 해결할 수 있음. 1*M=M, M:M =MM, 1:1 =1, M*1 =1 )

• 4.부분 범위 처리가 가능수행 방식은 조인 방식과 동일하지만 Nest Loop조인으로 수행되어야만 효율을극대화 할 수 있음(반드시 선행 집합의 결과를 받아서 수행하는 것이 유리할 경우)

• 5.Subquery의 결과 컬럼을 동일 SQL문에 반복 사용해도 Subquery는한번수행(Internal Write 수행)

특징특징 : : 주로주로 온라인온라인 화면에서화면에서 수행해야수행해야 함함. .

Cast(MultiSet(Scalar_subquery))PART 2 New features

Nested Table Functions

Page 73: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

73

1.Subquery1.Subquery는는 선행집합과선행집합과 연결되는연결되는 컬럼은컬럼은 인덱스가인덱스가 존재해야존재해야 빠르다빠르다. . ((속도에속도에 영향영향))

2.Type2.Type에에 정의정의 컬럼의컬럼의 수와수와 DatatypeDatatype이이 반드시반드시 동일해야만동일해야만 한다한다..((또한또한 SubquerySubquery 결과결과 컬럼을컬럼을 재재 사용하기사용하기 위해서는위해서는 TYPETYPE에에 정의정의컬럼명과컬럼명과 동일해야만동일해야만 한다한다.).)

3.Subquery 3.Subquery 결과를결과를 얻기얻기 위해서는위해서는 반드시반드시 Table(typeTable(type명명))을을FromFrom절에절에 정의를정의를 내려야만내려야만 한다한다..

4.Scalar_subquery4.Scalar_subquery의의 SQL StatementSQL Statement에에 Inline ViewInline View를를 사용할사용할수가수가 없다없다..

5. 5. 대용량 데이터 처리시 조인보다 훨씬 불리하다.(HASH 나 MERGE 가 유리함)

주의 사항

Cast(MultiSet(Scalar_subquery))PART 2 New features

Nested Table Functions

Page 74: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

74

Nested Table Functions Cast(MultiSet(Scalar_subquery))PART 2 New features

> COLLECT is new to Oracle10g and operates on a column in a SQL statement:

CREATE TYPE email_list_t AS TABLE OF VARCHAR2(64);

-- COLLECT operates on a columnSELECT CAST(COLLECT(cust_email)AS email_list_t)FROM oe.customers;

-- which is equivalent toSELECT CAST(MULTISET(SELECT cust_email

FROM oe.customers)AS email_list_t)

FROM dual;

Page 75: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

75

Nested Table Functions

> Examples of the other nested table functions DECLARE

TYPE nested_type IS TABLE OF NUMBER;nt1 nested_type := nested_type(1,2,3);nt2 nested_type := nested_type(3,2,1);nt3 nested_type := nested_type(2,3,1,3);nt4 nested_type := nested_type(1,2,4);answer nested_type;

BEGINanswer := nt1 MULTISET UNION nt4; -- (1,2,3,1,2,4)answer := nt1 MULTISET UNION nt3; -- (1,2,3,2,3,1,3)answer := nt1 MULTISET UNION DISTINCT nt3; -- (1,2,3)answer := nt2 MULTISET INTERSECT nt3; -- (3,2,1)answer := nt2 MULTISET INTERSECT DISTINCT nt3;

-- (3,2,1)answer := nt3 MULTISET EXCEPT nt2; -- (3)answer := nt3 MULTISET EXCEPT DISTINCT nt2; -- ()answer := SET(nt3); -- DUP 제거 (2,3,1)IF (nt1 IS A SET) AND (nt3 IS NOT A SET) THEN – UNIQUE 검사

dbms_output.put_line('nt1 has unique elements');dbms_output.put_line('but nt3 does not');

END IF;IF (nt3 MULTISET EXCEPT DISTINCT nt2) IS EMPTY THEN

dbms_output.put_line('empty set');END IF;IF 3 MEMBER OF (nt3 MULTISET EXCEPT nt2) THEN

dbms_output.put_line('3 is in the answer set');END IF;IF nt1 SUBMULTISET nt3 THEN

dbms_output.put_line('nt1 is a subset of nt3');END IF;IF SET(nt3) IN (nt1,nt2,nt3) THENdbms_output.put_line(

'expression is IN the list of nested tables');END IF;

END;

PART 2 New features

Page 76: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

76

PART 4 SQL 튜닝• 튜닝툴의 사용(explain plan, autotrace, tkprof, 실행계획의 이해 ) • sql 엑세스패턴

• sql 조인 패턴

• 서브쿼리를 이용한 데이터 연결

• Optimizer(구조, 작동방식 ANALYZE, DBMS_STAT)• Query Transform

> M-VIEW QUERY REWRITE> SUB QUERY UNNESTING> VIEW MERGING> PUSH PREDICATE> OR-EXPANSION> STAR QUERY TRANSFORMATION> Partition Pruning (이미 설명)> 10053 EVENT

• 부분범위처리

• BIND 변수를 사용하라.(예외사항) • IN 을 이용한 엑세스 효율화

• 제약조건이 PLAN 에 미치는 영향

• HINT

PART 4 SQL 튜닝

Page 77: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

77

Explain Plan 명령어

> 실행 계획(EXPLAIN PLAN)을 확인할 때 사용하는 튜닝 도구

• 실행 계획(EXPLAIN PLAN)

> SQL 문이 처리되는 구문 분석 단계에서 서버 프로세스에 의해 해당 SQL 문이 어떻게 실행되는 것이 가장 빠른지를 결정하는 과정

• EXPLAIN PLAN 명령어를 사용하여 확인할 수 있는 내용

> 데이터베이스에서 SQL 문이 실행될 때의 상태 정보

> 실행 경로에 대한 정보

> SQL 문의 WHERE 절과 FROM 절의 변화에 대한 정보 제공

> EXPLAIN PLAN 명령어를 실행하기 전에 분석 결과를 저장하기

위한 PLAN_TABLE을 생성해야 함

• PLAN_TABLE은 UTLXPLAN.SQL 스크립트를 사용하여 생성

PART 4 SQL 튜닝

Page 78: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

78

Explain Plan 명령어

> EXPLAIN PLAN 명령어 구문

• STATEMENT_ID 절> 여러 명의 사용자가 동시에 분석 작업을 하는 경우 분석된 결과를 구분하기 위한

식별자로 30자까지 정의 가능

• INTO 절> 분석 결과를 다른 테이블에 저장하기 위해 사용

EXPLAIN PLAN [ INTO 테이블_이름 ] FOR

SQL_문 ;

EXPLAIN PLAN [ INTO 테이블_이름 ] SET STATEMENT_ID = 식별자 FOR

SQL_문 ;

PART 4 SQL 튜닝

Page 79: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

79

Explain Plan 명령어

> EXPLAIN PLAN 명령어를 사용하여 분석하기• 1. UTLXPLAIN.SQL 스크립트를 실행하여 PLAN_TABLE 생성

• 2. EXPLAIN PLAN 명령을 사용하여 SQL 문의 실행 계획 분석

> 실제 쿼리가 실행되는것이 아님.(평가만 함)

WINDOWS 환경 : SQL> START c:\oracle\ora90\rdbms\admin\utlxplan.sql

(UNIX 환경에서는 $ORACLE_HOME/rdbms/admin 에 위치)

PART 4 SQL 튜닝

Page 80: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

80

Explain Plan 명령어

• 3. 실행 계획에 대한 분석이 끝나면 분석 결과를 보기 쉽도록 만들기 위해PLAN_TABLE을 참조하기 위한 스크립트 작성

WINDOWS 환경 : SQL> START c:\oracle\ora90\rdbms\admin\utlxplan.sql

(UNIX 환경에서는 $ORACLE_HOME/rdbms/admin 에 위치)

PART 4 SQL 튜닝

Page 81: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

81

Explain Plan 명령어

EXPLAIN PLAN 명령어를 사용하여분석된 결과 테이블 실행 계획 내부 처리 과정

• 4. 결과분석

PART 4 SQL 튜닝

Page 82: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

82

Explain Plan 명령어

OPERATIONS 설 명

FILTER SQL문의 WHERE절에 정의된 조건으로 테이블의 행을 검색해 줍니다.

INDEX/RANGE 인덱스를 이용하여 테이블에 있는 데이터를 검색합니다.

INDEX/UNIQUE Unique-Index 또는 Primary-Key에 의한 인덱스의 테이블에 있는 데이터를검색합니다.

SORT/MERGE 두 개의 테이블을 조인하여 분류(SORTING)합니다.

SORT/GROUP BY SQL문장의 GROUP BY절에 정의된 컬럼으로 데이터를 분류(SORTING)합니다.

SORT/JOIN 조인된 각 테이블의 데이터를 분류(SORTING)합니다.

SORT/ORDER SQL문장의 ORDER BY절에 정의된 컬럼으로 데이터를 분류합니다.

TABLE ACCESS/FULL 테이블 전체 스캔 방법으로 검색합니다.

PART 4 SQL 튜닝

Page 83: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

83

AUTO TRACE

> SET AUTOTRACE ON 명령어 EXPLAIN PLAN 명령과 다른점은 실재 쿼리가 수행된다는것. PLAN_TABLE을 생성한 후 한번만 설정하면 SQL 문이 실행될 때마다 실행 계획을

화면에 출력

SET AUTOTRACE 명령어의 문법

• ON> SQL 문의 실행 결과와 실행 계획, 통계 정보를 보여주는 옵션

• OFF> AUTOTRACE를 해지하는 옵션

• TRACEONLY 옵션

> 실행 계획과 통계 정보만을 제공

SET AUTOTRACE [ ON | OFF | TRACEONLY ] [EXP[LAIN]] [STAT[ISTICS]]

PART 4 SQL 튜닝

Page 84: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

84

AUTO TRACE

SET AUTOTRACE 명령어 실행 결과

PART 4 SQL 튜닝

Page 85: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

85

SQL*Trace

> SQL*Trace• EXPLAIN PLAN 명령어와 함께 애플리케이션 튜닝에서 자주 사용되는 기능

• SQL 문의 실행 계획과 더불어 시스템을 튜닝하는 데 필요한 실행 소요 시간과 디스크나메모리로부터 읽은 데이터 블록 수 등에 대한 정보 제공.

> SQL*Trace에 의해 생성된 결과• 이진(binary) 형태의 파일로 운영체제의 디렉토리에 생성

• 생성된 파일은 TKPROF 유틸리티를 사용하면 텍스트 형태로 변환하여 참조 가능

• EXPLAIN PLAN과 병행하여 사용하는 것이 좋다.

> SQL*Trace를 사용하여 분석된 결과에 포함되는 분석 정보• 1. parse, execute, fetch 수• 2. CPU 시간/경과된 시간

• 3. 물리적/논리적 reads • 4. 처리된 로우수

• 5. 라이브러리 캐시 misses • 6. 파싱이 발생할 때의 사용자

• 7. 커밋/롤백

PART 4 SQL 튜닝

Page 86: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

86

> SQL*TRACE와 관련된 동적 파라미터(dynamic parameter)• timed_statistics

> CPU 시간, 실행시간 등 시간에 관련된 정보를 표시하기 위해 사용

> 지속적인 설정을 위해 파라미터파일(init.ora)에 설정하거나 세션에서만임시로 설정하기 위해 alter session set timed_statistics = true로 사용가능

• max_dump_file_size > 트레이스 파일의 최대 크기(단위: OS블럭수)로 기본 값은 unlimited > 지속적인 설정을 위해 파라미터파일(init.ora)에 설정하거나 세션에서만

임시로 설정하기 위해 alter session set max_dump_ file_ size =500로사용 가능.

• user_dump_dest> 트레이스파일이 생성될 디렉토리

> 지속적인 설정을 위해 패러미터파일(init.ora)에 설정하거나인스턴스에서만 임시로 설정하기 위해 alter system set user_dump_dest=/tmp로 사용 가능.

SQL*TracePART 4 SQL 튜닝

Page 87: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

87

> 사용절차• 1. SQL_TRACE 파라미터 설정

• 2. 분석할 SQL 문 실행

• 3. EXIT명령어를 사용하여 세션을 종료하고, USER_DUMP_DEST 파라미터에 설정된 경로에 분석 결과인 트레이스 파일이 생성되었는 지 확인

> 세션이 종료되는 순간 지정한 디렉터리에 *.TRC 확장자를 가진 파일이생성

Init.ora 파일에 SQL_TRACE = TRUE 또는

SQL> ALTER SESSION SET SQL_TRACE = TRUE;

SQL*Trace

SQL> SELECT * FROM emplyoess;

SQL> EXIT;user_dump_dest 에 있는 경로에 생성된 .trc 파일 확인

PART 4 SQL 튜닝

Page 88: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

88

TKPROF

> TKPROF 유틸리티를 사용하여 텍스트 파일로 변환

> TKPROF 유틸리티 옵션

TKPROF trace_file명 output_file명 [explain=user/passwd] [table=schema.tablename] [print=integer] [insert=filename] [sys=yes/no] [sort=option]

옵션 설 명

trace_file 생성된 트레이스 파일이름

output_file tkprof가 출력하는 텍스트 파일이름(확장자 :prf)

explain=user/passwd 해당 트레이스 파일이 수행된 세션의 사용자 및 패스워드

table=schema.tablename 실행계획(execution plan)을 저장할 TKPROF 임시 테이블의 이름

print=integer 트레이스 파일별로 출력시킬 SQL문의 수

insert=filename INSERT 문 안의 데이터와 SQL 문 리스트

sys=yes/no 트레이스 파일 내에 생성된 SQL 문 중에서 오라클 서버가 내부적인 작업을 위해 수행된SQL 문을 출력할 것인지 설정

record=filename 트레이스 파일에 분석된 SQL 문을 지정한 파일에 저장

sort=option 트레이스 파일에 분석된 SQL 문을 지정한 옵션에 의해 분류하여 출력

PART 4 SQL 튜닝

Page 89: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

89

TKPROF

> TKPROF 분석 결과

PART 4 SQL 튜닝

Page 90: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

90

TKPROF

> 분석 결과에 나타난 컬럼 설명

로우/컬럼 설 명

Parse SQL 문이 파싱되는 단계에 대한 통계새로 파싱했거나 Shared SQL Pool에서 찾아온 것도 포함

ExecuteSQL 문의 실행 단계에 대한 통계Update, Insert, Delete 문장들은 여기에 수행한 결과만 표시

Fetch SQL 문이 실행되면서 fetch된 통계

count SQL 문이 parse/execute/fetch가 수행된 횟수

cpu parse, execute, fetch가 실제로 사용한 CPU 시간(1/100초 단위)

elapsed 작업의 시작에서 종료 시까지 실제 소요된 시간

disk 디스크에서 읽혀진 데이터 블록의 수

query메모리 내에서 변경되지 않은 블록을 읽거나 다른 세션에 의해 변경되었으나 아직 커밋되지 않아 복사해

둔 스냅샷 블록을 읽은 블록 수SELECT 문에서는 거의 여기에 해당하며 Update,Insert,Delete작업시에는 소량만 발생

current현 세션에서 작업한 내용을 커밋하지 않아 오로지 자신에게만 유효한 블록(Dirty Block)을 액세스한

블록 수주로 Update, Insert, Delete 작업 시 많이 발생

rowsSQL 문을 수행한 결과에 의해 최종적으로 액세스된 로우의 수(서브쿼리에서 추출된 로우는 제외)

PART 4 SQL 튜닝

Page 91: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

91

TKPROF

> 결과분석(Count)

LOOP LOOP 에서에서 수행된수행된 SQLSQL이거나이거나

100100번번 수행된수행된 프로그램프로그램

기본키로기본키로 처리되는처리되는 SQLSQL

HOLD_CURSOR HOLD_CURSOR 지정되지지정되지 않음않음

CallCall

Fetch

Parse 100100

ExecuteExecute

CountCount

100100

100100

LOOP LOOP 에서에서 수행된수행된 SQLSQL

100100번번 수행된수행된 프로그램프로그램

기본키로기본키로 처리되는처리되는 SQLSQL

HOLD_CURSOR HOLD_CURSOR 지정지정, , PL/SQLPL/SQL

CallCall

Fetch

Parse 11

ExecuteExecute

CountCount

100100

100100

한번한번 수행된수행된 SQLSQL

한번한번 수행된수행된 프로그램프로그램

Pro*C CURSORPro*C CURSOR로로 지정된지정된 SQLSQL

PL/SQL CURSOR PL/SQL CURSOR 지정된지정된 SQLSQL

CallCall

Fetch

Parse 11

ExecuteExecute

CountCount

11

100100

PART 4 SQL 튜닝

Page 92: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

92

TKPROF

> 결과분석(CPU)

전체범위처리전체범위처리

ORDER BY, GROUP BYORDER BY, GROUP BY

넓은넓은 처리범위처리범위

비효율적인비효율적인 인덱스인덱스

CallCall

Fetch

Parse 0.010.01

ExecuteExecute

CPUCPU

5.605.60

0.010.01

00

RowsRows

00

1010

부분범위처리부분범위처리

넓은넓은 처리범위처리범위

CallCall

Fetch

Parse 0.010.01

ExecuteExecute

CPUCPU

0.010.01

12.2012.20

00

RowsRows

00

100100

PART 4 SQL 튜닝

Page 93: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

93

TKPROF

> Overall의 분석(CPU)• (Parse count * 0.01) 보다 cpu 가 크면 라이브러리 캐쉬 튜닝 검토

• (Parse count *.0.03) 보다 disk 가 크면 딕셔너리 캐쉬 튜닝 검토

> Overall의 분석(MEMORY)• (Execute disk + Fetch disk) 가 (Execute query + Fetch query +

Execute current + Fetch current) 의 10% 이상이면 버퍼캐쉬 튜닝검토

PART 4 SQL 튜닝

Page 94: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

94

> 발생• 아무런 조건 없이 Table을 읽게 한 경우

• 인덱스가 걸려있지 않은 컬럼에 대해서 조건주고 Table을 읽게 한 경우

• 인덱스가 걸려있는 컬럼에 조건을 부여했을지라도 Optimizer가 Full Table Scan이유리하다고 판단한 경우

> Access 방식• 테이블의 첫 Row가 들어있는 Block부터 HWM(High Water Mark)까지 읽는다

• 한번에 DB_FILE_MULTIBLOCK_READ_COUNT에서 정한 크기 만큼 읽는다

SQL SQL AccsesAccses Pattern

Full Table Scan

PART 4 SQL 튜닝

Page 95: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

95

Index Unique Scan

> 발생• Unique Index를 구성하고 있는 모든 Key값에 대해서 Equal(=) 로 조건이

공급된 경우 발생한다

> Access 방식• 해당 조건을 만족하는 값 하나만 읽는다

SQL SQL AccsesAccses PatternPART 4 SQL 튜닝

Page 96: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

96

Index Range Scan

> 발생• Non-Unique Index를 Access하는 경우

• Unique Index를 구성하고 있는 컬럼 중 일부 컬럼에만 값이 공급된 경우

• Unique Index에 Range 조건(like, between, >, <, >=, <=)으로 값이공급되는 경우

> Access 방식• 해당 조건을 만족하는 범위 + 아닌 값 하나(1PlusScan)를 읽게 된다. • Range 조건이 들어온 경우 Index구성 순서상 이후에 있는 컬럼에 공급된

조건들은 작업범위를 줄이는데 작용하지 못한다

SQL SQL AccsesAccses PatternPART 4 SQL 튜닝

Page 97: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

97

◈ 역순으로 데이터를 액세스 한다는 것 을 제외하면 인덱스 범위 스캔과 동일하다.

◈ 스캔의 시작점은 최대값이고, 역순으로 리프 블록을 스캔 하여 최소값이 될 때까지 수행한다.

◈ 정렬 처리 작업을 대신해서 사용하면 매우 효율적이다.

◈ INDEX_DESC(table_alias index_name)을 사용한다.

◈ 역순으로 데이터를 액세스 한다는 것 을 제외하면 인덱스 범위 스캔과 동일하다.

◈ 스캔의 시작점은 최대값이고, 역순으로 리프 블록을 스캔 하여 최소값이 될 때까지 수행한다.

◈ 정렬 처리 작업을 대신해서 사용하면 매우 효율적이다.

◈ INDEX_DESC(table_alias index_name)을 사용한다.

SELECT /*+ INDEX_DESC(emp EMP_EMPNO_IDX) */ empno, ename

FROM emp

WHERE empno BETWEEN 10 AND 20

Execution Plan

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

SELECT STATEMENT ALL_ROWS-Cost : 4

TABLE ACCESS BY INDEX ROWID SCOTT.EMP(1)

INDEX RANGE SCAN DESCENDING SCOTT.EMP_EMPNO_IDX (EMPNO)

INDEX RANGE SCAN DESCENDING

Page 98: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

98

Index Full Scan

> 발생• Optimizer가 Full Table Scan하고 Sort하는 것 보다는 Index Full

Scan해 Sort작업을 따로 수행하지 않는 것이 유리하다고 판단한 경우

> Access 방식• 해당 인덱스의 모든 Block을 한번에 한 Block씩 순차적으로 읽어

내려간다.(Single Block I/O)

SQL SQL AccsesAccses PatternPART 4 SQL 튜닝

Page 99: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

99

Index Fast Full Scan> 발생

• Where절이나 Select절에 사용된 컬럼이 모두 하나의 인덱스에 구성된 컬럼인

경우

• 결합Index의 경우 최소한 한 Column이 NOT Null로 지정되어 있어야 한다

> Access 방식• 인덱스 Leaf Block을 한번에

DB_FILE_MULTIBLOCK_READ_COUNT에서 정한 크기씩 끝까지 읽어내려가며 결과 값의 Sort가 보장되지 않는다

• Parallel로 수행 가능하다

• Full Table Scan보다 읽어야 할 Block의 수가 적어 유리하다

SQL SQL AccsesAccses PatternPART 4 SQL 튜닝

Page 100: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

100

◈ 결합 인덱스에서 첫 번째 컬럼이 사용되지 않으면 무조건 인덱스 스캔이 불가능 하였다. 하지만 9i부터 인덱스 스킵 스캔으로 가능해짐.

◈ Index Skip Scan의 원리

① 어떤 테이블의 인덱스가 sal_typ(매출유형), item_cd(상품코드), sal_dt(매출일자)로 구성되어 있다고 가정했을 경우

② 쿼리의 조건에서 item_cd와 sal_dt 만 사용 되었다.

③ sal_typ의 값이 D(내수),E(수출),L(로컬) 이렇게 세 종류만 있다고 가정을 하였을 경우. Index Skip Scan을 적용하면..

④ sal_typ IN (‘D’,’E’,’L’) 의 조건을 추가한 것과 동일한 효과를 얻을 수 있다.

- 결국 생락 된 첫 번째 컬럼의 값이 조건 절에 자동으로 추가되는 것과 유사한 효과가 난다.

- WHERE sal_typ = ‘D’ and item_cd = … UNION ALL

WHERE sal_typ = ‘E’ and item_cd = … UNION ALL

WHERE sal_typ = ‘L’ and item_cd = … → 여기서 ‘D’,’E’,’L’을 논리적 서브 인덱스라고 한다. (Page 199 밑에줄)

※ 결국 Index Skip Scan은 서브 인덱스의 종류가 많지 않고, 뒤에 오는 컬럼의 종류가 많을 때 가장 좋은 결과를 얻을 수 있다.

◈ INDEX_SS, INDEX_SS_ASC, INDEX_SS_DESC 힌트를 사용하여 유도 할 수 있다.

◈ Index Skip Scan을 하지 않도록 하고 싶다면 NO_INDEX_SS 힌트를 사용한다.

◈ 결합 인덱스에서 첫 번째 컬럼이 사용되지 않으면 무조건 인덱스 스캔이 불가능 하였다. 하지만 9i부터 인덱스 스킵 스캔으로 가능해짐.

◈ Index Skip Scan의 원리

① 어떤 테이블의 인덱스가 sal_typ(매출유형), item_cd(상품코드), sal_dt(매출일자)로 구성되어 있다고 가정했을 경우

② 쿼리의 조건에서 item_cd와 sal_dt 만 사용 되었다.

③ sal_typ의 값이 D(내수),E(수출),L(로컬) 이렇게 세 종류만 있다고 가정을 하였을 경우. Index Skip Scan을 적용하면..

④ sal_typ IN (‘D’,’E’,’L’) 의 조건을 추가한 것과 동일한 효과를 얻을 수 있다.

- 결국 생락 된 첫 번째 컬럼의 값이 조건 절에 자동으로 추가되는 것과 유사한 효과가 난다.

- WHERE sal_typ = ‘D’ and item_cd = … UNION ALL

WHERE sal_typ = ‘E’ and item_cd = … UNION ALL

WHERE sal_typ = ‘L’ and item_cd = … → 여기서 ‘D’,’E’,’L’을 논리적 서브 인덱스라고 한다. (Page 199 밑에줄)

※ 결국 Index Skip Scan은 서브 인덱스의 종류가 많지 않고, 뒤에 오는 컬럼의 종류가 많을 때 가장 좋은 결과를 얻을 수 있다.

◈ INDEX_SS, INDEX_SS_ASC, INDEX_SS_DESC 힌트를 사용하여 유도 할 수 있다.

◈ Index Skip Scan을 하지 않도록 하고 싶다면 NO_INDEX_SS 힌트를 사용한다.

SELECT /*+ INDEX_SS(miod_div miod_div_idx) */ i_bugt_cdFROM miod_divWHERE d_io = '20010403'

AND o_io = 6AND i_io = '20'AND i_io_div = '6200'

SELECT STATEMENT CHOOSE-Cost : 4519TABLE ACCESS BY INDEX ROWID MATS.MIOD_DIV(1) INDEX SKIP SCAN MATS.MIOD_DIV_IDX(NU) (I_MATR,D_IO,O_IO,I_IO,I_IO_DIV)

첫 번째 컬럼의 분포도가 좋을때.

Index Skip Scan을 하면 속도가 느려짐

INDEX SKIP SCAN

Page 101: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

101

Rowid

> 발생• Rowid가 조건으로 공급된 경우

> Access 방식• Rowid를 이용해서 특정 Block의 특정 Row를 찾아간다

• 가장 빠른 Access 방식이다

SQL SQL AccsesAccses PatternPART 4 SQL 튜닝

Page 102: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

102

-Nested Loops JoinSQL SQL Join Pattern

> 발생• 연결고리에 이상이 없을 경우 발생한다. 즉 후행집합이 연결고리를 선행 컬럼으로

하는 인덱스가 있을 경우 발생한다.

> Access 방식• Driving집합의 조건을 만족하는 한 Row를 가지고 후행 집합을 Access해

가는 과정이 반복적으로 수행된다

• 부분범위처리에 유리함

SELECT A.FLD1, SELECT A.FLD1, ……,B.COL1,B.COL1……FROM TAB1 A, TAB2 BFROM TAB1 A, TAB2 B

WHERE A.KEY1 = B.KEY2WHERE A.KEY1 = B.KEY2AND A.FLD1 = AND A.FLD1 = ‘‘ABAB’’AND B.FLD2 = AND B.FLD2 = ’’1010’’

PART 4 SQL 튜닝

Page 103: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

103

> 실행계획select a.empno, a.ename, a.sal,a.deptno, b.dnamefrom emp a, dept bwhere a.deptno = b.deptnoand a.sal > 150

> planSELECT STATEMENT GOAL: CHOOSE NESTED LOOPS

TABLE ACCESS (FULL) OF 'EMP' TABLE ACCESS (BY [INDEX] ROWID) OF 'DEPT'

INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

-Nested Loops JoinSQL SQL Join Pattern PART 4 SQL 튜닝

Page 104: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

104

> 발생• 연결고리에 이상이 있을 경우 발생한다. 즉 후행집합이 연결고리를 선행 컬럼으로 하는 인덱스가

없을 경우 발생한다.

> Access 방식• 조인에 참여하는 양쪽 집합을 각각에 주어진 조건에

• 만족하는 것만 걸러내고 그 집합을 Merge 한다.• 관련 파레메터 : sort_area_size

- Merge JoinSQL SQL Join Pattern

SELECT A.FLD1, SELECT A.FLD1, ……, B.COL1, B.COL1……FROM TAB1 A, TAB2 BFROM TAB1 A, TAB2 B

WHERE A.KEY1 = B.KEY2WHERE A.KEY1 = B.KEY2AND A.FLD1 = AND A.FLD1 = ‘‘ABAB’’AND B.FLD2 = AND B.FLD2 = ’’1010’’

PART 4 SQL 튜닝

Page 105: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

105

> 실행계획SELECT /*+ use_merge(a b) */

a.empno, a.ename, a.sal,a.deptno, b.dname

FROM emp a, dept bWHERE a.deptno = b.deptnoAND a.sal > 20

> planSELECT STATEMENT GOAL: CHOOSE

MERGE JOINSORT (JOIN) <-- ①

TABLE ACCESS (FULL) OF 'EMP' SORT (JOIN) <-- ②

TABLE ACCESS (FULL) OF 'DEPT

- Merge JoinSQL SQL Join Pattern PART 4 SQL 튜닝

Page 106: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

106

> 발생• 대량의 데이터를 조인하거나 연결고리에 이상이 있을 경우 발생한다.

> Access 방식• 드라이빙 테이블을 먼저 읽어서 조건을 만족하는 것으로 Hash Table을 생성하고

후행 테이블을 읽어가면서 조인을 수행한다.• 관련 파레메터 : hash_area_size, hash_multiblock_io_count(8i 이하)

- Hash JoinSQL SQL Join Pattern

SELECT STATEMENT GOAL: CHOOSE HASH JOIN

TABLE ACCESS (FULL) OF 'EMP' TABLE ACCESS (FULL) OF 'DEPT'

PART 4 SQL 튜닝

Page 107: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

107

1. Random Access를 하지 않고 1회의 scan으로 처리(hash_area_size)

3. Sort를 하지 않고 Hash Function을 이용한 연산에 의해조인을 한다.(equal 비교)

2. 메모리 집중적인 조인 방식이다. (hash_area_size)

4. 중간집합이 작은 집합이 먼저 Hashing되어야 유리하다. (/*+ordered */)

Hash join 의 특징

Page 108: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

108

build inputbuild input

probe inputprobe input

Y = F(X)Y = F(X)

Y = F(X)Y = F(X)

SWAPPINGSWAPPING

HASH AREA

Hash join 의 원리

Page 109: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

109

SELECT /*+ORDERED USE_NL(X Y) */COUNT(Y.ACC_NM)

FROM AC_ACC_MST X,(SELECT USR_CMPNY, CHNL_GB, ACC_UNT, ACC_CD, ACC_NMFROM AC_SLP_DTLWHERE USR_CMPNY = 'TOONI' AND CHNL_GB = 'CH_A' AND ACC_UNT

= 'A') Y

WHERE X.ACC_CD = Y.ACC_CDAND X.YEAR_NO = '07'

Rows Execution Plan------- ---------------------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE1 SORT (AGGREGATE)

64388 NESTED LOOPS (OUTER)1057 INDEX (RANGE SCAN) OF 'SYS_C006306' (UNIQUE)

63806 TABLE ACCESS (BY INDEX ROWID) OF 'AC_SLP_DTL'67380192 INDEX (RANGE SCAN) OF 'DTL_IDX' (NON-UNIQUE)

155초

다른 join 과의 비교 Nested LoopPART 4 SQL 튜닝

Page 110: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

110

SELECT /*+ORDERED USE_MERGE(X Y) */COUNT(Y.ACC_NM)

FROM AC_ACC_MST X,(SELECT USR_CMPNY, CHNL_GB, ACC_UNT, ACC_CD, ACC_NMFROM AC_SLP_DTLWHERE USR_CMPNY = 'TOONI' AND CHNL_GB = 'CH_A' AND ACC_UNT

= 'A') Y

WHERE X.ACC_CD = Y.ACC_CDAND X.YEAR_NO = '07'

Rows Execution Plan------- ---------------------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE1 SORT (AGGREGATE)

64388 MERGE JOIN (OUTER)1057 INDEX (RANGE SCAN) OF 'SYS_C006306' (UNIQUE)

63806 SORT (JOIN)63806 TABLE ACCESS (BY INDEX ROWID) OF 'AC_SLP_DTL'63807 INDEX (RANGE SCAN) OF 'DTL_IDX' (NON-UNIQUE)

42초

다른 join 과의 비교 MergePART 4 SQL 튜닝

Page 111: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

111

SELECT /*+ORDERED USE_HASH(X Y) */COUNT(Y.ACC_NM)

FROM AC_ACC_MST X,(SELECT USR_CMPNY, CHNL_GB, ACC_UNT, ACC_CD, ACC_NMFROM AC_SLP_DTLWHERE USR_CMPNY = 'TOONI' AND CHNL_GB = 'CH_A' AND ACC_UNT

= 'A') Y

WHERE X.ACC_CD = Y.ACC_CDAND X.YEAR_NO = '07'

Rows Execution Plan------- ---------------------------------------------------

0 SELECT STATEMENT GOAL: CHOOSE1 SORT (AGGREGATE)

64388 HASH JOIN (OUTER)1056 INDEX (RANGE SCAN) OF 'SYS_C006306' (UNIQUE)

63806 TABLE ACCESS (BY INDEX ROWID) OF 'AC_SLP_DTL'63807 INDEX (RANGE SCAN) OF 'DTL_IDX' (NON-UNIQUE)

5초

다른 join 과의 비교 HashPART 4 SQL 튜닝

Page 112: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

112

SELECT /*+ USE_HASH (T1 T2) */ *FROM TBL_A T1, TBL_B T2

WHERE NVL(SUBSTR(T1.COL1,0,0), ‘ ‘) = NVL(SUBSTR(T1.COL2,0,0), ‘ ‘)AND ….. AND ……

SELECT /*+ NO_MERGE(V1) NO_MERGE(V2) USE_HASH(V1 V2) */ *FROM (SELECT ‘1’ SW, …. FROM TBL_1 T1 WHERE ……) V1,

(SELECT ‘1’ SW, …. FROM TBL_2 T2 WHERE ……) V2WHERE V1.SW = V2.SW

SELECT /*+USE_HASH(V1 V2) */ *FROM (SELECT ‘1’ SW, ROWNUM, …. FROM TBL_1 T1 WHERE …..) V1,

(SELECT ‘1’ SW, ROWNUM, …. FROM TBL_2 T2 WHERE …..) V2WHERE T1.SW = T2.SW

Hash join Tip

Hash join 이 불가능할경우 강제 하는방법

PART 4 SQL 튜닝

Page 113: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

113

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결

조인과조인과 서브쿼리서브쿼리

SELECT x.COL1, x.COL2, SELECT x.COL1, x.COL2, …………

y.COL1, y.COL2, y.COL1, y.COL2, ……......

FROM TAB1 x, TAB2 yFROM TAB1 x, TAB2 y

WHERE WHERE x.KEY = y.KEY

and and other_conditions …….. ;

조조

인인

SELECT COL1, COL2, SELECT COL1, COL2, …………

FROM TAB1FROM TAB1

WHERE WHERE KEY1 IN ( SELECT KEY2

FROM TAB2

WHERE conditions … ) ;

서서브브쿼쿼리리

TAB1 TAB2TAB1 TAB2 조인조인 서브쿼리서브쿼리

1 1 1 11 1 1 1

1 1 M m 1M m 1

M 1 m mM 1 m m

M M m*m M M m*m mm

관계형태에관계형태에 따라따라

전혀전혀 다른다른 집합집합 생성생성

TAB1 (主), TAB2(副)TAB1 (TAB1 (主主), ), TAB2(TAB2(副副))

TAB1와 TAB2는 동격TAB1TAB1와와 TAB2TAB2는는 동격동격

PART 4 SQL 튜닝

Page 114: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

114

서브쿼리서브쿼리 내에내에 메인쿼리메인쿼리

컬럼이컬럼이 없어야없어야 한다한다..

서브쿼리서브쿼리 수행결과수행결과를를 메인쿼리의메인쿼리의

처리주관처리주관 인덱스에인덱스에 제공할제공할 수수 있어야있어야 함함..

만약만약 이이 컬럼이컬럼이 체크기능체크기능 역할을역할을

한다면한다면 서브쿼리는서브쿼리는 확인자가확인자가 됨됨

서브쿼리가서브쿼리가 11쪽쪽((부모부모) ) 일일 때는때는 경우에경우에

따라따라 나중에나중에 수행되는수행되는 조인이조인이 되기도되기도

함함

Sort_MergeSort_Merge, Hash , Hash 조인으로조인으로 수행될수행될 때는때는

제공자제공자 역할을역할을 하지하지 못함못함

SELECT COL1, COL2, SELECT COL1, COL2, …………FROM TAB1 xFROM TAB1 xWHERE KEY1 IN ( SELECT KEY2WHERE KEY1 IN ( SELECT KEY2

FROM TAB2 yFROM TAB2 yWHERE WHERE y.COL1 ……

and y.COL2…… ))

and COL1 IN ( SELECT COL2and COL1 IN ( SELECT COL2

FROM TAB3 zFROM TAB3 zWHERE zWHERE z.COL1 …… )) ;

KEY1KEY1KEY1

COL1COL1COL1

먼저먼저 수행하는수행하는 서브쿼리서브쿼리(제공자 역할)

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 115: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

115

SELECT COL1, COL2, SELECT COL1, COL2, …………

FROM TAB1 xFROM TAB1 x

WHERE KEY1 IN ( SELECT KEY2WHERE KEY1 IN ( SELECT KEY2

FROM TAB2 yFROM TAB2 y

WHERE WHERE y.COL1 ……

and y.COL2…… ) ;) ;

TAB1TAB1 TAB2TAB21 : 1 : MM

1:1:MM의의 연결을연결을 1:11:1로로 만들기만들기 위해서위해서

MM쪽쪽 집합을집합을 UNIQUEUNIQUE하게하게 만들어만들어 제공제공

NESTED LOOPSNESTED LOOPS

VIEWVIEWSORT(UNIQUE)SORT(UNIQUE)

TABLE ACCESS BY ROWID OF TABLE ACCESS BY ROWID OF TAB2

INDEX RANGE SCAN OF COL1_IDXINDEX RANGE SCAN OF COL1_IDX

TABLE ACCESS BY ROWID OF TABLE ACCESS BY ROWID OF TAB1

INDEX RANGE SCAN OF KEY1_INXINDEX RANGE SCAN OF KEY1_INX

그러므로그러므로 서브쿼리서브쿼리 사용시사용시 M:MM:M의의 연결은연결은 M:1 M:1 로로 연결된연결된 결과가결과가 생성생성

제공자제공자 서브쿼리의서브쿼리의 실행계획실행계획

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 116: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

116

인덱스가인덱스가 KEY1 + KEY2KEY1 + KEY2로로 되어되어 있다면있다면

SELECT COL1, COL2, SELECT COL1, COL2, …………FROM TAB1FROM TAB1

WHERE KEY1 LIKE WHERE KEY1 LIKE ‘‘ABC%ABC%’’and KEY2 IN ( SELECT COL2and KEY2 IN ( SELECT COL2

FROM TAB2 yFROM TAB2 yWHERE y.COL1 WHERE y.COL1 …………

and y.COL2and y.COL2………… ) )

and COL2 = and COL2 = ‘‘111111’’ ; ;

NESTED LOOPSNESTED LOOPS

VIEWVIEWSORT(UNIQUE)SORT(UNIQUE)

TABLE ACCESS BY ROWID OF TAB2TABLE ACCESS BY ROWID OF TAB2

INDEX RANGE SCAN OF COL1_IDXINDEX RANGE SCAN OF COL1_IDX

TABLE ACCESS BY ROWID OF TAB1TABLE ACCESS BY ROWID OF TAB1

INDEX RANGE SCAN OF INDEX1INDEX RANGE SCAN OF INDEX1

실행계획실행계획 형태상으로형태상으로는는 문제가문제가 없음없음

KEY1 LIKE, KEY2 = KEY1 LIKE, KEY2 = 형태의형태의 범위처리가범위처리가

서브쿼리가서브쿼리가 제공한제공한 만큼만큼 반복수행됨반복수행됨

즉즉, , 인덱스인덱스 선두선두 컬럼이컬럼이 ‘‘==‘‘이이 아니므로아니므로

KEY2KEY2는는 단지단지 체크기능만체크기능만 담당함담당함

그러나그러나

그러므로그러므로 KEY1 LIKE KEY1 LIKE 범위가범위가

다량다량 반복반복 수행됨수행됨

제공자제공자 서브쿼리서브쿼리 사용시사용시 주의사항주의사항

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 117: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

117

SELECT COL1, COL2, SELECT COL1, COL2, …………FROM TAB1 xFROM TAB1 xWHERE KEY1 IN ( SELECT KEY2WHERE KEY1 IN ( SELECT KEY2

FROM TAB2 yFROM TAB2 y

WHERE WHERE y.COL1 >= x.FLD1and y.COL2and y.COL2………… ))

and EXISTS ( SELECT and EXISTS ( SELECT ‘’‘’

FROM TAB3 zFROM TAB3 zWHERE WHERE z.COL = x.FLD ... )) ;

서브쿼리서브쿼리 내에내에 메인쿼리컬럼이메인쿼리컬럼이

있으면있으면 논리적으로논리적으로 제공자제공자 역할을역할을

할할 수수 없으므로없으므로 확인자확인자 역할역할

EXISTSEXISTS를를 사용한사용한 경우는경우는 대부분의대부분의 경우경우

서브쿼리서브쿼리 내에내에 메인쿼리메인쿼리 컬럼이컬럼이 존재하고존재하고

결과결과를를 제공받제공받을을 메인쿼리메인쿼리 컬럼이컬럼이 존재하존재하

지지 않으므로않으므로 대개대개 확인자확인자 역할역할을을 하게됨하게됨

SORT_MERGE SORT_MERGE 조인으로조인으로 수행되는수행되는

경우도경우도 있음있음

제공자제공자 역할을역할을 기대한기대한 서브쿼리가서브쿼리가

확인자확인자 역할을역할을 하면하면 심각한심각한 오버헤오버헤

드가드가 발생발생

나중에나중에 수행하는수행하는 서브쿼리서브쿼리((확인자확인자 역할역할))

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 118: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

118

SELECT SELECT 사번사번, , 성명성명, , 직급직급, , 입사일입사일, , ……………………

FROM FROM 사원사원 xx

WHERE WHERE 부서부서 = = ‘‘경리과경리과’’

and and 사번사번 IN ( SELECT IN ( SELECT 사번사번

FROM FROM 가족가족 yy

WHERE WHERE y.사번 = x.사번

and y.and y.생년월일생년월일 < < ‘‘1930010119300101’’ ) ;) ;

사원사원 가족가족1 : 1 : MM

마찬가지로마찬가지로 서브쿼리서브쿼리 사용시사용시 M:MM:M은은 M:1 M:1 로로 연결된연결된 결과가결과가 생성생성

1:1:MM의의 연결을연결을 1:11:1로로 만들기만들기 위해서위해서

MM쪽쪽 집합을집합을 EXISTS EXISTS 개념으로개념으로 수행수행

TABLE ACCESS (BY ROWID) OF TABLE ACCESS (BY ROWID) OF ’’사원''

INDEX (RANGE SCAN) OF INDEX (RANGE SCAN) OF ’’부서부서__INDEX'INDEX'

FILTERFILTER

TABLE ACCESS (BY ROWID) OF TABLE ACCESS (BY ROWID) OF ’’가족가족''

INDEX (RANGE SCAN) OF INDEX (RANGE SCAN) OF ’’PK_INDEX'PK_INDEX'

조건조건을을 만족하는만족하는 첫번째첫번째로우로우를를 만나면만나면 종료종료

확인자확인자 서브쿼리의서브쿼리의 실행계획실행계획

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 119: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

119

SELECT SELECT 사번사번, , 성명성명, , 직급직급, , 입사일입사일, , ……………………

FROM FROM 사원

WHERE WHERE 직책직책 = = ‘‘과장과장’’

and and 부서 IN ( SELECT IN ( SELECT 부서

FROM FROM 근태

WHERE WHERE 일자일자 LIKE LIKE ‘‘199807%199807%’’

and and 근태유형근태유형 = = ‘‘무단결근무단결근’’) ;) ;

서브쿼리도서브쿼리도 조인처럼조인처럼 SORT_MERGE SORT_MERGE 형태로형태로 수행될수행될 수수 있다있다..

SORT (JOIN)SORT (JOIN)

TABLE ACCESS (FULL) OF 'TABLE ACCESS (FULL) OF '사원사원''

SORT (JOIN)SORT (JOIN)

VIEWVIEW

MERGE JOINMERGE JOIN

SORT (UNIQUE)SORT (UNIQUE)

TABLE ACCESS (BY ROWID) OF 'TABLE ACCESS (BY ROWID) OF '근태근태''

INDEX (RANGE SCAN) OF 'IDX1'INDEX (RANGE SCAN) OF 'IDX1'

연결조건인연결조건인 ‘‘부서부서’’ 컬럼에컬럼에

양쪽양쪽 모두모두 인덱스가인덱스가 없다면없다면

SORT_MERGE SORT_MERGE 처리처리될될 확확률률이이 높다높다..

1 : M1 : 1 : MM

M : MM : MM : M

M:M M:M 조인이므로조인이므로 서브쿼리서브쿼리 결과는결과는

UNIQUEUNIQUE을을 만든만든 후후 조인조인 수행수행

SORT_MERGE SORT_MERGE 형태의형태의 수행수행

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 120: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

120

FILTERFILTER

TABLE ACCESS BY ROWID OF 'TAB1' TABLE ACCESS BY ROWID OF 'TAB1'

INDEX (RANGE SCAN) OF 'COL1_INDEX' INDEX (RANGE SCAN) OF 'COL1_INDEX'

TABLE ACCESS (BY ROWID) OF 'TAB2' TABLE ACCESS (BY ROWID) OF 'TAB2'

INDEX (RANGE SCAN) OF 'FLD3_INDEX'INDEX (RANGE SCAN) OF 'FLD3_INDEX'

SELECT COUNT(*)SELECT COUNT(*)

FROM TAB1FROM TAB1

WHEREWHERE

and COL2 and COL2 NOT INNOT IN (SELECT FLD2(SELECT FLD2

FROM TAB2FROM TAB2

WHERE FLD3 LIKE WHERE FLD3 LIKE ‘‘1998%1998%’’ ) ;) ;

COL1 like COL1 like ‘‘ABC%ABC%’’

SORT_MERGE SORT_MERGE ANTI ANTI 조인으로조인으로 유도유도

COL1COL1의의 처리범위가처리범위가 매우매우 넓다면넓다면

서브쿼리가서브쿼리가 다량의다량의 랜덤랜덤 액세스액세스를를 발생발생

HASH ANTI HASH ANTI 조인으로조인으로 유도유도

부정형부정형((ANTI) ANTI) 조인조인

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 121: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

121

SELECT COUNT(*)SELECT COUNT(*)

FROM TAB1FROM TAB1

WHERE COL1 like WHERE COL1 like ‘‘ABC%ABC%’’

and COL2 and COL2 NOT INNOT IN (SELECT (SELECT

FLFLD2D2

FROM TAB2FROM TAB2

WHERE FLD3 LIKE WHERE FLD3 LIKE ‘‘1998%1998%’’

) ;) ;

MERGE JOIN (ANTI)MERGE JOIN (ANTI)SORT (JOIN)SORT (JOIN)

TABLE ACCESS (BY ROWID) OF 'TAB1' TABLE ACCESS (BY ROWID) OF 'TAB1'

INDEX (RANGE SCAN) OF 'COL1_IDX'INDEX (RANGE SCAN) OF 'COL1_IDX'

SORT (UNIQUE)SORT (UNIQUE)

VIEW VIEW

TABLE ACCESS (BY ROWID) OF 'TAB2' TABLE ACCESS (BY ROWID) OF 'TAB2'

INDEX (RANGE SCAN) OF 'FLD3_IDX' INDEX (RANGE SCAN) OF 'FLD3_IDX'

힌트힌트 사용사용

andand COL2 IS NOT NULLCOL2 IS NOT NULL

andand FLD2 IS NOT NULLFLD2 IS NOT NULL

/*+ /*+ MERGE_AJ */MERGE_AJ */

NOT NULL NOT NULL 지정지정

NOT INNOT IN 사용시만사용시만 가능가능

MERGE ANTI MERGE ANTI 조인조인

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 122: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

122

SELECT COUNT(*)SELECT COUNT(*)

FROM TAB1FROM TAB1

WHERE COL1 like WHERE COL1 like ‘‘ABC%ABC%’’

and COL2 and COL2 NOT INNOT IN (SELECT (SELECT

FLFLD2D2

FROM TAB2FROM TAB2

WHERE FLD3 LIKE WHERE FLD3 LIKE ‘‘1998%1998%’’

) ;) ;

HASH JOIN (ANTI)HASH JOIN (ANTI)

TABLE ACCESS (BY ROWID) OF 'TAB1' TABLE ACCESS (BY ROWID) OF 'TAB1'

INDEX (RANGE SCAN) OF 'COL1_IDX' INDEX (RANGE SCAN) OF 'COL1_IDX'

VIEW VIEW

TABLE ACCESS (BY ROWID) OF 'TAB2' TABLE ACCESS (BY ROWID) OF 'TAB2'

INDEX (RANGE SCAN) OF 'FLD3_IDX'INDEX (RANGE SCAN) OF 'FLD3_IDX'

힌트힌트 사용사용

and COL2 IS NOT NULLand COL2 IS NOT NULL

and FLD2 IS NOT NULLand FLD2 IS NOT NULL

/*+ /*+ HASH_AJ */HASH_AJ */

NOT NULL NOT NULL 지정지정

NOT INNOT IN 사용시만사용시만 가능가능

HASH ANTI HASH ANTI 조인조인서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결

PART 4 SQL 튜닝

Page 123: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

123

액세스경로와 수행속도

수행시간수행시간 : 16,000 : 16,000 초초

20002000만만 ROWSROWS

((월월500500만건만건))

REQTREQT

TABLETABLE INDEXINDEX

CUST_NOCUST_NO++

REQ_YMREQ_YMUPDATE REQT xUPDATE REQT xSET IN_AMT = SET IN_AMT = IN_AMTIN_AMT + :AMT+ :AMT

WHERE REQ_YM = WHERE REQ_YM = ‘‘199706199706’’AND CUSTNO INAND CUSTNO IN ( ( SELECT CUSTNOSELECT CUSTNO

FROM CUST yFROM CUST yWHERE PAY_CUST = :CUSTWHERE PAY_CUST = :CUST

ANDAND x.CUSTx.CUST = = y.CUSTy.CUST ))20002000만만 건건Full ScanFull Scan

500500만만 회회반복반복 수행수행

UPDATE REQT xUPDATE REQT xSET IN_AMT = SET IN_AMT = IN_AMTIN_AMT + :AMT+ :AMT

WHERE REQ_YM = WHERE REQ_YM = ‘‘199706199706’’AND CUSTNO INAND CUSTNO IN ( SELECT CUSTNO( SELECT CUSTNO

FROM CUST yFROM CUST yWHERE PAY_CUST = :CUST )WHERE PAY_CUST = :CUST )

1 1 회회먼저먼저 수행수행

해당고객만해당고객만처리처리

수행시간수행시간 : 0.1 : 0.1 초초

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 124: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

124

SELECT x.COL1, x.COL2, min(x.COL4), min(x.COL5)

FROM TAB1 x, TAB2 yWHERE x.COL1 = y.FLD1

and x.COL2 = y.FLD2and x.COL3 between ‘11’ and ‘99’and y.FLD3 like ‘199803%’

GROUP BY COL1, COL2

HAVING sum(FLD4) > 0 ;

전체범위처리전체범위처리

SELECT *FROM TAB1WHERE (COL1, COL2)

IN (SELECT FLD1, FLD2FROM TAB2WHERE FLD3 like ‘199803%’GROUP BY FLD1, FLD2HAVING sum(FLD4) > 0 )

and COL3 between ‘11’ and ‘99’ ;

SELECT *FROM TAB1WHERE (COL1, COL2)

IN (SELECT FLD1, FLD2FROM TAB2WHERE FLD3 like ‘199803%’GROUP BY FLD1, FLD2HAVING sum(FLD4) > 0 )

and COL3 between ‘11’ and ‘99’ ;SELECT COL1, COL2, COL4, COL5FROM TAB1 WHERE COL3 between ‘11’ and ‘99’

and EXISTS (SELECT ‘ ‘FROM TAB2WHERE FLD1 = COL1

and FLD2 = COL2and FLD3 like ‘199803%’

GROUP BY FLD1, FLD2HAVING sum(FLD4) > 0 ) ;

SELECT COL1, COL2, COL4, COL5FROM TAB1 WHERE COL3 between ‘11’ and ‘99’

and EXISTS (SELECT ‘ ‘FROM TAB2WHERE FLD1 = COL1

and FLD2 = COL2and FLD3 like ‘199803%’

GROUP BY FLD1, FLD2HAVING sum(FLD4) > 0 ) ;

만약만약 TAB2 TAB2 처리범위가처리범위가 보다보다 좁다면좁다면

서브쿼리에서서브쿼리에서 결과결과를를 제공하도록제공하도록

만약만약 TAB1 TAB1 처리범위가처리범위가 보다보다 좁다면좁다면

서브쿼리에서서브쿼리에서 필터처리필터처리 하도록하도록

부분범위처리부분범위처리

서브쿼리를서브쿼리를 이용한이용한 부분범위처리부분범위처리

서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결PART 4 SQL 튜닝

Page 125: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

125

SELECT 종목, 고객번호, 변경회차, 변경일, 금액

FROM 변경내역 xWHERE 변경회차 = ( SELECT MAX(y.변경회차)

FROM 변경내역 yWHERE y.고객번호 = x.고객번호

and y.변경일 LIKE ‘199807%’ )and 종목 = ‘15’and 변경일 LIKE ‘199807%’ ;

SELECT 종목, 고객번호, 변경회차, 변경일, 금액

FROM 변경내역 xWHERE 변경회차 = ( SELECT MAX(y.변경회차)

FROM 변경내역 yWHERE y.고객번호 = x.고객번호

and y.변경일 LIKE ‘199807%’ )and 종목 = ‘15’and 변경일 LIKE ‘199807%’ ;

서브쿼리는서브쿼리는 확인자확인자 역할을역할을 담당담당

모든모든 처리대상에처리대상에 대해대해 중복중복 액세스액세스

종목종목++변경일변경일, , 고객번호고객번호++변경일변경일22개의개의 인덱스인덱스 필요필요

부분범위처리시부분범위처리시 유리할유리할 수도수도 있음있음

SELECT SELECT ‘‘1515’’ 종목종목, , 고객번호고객번호, , substr(VAL,1,3) substr(VAL,1,3) 변경회차변경회차,,substr(VAL,4,8) substr(VAL,4,8) 변경일변경일,,substr(VAL,12,15) substr(VAL,12,15) 금액금액

FROM (SELECT FROM (SELECT 고객번호고객번호,,MAX(RPAD(변경회차,3)||변경일||금액) VAL

FROM FROM 변경내역변경내역

WHERE WHERE 종목종목 = = ‘‘1515’’and and 변경일변경일 LIKE LIKE ‘‘199807%199807%’’

GROUP BY GROUP BY 고객번호고객번호) ;) ;

결합한결합한 컬럼의컬럼의 MAXMAX를를 취해취해 분할분할

모든모든 처리대상에처리대상에 대해대해 한번한번 액세스액세스

종목종목++변경일변경일 인덱스만인덱스만 필요필요

전체범위처리전체범위처리

MIN, MAX MIN, MAX 값을값을 가진가진 로우로우 액세스액세스서브쿼리를서브쿼리를 이용한이용한 데이터데이터 연결연결

PART 4 SQL 튜닝

Page 126: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

126

Optimizer 아키텍쳐아키텍쳐

> 1.파싱(Parser)> 2.옵티마이저(Query Optimizer)> 3.로우소스 생성(Row Source Generator)> 4.SQL 실행(SQL Execution Engine)

옵티마이져옵티마이져 아키텍쳐아키텍쳐<<그림그림2>2>

1.파싱 단계에서 SQL은 구문(syntax)과 의미(semantics) 검사를 수행한다. 예를 들어, SQL 구문이 정확한지를 검사하고, 참조된 테이블에 대해 사용자의 접근 권한 등을 검사한다.이 단계가 끝나면, SQL문은 파싱 트리(parsed tree) 형태로 변형되어 옵티마이저에게넘겨진다.

2.옵티마이저 단계는 앞에서 넘겨받은 파싱 트리를 이용해 최적의 실행 계획을 고른다. <그림2>에서 점선 형태의 사각형으로 표시된 부분이 옵티마이저의 주요 구성 요소를 보여주고 있는데, 뒤에서 각 구성 요소의 역할에 대해 자세히 설명하겠다.

3.로우소스 생성 단계는 옵티마이저에서 넘겨받은 실행 계획을 내부적으로 처리하는 자세한방법을 생성하는 단계이다. ‘로우소스’란 실행 계획을 실제로 구현하는 인터페이스 각각을 지칭하는 말로, 테이블 액세스 방법, 조인 방법, 그리고 블럭 등을 위한 다양한 로우소스가제공된다. 따라서 이 단계에서는 실행 계획에 해당하는 트리 구조의 로우소스가 생성된다.

4. SQL 실행 단계는 앞서 생성된 로우소스를SQL 수행 엔진에서 수행해 결과를 사용자에게돌려주는 과정이다.

PART 4 SQL 튜닝

Page 127: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

127

Optimizer 아키텍쳐아키텍쳐

> 옵티마이져는 크게 세가지 모듈로 진행된다.• 1.질의 변환(Query Rewriter)• 2.실행 계획 생성(Plan Generator)• 3.비용 산정(Estimator)

> 1.질의변환(Query Rewriter 또는 Transformer)

질의 변환(Query Rewriter 또는 Transformer) 단계는 파싱트리를 받아들여서 질의 변환을 수행한다. 이 변환 과정을 통해의미적으로 같은 결과를 수행하지만, 더 나은 실행 계획을 찾을 수 있는 SQL문으로 변환함으로써 질의의 수행 처리 속도를 높이는데그 목적이 있다. 오라클 옵티마이저가 수행하는 질의 변환은 크게 두 종류로 구분할 수 있다.

1.휴리스틱(Heuristic based) 질의 변환 : 이 변환의 종류로는 크게 View Merging, Subquery Unnesting, Push Predicate , PartitionPruning 등이 있는데, 이들 변환은 가능한 경우에 항상 질의 변환을 수행한다. 왜냐하면 이와 같은 변환은 경험적으로 거의 항상원래 질의보다 더 빠른 수행 속도를 보장하기 때문이다.

2.비용기반(Cost based) 질의 변환 : 이 변환의 예로는 MV Rewrite, Star Query Transformation, OR-expansion 등을 들 수 있다. 그런데 이 방법을 사용해 변환된 SQL문이 원래 SQL문보다 속도가 더 빠르다는 보장이 없다. 따라서 변환 전후의 두 SQL문에 대해각각 최선의 실행 계획을구하고, 이들의 비용을 비교해 더 효율적인 실행 계획을 최종적으로 선택한다.

3.질의 변환 단계가 끝나면, 오라클 옵티마이저는 실행 계획 생성과 비용 산정 모듈을 수행하기 앞서 질의에서 사용된 모든 테이블과 각 테이블에 정의된 인덱스에 관한 기본적인 통계 정보(예를 들어, 테이블의 블럭 개수, 로우 평균 길이, 인덱스의 높이,인덱스 리프 블럭의 개수 등)과 각 테이블에 대한 다양한 액세스 경로(예를 들어 풀 테이블 스캔, 인덱스 스캔 등)에 대한비용 정보를미리 구해둔다.

PART 4 SQL 튜닝

Page 128: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

128

Optimizer 아키텍쳐아키텍쳐

>> 22..실행실행 계획계획 생성생성(Plan Generator)(Plan Generator)

이 모듈은 옵티마이저가 새로운 실행 계획을 만드는 것이다. 오라클 옵티마이저는 제일 먼저 각 테이블의 레코드수를 기준으로 오름차순으로 결정한다. 예를 들어, SQL 질의의 from절에서 T1, T2, T3 순서로 참조한 경우, 각 테이블의 카디널러티(cardinality : 테이블의 튜플 수)가 T1 > T2 > T3 순이라면 제일 처음 고려하는조인 순서는 (T3ⓧT2)ⓧT1이 된다.

이 조인 순서에 대해 다음 단계인 비용 산정 모듈을 호출해 이 조인 순서에 따르는 실행 계획과 각 실행 계획의비용을구한다. 그리고 더 이상의 새로운 조인 순서가 없을 때까지 계속 새로운 조인 순서를 만들어서 비용을계산한다.

이 모듈은 지금까지 찾아낸 가장 좋은 실행 계획과 그 비용을 저장하고있다. 이 단계는 최종적으로 구해진 최적의 실행 계획을 <그림 2>의 로우 생성 단계에 넘겨준다.한 sql 에 테이블 개수가 많으면 가능한 조인 순서의 조합이 기하급수적으로 늘어나게된다. 이렇게 되면 옵티마이저

시간이 너무 많이 걸리기 때문에, 옵티마이저는 일정한 수(디폴트로는 최대 80,000)의 인 순서에 대해서만비용을 계산하고 이 중에서 가장 최선의 실행 계획을 찾게 된다. 즉, 모든 가능한 조인 순서 조합들 중에서일부분만 비용을 계산하고, 나머지는 고려하지 않는 것이다. 이를 실행 계획 탐색에 대한 가지치기(pruning) 또는 컷오프(cutoff)라 부른다. 그런데 고려되지 않은 조인 순서 중에서 실제로 최선의 실행 계획을 포함하고있을 수 있다. 옵티마이저가 제일 처음 고려하는 조인 순서를 테이블 레코드 수의 오름차순 순서로 정하는 이유는경험적으로 이 순서를 근처로 실제로 최적의 실행 계획이 존재하기 때문이다. 이와 같이 초기 조인 순서를선택하는 휴리스틱을 사용함으로써 임으로 조인 순서를 시작했을 때 최적의 좋은 실행 계획이 컷오프되는 것을막을 수 있다.

오라클 옵티마이저 실행 계획 생성 모듈(오라클9i부터 도입된)의 또 다른 특징은, 조인 순서를 바꿔가면서 지금까지구한 최적의 실행 계획의 예상 비용이 그리 크지 않은 경우에 최적화 단계를 일찍 끝내버린다. 예를 들어, 어떤질의에 대해 10초 동안 최적화를 수행해서 찾은 최적 실행 계획의 예상 수행시간이 1분이면 남은 조인순서가 더있더라도 옵티마이저 단계를 종료한다. 반면에, 지금까지 구한 최적 예상 수행 시간이 2시간이면 더 나은 실행

계획을 찾기 위해 새로운 조인 순서에 대해 계속 탐색할 필요가 있다. 이를 적응성 탐색 전략(adaptive search strategy)이라 부른다.

PART 4 SQL 튜닝

Page 129: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

129

Optimizer 아키텍쳐아키텍쳐

>3.비용산정(Estimator)

• 실행 계획 생성 모듈에서 넘겨받은 특정 조인 순서의 각 조인에 대해 중첩루프, 블럭 병합, 해시 조인 방식과 각 테이블의 다양한 액세스 방법을 반복 적용하면서각 단계별로 비용을 계산한다. 그리고 궁극적으로 해당 조인 순서에서 찾을 수 있는최선의 실행 계획과 그 예상 비용을 구해 실행 계획 생성 모듈에게 넘겨준다.현재의 조인 순서에 대해 중간 단계까지의 수행 비용이 실행 계획 생성 모듈에서지금까지 구한 최선의 예상 비용보다 더 크다면 해당 조인 순서에 대해서는 더이상비용 산정을 수행하지 않고 끝낸다. 예를 들어, T1, T2, T3에 대해(T1ⓧT2)ⓧT3 순서의 비용이 1000이었는데, (T1ⓧT3)ⓧT2 순서의 (T1ⓧT3)

비용이 1200이었다면 더이상 비용을 계산할 필요가 없다.• <그림 2>에 나와 있는 것처럼 옵티마이저는 실행 계획의 비용을 계산하기 위한 비용 모델을

갖고 있고, 이 비용 모델은 오라클 데이터 딕셔너리에서 관리하는 다양한 통계 정보를기반으로 크게 다음과 같은 세 가지 값(measure)의 예상치를 계산한다.

• 선택도(selectivity) : where절에 있는 다양한 조건들의 선택도 계산• 카디널러티(cardinality) : 실행 계획상의 각 연산 결과 카디널러티 수 계산• 비용(cost) : 실행 계획상의 각 연산을 수행하는 데 소요되는 시간 비용 계산

PART 4 SQL 튜닝

Page 130: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

130

Optimizer 아키텍쳐아키텍쳐

>3.비용산정(Estimator) - 계속

• 선택도 : d.loc = ‘SEOUL’라는 조건의 선택도는 dept 테이블 전체 중에서 loc의값이‘SEOUL’인 레코드의 비율을 일컫는다. 옵티마이저는 선택도 계산을 통해 해당 조건을만족하는 레코드가 몇 건 정도가 되는지를 예측하게 된다. 옵티마이저는 만일 DBA_TABLES에dept 테이블의 loc 컬럼의‘distinct column values’가 10 이라면 옵티마이저는 선택도가0.1이라고 판단하게 된다. 이때 선택도를이와 같이 정하는 이유는 dept 테이블의 loc 컬럼이골고루 분포되어 있다고 가정할 때 성립한다.

• 히스토그램의 필요성 : 실제로 loc 컬럼의 값들이 스큐(skew)돼 분포할 수도있다. 예를 들어, 전체 레코드의 50%가 loc 값으로 ‘SEOUL’을 갖는다면 잘못된 선택도 값을얻게 된다. 이와 같이 데이터 분포가 스큐돼 있는 경우, 해당 컬럼에 대한 히스토그램 정보를DBA_HISTOGRAM 테이블에 만들어 주어야 정확한 선택도 값을 계산할 수 있다(이 경우는 0.5). 오라클 옵티마이저는 다양한 조건식의 종류에 대해 선택도를통계정보에 기반해 계산하는 수식을 내부적으로 갖고있다. 그렇지만 어떤 경우에는 dept 테이블이 아직 분석되지 않아서 통계정보가 없다면 옵티마이저는 내부적으로 갖고 있는 디폴트값을 선택도로 지정한다(예를 들어, 0.01).

히스토그램히스토그램((Histogram)Histogram)

MinMin MaxMax

PART 4 SQL 튜닝

Page 131: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

131

Optimizer 아키텍쳐아키텍쳐

>3.비용산정(Estimator) - 계속

• 카디널러티 : 앞의 dept 테이블의 전체 레코드 건수가 1000일 때, 앞서 설명한 loc = ‘SEOUL’의 선택도가 0.1로 계산되면 조건을 만족하는 레코드 건수는 1000 x 0.1, 즉100개로 예상할 수 있다. 이와 같이 어떤연산을 수행한 결과로 나오는 레코드 건수를 카디널러티라 하는데, 정확한 카디널러티를계산하는 것은 좋은 실행 계획을 만드는데 있어서 굉장히 중요하다. 예를 들어, (T1ⓧT2)ⓧT3 순서로 테이블을 조인할 경우 (T1ⓧT2)의 결과와 T3를 조인하면 어떤 조인 방법을 선택하는것이 좋을지를 결정하기 위해서는 (T1ⓧT2)의 크기를 정확하게 알아야 한다. 이를 위해서는(T1ⓧT2) 조인의 결과 레코드가 몇 개인지를 예상할 수 있어야 한다. 이를위해 오라클옵티마이저는 다양한 연산 결과 레코드의 카디널러티를 통계정보와 수식에 의해 계산한다. T1과 T2의 조인 조건이 T1.c1 =T2.c2(이를 P 표기)라 했을 때, 앞서 설명한 선택도계산 공식에 의해 이조건식의 선택도 Sel(P)를 먼저 계산하면 조인의 결과 카디널러티는Card(T1) x Card(T2) x Sel(P)가 된다. 예를 들어, T1, T2의 튜플 수가 각각 1000, 5000이고 Sel(P)가 0.01이면, 조인 결과로 생기는 튜플 수는 1000 x 5000 x 0.01 = 5000이 된다. 그런데 Sel(P)가 조금이라도 틀리면 이후의 전체적인 비용 산정이 잘못되게된다. 오라클 옵티마이저는 다양한 종류의 연산에 대해 카디널러티를 계산하는 내부 공식을사용한다.

Page 132: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

132

Optimizer 아키텍쳐아키텍쳐

>3.비용산정(Estimator) - 계속

• 비용 : 비용은 테이블 액세스, 조인 등을 수행하는 데 걸리는 시간을 의미하는데, 시간은 주로디스크 I/O 수와 CPU 사용시간을 고려한다. 비용은 앞서 계산한 통계 정보와 내부 계산식에의해 계산된다. 예를 들어, T1ⓧT2를 중첩 루프 방식으로 조인할 경우 조인 비용은(T1의 데이터 블럭 수)+ ((T1의 레코드 건수)×T2의 액세스 비용))이 된다. 이처럼 오라클 옵티마이저는 모든 연산에 대해 소요되는 비용을 계산하는 수식을 갖고 있다.

• 이 비용 산정을 위한 통계 정보를 저장하는 데이터 딕셔너리 테이블은 DBA_TABLES, DBA_INDEXES, DBA_TAB_COL_STATISTICS, DBA_HISTOGRAMS 등이다.이 통계 정보는 앞서 언급한 테이블 액세스 경로의 비용 정보를 결정하는 데도 사용된다. 이들 테이블 정보는 사용자가 ANALYZE 명령어나 DBMS_STATS 패키지를 이용해 관리하게 된다.

• 만일에 테이블과 인덱스에 대한 통계 정보가 존재하지 않는 경우 옵티마이저는 해당 테이블과인덱스에 대해 디폴트로 가정하는 값들이 있다.(참고자료 Surajit Chaudhuri, An Overview of Query Optimization in Relational Systems, AMM PODS Tutorial, 1998)

PART 4 SQL 튜닝

Page 133: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

133

서브쿼리의 이용(UNNESTING QUERY)

> UNNESTING QUERY• 서브쿼리를 메인쿼리와 합쳐 조인 형태로 변형하도록 하는 것

• EXISTS를 사용하는 경우 대부분 FILTER 처리 방식으로 실행계획이수립되는데 메인쿼리에 비교할 컬럼(연결고리)이 정렬되어 있지 않고, 서브쿼리에 존재할 확률이 낮을때 랜덤 액세스가 증가할 가능성이 높아 불리할경우 사용한다 (Sort Merge형이나 해쉬조인으로 유도)

• UNNEST 힌트를 이용해 UNNESTING을 유도한다

SELECT /*+ RULE */ *FROM EMP E WHERE COMM = 500 AND EXISTS ( SELECT

D1.DEPTNO FROM DEPT D1 WHERE D1.DEPTNO = E.DEPTNO)

SELECT STATEMENT Optimizer Mode=HINT: RULE

FILTER

TABLE ACCESS BY INDEX ROWID SCOTT.EMP

INDEX RANGE SCAN SCOTT.EMP_IDX1

INDEX UNIQUE SCAN SCOTT.PK_DEPT

SELECT /*+ UNNEST (@qb) */*FROM EMP E WHERE COMM = 500 AND EXISTS ( SELECT /*+ QB_NAME (qb) */

D1.DEPTNO FROM DEPT D1 WHERE D1.DEPTNO = E.DEPTNO)

SELECT STATEMENT Optimizer Mode=ALL_ROWS

NESTED LOOPS SEMI

TABLE ACCESS BY INDEX ROWID SCOTT.EMP

INDEX RANGE SCAN SCOTT.EMP_IDX1

INDEX UNIQUE SCAN SCOTT.PK_DEPT

PART 4 SQL 튜닝

Page 134: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

134

인라인뷰(VIEW MERGING)

> VIEW MERGING• 뷰나 인라인뷰의 액세스를 최적화하기 위해서 뷰쿼리에 사용된 원래의 테이블을

최적으로 액세스 하도록 변환

VIEW 생성(avg_salary_view)

CREATE VIEW avg_salary_view ASSELECT deptno, AVG(sal) AS avg_sal_deptFROM empGROUP BY deptno;

SELECT

dept.loc, avg_sal_dept

FROM dept, avg_salary_view

WHERE dept.deptno = avg_salary_view.deptno

AND dept.loc = 'London';

PART 4 SQL 튜닝

Page 135: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

135

인라인뷰(VIEW MERGING)

SELECT /*+ MERGE(avg_salary_view) */

dept.loc, avg_sal_dept

FROM dept, avg_salary_view

WHERE dept.deptno =

avg_salary_view.deptno

AND dept.loc = 'London';

SELECT dept.loc, AVG(sal)

FROM dept, emp

WHERE dept.deptno = emp.deptno

AND dept.loc = 'London'

GROUP BY dept.rowid, dept.loc;

VIEW MERGINGVIEW MERGING

PART 4 SQL 튜닝

Page 136: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

136

PUSH PREDICATE(조건절 진입)

> 발생하는경우• VIEW MERGING 이 안되는 경우에 조인이 NESTED LOOP 로 풀릴때

VIEW 안에 조건절이 진입한다.• VIEW 구성이 UNION ALL 로 되어 있는 경우.• VIEW 에 아우터 조인이 걸릴경우.

> 예제create or replace view v1 asselect

t2.id1,t2.id2,t3.small_vc,t3.padding

fromt2, t3

wheret3.id1 = t2.id1

and t3.id2 = t2.id2;

> 예제

select t1.*, v1.*

from t1, v1

where t1.n1 = 5

and t1.id1 between 10 and 50and v1.id1(+) = t1.id1;

PART 4 SQL 튜닝

Page 137: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

137

PUSH PREDICATE(조건절 진입)

The 10g execution plan----------------------

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

2 - filter("T1"."N1"=5)3 - access("T1"."ID1">=10 AND "T1"."ID1"<=50)7 - access("T3"."ID1"="T1"."ID1")8 - access("T2"."ID1"="T1"."ID1" AND "T3"."ID2"="T2"."ID2")

Notice particularly that the 10g plan no longer has a FILTER operation,and all those redundant filter_predicates have disappeared.

PART 4 SQL 튜닝

Page 138: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

138

OR-EXPANSION

> 여러 개의 Union all로 Query를 재작성 한다. Concatenation USE_CONCAT hint로 유도 가능하다. PLAN 에 CONCATNATION

> In list를 그대로 두고 Filter로 사용한다.• Iterate : 『數·컴퓨터』 <공식·조작을> 반복 적용하다

• In-list에 있는 Distinct한 값만큼 Inlist Iterator아래에 있는 Operation을 반복수행한다

• Oracle7> Index를 사용하지 못하고 Full Table Scan으로 수행된다.

• Oracle8.0+> Inlist Iterator로 수행된다. PLAN 에 Inlist Iterator

• NO_EXPAND hint로 유도 가능하다.• 어떤 Column에 대해서 관계 연산자 In을 이용해 값(Value)이 공급되거나, 동일 컬럼에

대한 값이 OR 연산자로 연결되고, 값을 받는 Column을 선두로 하는 사용 가능한 Index가존재하는 경우 발생한다. CBO에서만 나타난다.

• 값이 집합으로 공급되는 경우는 발생하지 않는다.

SELECT empno, ename, deptnoFROM t_empWHERE empno IN (7521,7902,7788)

SELECT empno, ename, deptnoFROM t_empWHERE empno = 7521OR empno = 7902OR empno = 7788

PART 4 SQL 튜닝

Page 139: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

139

OR-EXPANSION

> Inlist Iterator와 Concatenation비교

• Inlist Iterator > Sub-query > Concatenation

• Unique Index를 사용할 경우 Range Scan이 발생하는 Inlist Iterator가Concatenation보다 비효율적일 것 같지만 실제 수행결과를 보면 InlistIterator가 가장 효율적이다.

CPU ELAPSED CPU ELAPSED CPU ELAPSED

100 25 0.01 0.01 0.00 0.02 0.05 0.04

540 25 0.03 0.01 0.04 0.02 0.08 0.09

In-list Subquery Concatenation값의 건수 성공건수

PART 4 SQL 튜닝

Page 140: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

140

OR-EXPANSION

> Inlist Iterator 발생유도하기• Index hint

> 직접적으로 발생시키는 Hint는 존재하지 않으며, 발생할 가능성을 높이기위해서 Index Hint를 사용할 수 있다.

• NO_EXPAND hint> Concatenation으로 풀리지 않도록 해준다.

SELECT /*+ no_expand */empno, ename, deptno

FROM t_empWHERE empno IN (7521,7902,7788)

실행계획

SELECT STATEMENT Hint=CHOOSEINLIST ITERATOR

TABLE ACCESS BY INDEX ROWID T_EMP INDEX (RANGE SCAN) PK_T_EMP

PART 4 SQL 튜닝

Page 141: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

141

STAR QUERY TRANSFORMATIONPART 4 SQL 튜닝

> 개념• 소량의 데이터를 가진 여러 개의 디맨젼 테이블과 팩트테이블의 개별 비트맵

인덱스를 이용하여 처리범위를 줄이는 조인방식

• 카티젼곱을 만들지 않는것이 STAR 조인과 다름.• B-TREE 인덱스와는 다르게 독립적인 BIT MAP INDEX 로 LIKE,

BETWEEN 등 범위검색에서도 BIT MAP 인덱스 머지가 일어남.• 내부적으로 옵티마이져가 질의를 변형하여 실행계획을 생성함.• FROM 절에 여러 FACT 테이블 이 조인된것을 WHERE 절에 서브쿼리

조인으로 바꿈.

> 제약사항• 하나의 팩트 테이블에 최소한 2개이상의 디맨션 테이블이 있어야 한다.• 팩트테이블의 외부키에는 반드시 비트맵인덱스가 존재해야 한다.• 팩트테이블에 반드시 통계정보가 생성되어 있어야 한다.• 파라메터(STAR_TRANSFORMATION_ENABLED) 가 TRUE 이거나

쿼리에 힌트(STAR_TRANSFORMATION) 를 주어야 한다.• 바인드 변수를 사용하면 안된다.(반드시 상수인경우에 발생됨)

Page 142: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

142

STAR QUERY TRANSFORMATION

> STAR_TRANSFORMATION 예제Select A.QUTER, B,STATE, SUM(C.AMOUNT)FROM CARENDAR A, CUSTOMER B, SALES CWHERE A.SALE_DATE = C.SALE_DATE

AND B.CUST_ID = C.CUST_IDAND B.STATE = ‘CA’AND A.QUTER = ‘200404’

SELECT …FROM CARENDAR A, CUSTOMER B, SALES CWHERE SALES_DATE IN (SELECT SALES_DATE FROM CARENDAR

WHERE QUTER = ‘200404’)AND CUST_ID IN (SELECT CUST_ID FROM CUSTOMER

WHERE STATE = ‘CA’)

STAR TRANSFORMATION

PART 4 SQL 튜닝

Page 143: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

143

STAR QUERY TRANSFORMATIONPART 4 SQL 튜닝

Page 144: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

144

STAR QUERY TRANSFORMATIONPART 4 SQL 튜닝

Page 145: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

145

STAR QUERY TRANSFORMATIONPART 4 SQL 튜닝

Page 146: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

146

STAR QUERY TRANSFORMATIONPART 4 SQL 튜닝

Page 147: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

147

부분범위 처리 (Partial range scan)

• 액세스 경로를 이용한 SORT의 대체

• 인덱스만 액세스하는 부분범위처리

• MIN, MAX의 처리

• FILTER형 부분범위 처리

• ROWNUM의 활용

• 인라인뷰를 이용한 부분범위처리

• 저장형 함수를 이용한 부분범위처리

• 쿼리의 분리를 이용한 부분범위처리

PART 4 SQL 튜닝

Page 148: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

148

운반단위

전체범위스캔

INDEX(ITEM_CD)

TABLE(PRODUCT)

..

..

..

..

..

..

..

..DESENDINGSORT

CATEGORYLIKE ‘C%’

운반단위

부분범위스캔

INDEX(ITEM_CD)

TABLE(PRODUCT)

CATEGORYLIKE ‘C%’

SELECT * FROM PRODUCT

WHERE ITEM_CD LIKE ‘AB%’

AND CATEGORY LIKE ‘C%’

ORDER BY ITEM_CD DESC

SELECT /*+INDEX_DESC(PRODUCT item_index)*/ *

FROM PRODUCT

WHERE ITEM_CD LIKE ‘AB%’

AND CATEGORY LIKE ‘C%’

- ORDER BY 는 전체범위 처리가 된다

- 정렬하고자 하는 순서와 엑세스를 주관하는 인덱스의 컬럼 앞부분이 같다면 인덱스를 사용하여 부분범위처리 유도

- 힌트를 사용하면 역순으로 정렬하는 것도 가능

- CBO인 경우 힌트를 사용하여 ORDER BY 대신 인덱스를 이용한 부분범위로 처리 (RBO일때는 인덱스를 역순으로 엑세스하는 부분범위 처리가능)

- 결합인덱스를 생성하여 부분범위 처리유도 가능

- ORDER BY를 없애기 위한 목적으로 인덱스에 필요한 컬럼을 추가하는 것도 부분범위 처리의 좋은 활용법

액세스 경로를 이용한 SORT의 대체PART 4 SQL 튜닝

Page 149: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

149

SELECT SELECT DEPT, SUM(QTY) DEPT, SUM(QTY) FROM PRODUCT FROM PRODUCT WHERE DEPT LIKE '12%' WHERE DEPT LIKE '12%' GROUP BY DEPT;GROUP BY DEPT;

운반단위운반단위

INDEX INDEX (DEPT)(DEPT)

TABLETABLE

••

GGRROOUUPP

BBYY•

SELECT SELECT DEPT, SUM(QTY)DEPT, SUM(QTY). . FROM PRODUCT FROM PRODUCT WHERE DEPT LIKE '12%' WHERE DEPT LIKE '12%' GROUP BY DEPT;GROUP BY DEPT;

운반단위운반단위

INDEX INDEX (DEPT+QTY(DEPT+QTY))

GGRROOUUPP

BBYY

••••

부분범위처리 (Index만 처리)

Page 150: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

150

INDEX (ORDER+SEQ)

운반단위

SEQ + 1

INDEX (ORDER)

TABLE

운반단위

SORT

MAX(SEQ)+1......

..

..

..

SELECT MAX(SEQ) + 1

FROM ORDER

WHERE DEPTNO = ‘12340’;

SELECT /*+ INDEX_DESC(order pk_order) */NVL(MAX(SEQ),0) + 1

FROM ORDERWHERE DEPT_NO = ‘12300’AND ROWNUM = 1;

- MIN을 처리한다면 INDEX를 순차적(Ascending)으로 스캔하여 첫번쨰 로우만 추출, MAX는 역순(Desending)으로 액세스 하여 한 건 추출

- 위의 방법은 완벽한 부분범위 처리를 하므로 주어진 조건을 만족하는 범위가 넓어도 빠른 속도를 보장

- NVL 함수를 사용한 이유는 조건을 만족하는 데이터가 없을 때 ROWNUM=1을 얻기 위해 사용 ( 최초 번호 부여시 문제점 발생 예방조치 )

MIN, MAX의 처리PART 4 SQL 튜닝

Page 151: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

151

SELECT COUNT(*) INTO:CNTFROM ITEM_TABWHERE DEPT = ‘101’

AND SEQ>100‥ ‥IF CNT>0 ‥‥ ‥

SELECT 1 INTO:CNT FROM DAULWHERE EXISTS (SELECT ‘X’

FROM ITEM_TABWHERE DEPT =‘101’AND SEQ > 100)

‥ ‥IF CNT>0

‥ ‥

운반단위

INDEX(DEPT)

TABLE(ITEM_TAB)

..

..

..

..

..

..

..

SORT(aggregate)

o

o

o

x

운반단위

INDEX(DEPT)

TABLE(ITEM_TAB)

o

x

..

..

..

..

- 존재 여부만 판단하는 경우에는 조건을 만족하는 첫 번째 로우를 만나는 순간 실행을 종료 하여도 충분

- EXISTS는 수행결과의 존재여부를 체크하여 성공과 실패만을 확인하는 불린(Boolean)함수 이므로 존재여부 판단에 적절

FILTER형 부분범위 처리PART 4 SQL 튜닝

Page 152: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

152

SELECT *

FROM ITEM_TAB

WHERE DEPT = ‘101’

AND SEQ > 100

AND ROWNUM <= 10

운반단위

INDEX(DEPT)

TABLE(ITEM_TAB)

..

..

..

..

..

..

..

①x

SEQ > 100CHECK

- 인덱스를 통해 액세스한 테이블의 로우들 중에서 체크조건을 만족하는 로우들만 ROWNUM이 부여되어 운반단위로 이동

- 운반단위가 채워지거나 ROWNUM이 만족될 때 (10보다 클 때 )수행을 멈춤

- ROWNUM은 로우의 번호가 아니라 조건을 만족한 데이터에 일련번호가 부여된 것

- 조건이 만족되지 못하면 ROWNUM이 부여되지 않기 때문에 ROWNUM은 조건으로 사용할 수 있으면서 결과값이 되기도 함

- ROWNUM 은 일종의 가상(Pseudo)의 컬럼

- 전체를 처리하지 않고 일부만 처리하도록 유도하는 방법

(일종의 부분범위 처리)

Execution Plan-------------------------------------------------

SELECT STATEMENT

COUNT (STOPKEY)

TABLE ACCESS (FULL) OF ‘PRODUCT’

테이블을 부분범위 처리로 액세스 하여 ROWNUM을 COUNT하다가

주어진 ROWNUM에 도달하면 멈춤(Stopkey)를 하겠다는 것을 확인

확실한 일정범위 스캔 확인

ROWNUM의 활용PART 4 SQL 튜닝

Page 153: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

153

운반단위

INDEX(DEPT)

TABLE(PRODUCT)

..

..

..

x

QTY>0CHECK

..

..

..

SELECT ROWNUM, item_cd, …

FROM product

WHERE deptno like ‘120%’

AND qty >0

AND ROWNUM <= 10

ORDER BY item_cd;

-ORDER BY절이 수행되기 전에

WHERE 절에 있는 조건을 만족하는

로우마다 ROWNUM이 부여되어 임시

공간에 저장, 10건만 정렬되어 운반단

위로 보내진다. 답이틀림.

SELECT ROWNUM, item_cd, category_cd,…

FROM ( SELECT *

FROM product

WHERE deptno like ‘120%’

AND qty>0

ORDER BY item_cd)

WHERE ROWNUM <= 10;

-SQL은 조건에 맞는 데이터를 액세스하여 내부적으로 저장한 다음 이를 정렬한다. (내부적인 저장이 일어날 때 ROWNUM이 생성되어 저장됨)

SQL을 부분범위 처리가 되도록 바꾸어 주는 방법으로는 ORDER BY 를 없애고 인덱스를 이용해 부분범위 처리 유도 후 ‘ROWNUM <= ‘10’’ 추가

또는 아래와 같은 형식의 ORDER BY 를 인라인 뷰에 넣은 다음 ROWNUM을 체크하여도 부분범위 처리를 할 수 있다. 주의

ROWNUM의 활용PART 4 SQL 튜닝

Page 154: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

154

1:M JOIN의 부분범위 유도1:M JOIN의 부분범위 유도SELECT x.CUST_NO, x.ADDR, x.NAME, .............SELECT x.CUST_NO, x.ADDR, x.NAME, .............

FROM FROM CUST x, REQT yCUST x, REQT yWHERE x.CUST_NO = y.CUST_NOWHERE x.CUST_NO = y.CUST_NO

AND x.CUST_STAT in ('A', 'C', 'F') AND x.CUST_STAT in ('A', 'C', 'F') AND y.UN_PAY > 0 AND y.UN_PAY > 0

GROUP BY x.CUST_NOGROUP BY x.CUST_NOHAVING SUM(y.UN_PAY) between :VAL1 and :VAL2HAVING SUM(y.UN_PAY) between :VAL1 and :VAL2

전체범위전체범위

SELECT x.CUST_NO, x.ADDR, x.NAME, .............SELECT x.CUST_NO, x.ADDR, x.NAME, .............FROM CUST x FROM CUST x

WHERE CUST_STAT in ('A', 'C', 'F') WHERE CUST_STAT in ('A', 'C', 'F') ANDAND EXISTSEXISTS ( SELECT 'X' ( SELECT 'X'

FROM REQT yFROM REQT yWHERE y.CUST_NO = x.CUST_NOWHERE y.CUST_NO = x.CUST_NO

AND UN_PAY > 0 AND UN_PAY > 0 GROUP BY x.CUST_NOGROUP BY x.CUST_NOHAVING SUM(y.UN_PAY)HAVING SUM(y.UN_PAY)

between :VAL1 abetween :VAL1 and :VAL2 )nd :VAL2 )

SUB_QUERY SUB_QUERY 의의 수행결과를수행결과를

MAIN_QUERY MAIN_QUERY 에서에서

사용할사용할 수수 없음없음

부분범위부분범위

서브쿼리를 이용한 부분범위처리

Page 155: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

155

-원리 : 전체범위 처리가 되는 부분을 인라인뷰로 묶어서 다른 부분들은 부분범위 처리를 하도록 유도

* 전체 쿼리를 전체범위 처리로 만들어 버리는 요인을 인라인뷰로 격리함으로써 부분처리

SELECT a.dept_name, b.empno, b.emp_name, c.sal_ym, c.sal_totFROM department a, employee b, salary cWHERE b.deptno = a.deptnoAND c.empno = b.empnoAND a.location = ‘SEOUL’AND b.job = ‘MANAGER’AND c.sal_ym = ‘200512’

ORDER BY a.dept_name, b.hire_date, c.sal_ym;

SELECT /*+ ORDER, USE_NL(x y) */a.dept_name, b.empno, b.emp_name, c.sal_ym, c.sal_tot

FROM (SELECT a.dept_name,b.hire_date, b.empno, b.emp_nameFROM DEPT a, EMPLOYEE bWHERE b.deptno = a.deptnoAND a.location = ‘SEOUL’AND b.job = ‘MANAGER’

ORDER BY a.dept_name, b.hire_date) x, SALARY yWHERE y.empno = x.empno AND c.sal_ym = ‘200512’;

SELEC a.product_cd, product_name, avg_stock

FROM PRODUCT a,

(SELECT product_cd, SUM(stock_qty) / (:b2-:b1) avg_stock

FROM PROD_STOCK

WHERE stock_date between :b1 and :b2

GROUP BY product_cd ) b

WHERE b.product_cd = a.product_cd

AND a.category_cd = ‘20’;

- 적은 집합인 ‘DEPT’와 ‘EMPLOYEE’테이블만 먼저 조인 하고

그 결과만 먼저 정렬시킨 다음 대량의 집합인 ‘SALARY’ 테이블

은 기본키인 ‘empno + sal_ym’인덱스를 경유 이상적 방법

- 힌트를 사용한 것은 인라인 뷰를 먼저 수행하고 그 결과와

‘SALARY’테이블이 Nested Loops조인이 되도록 하기 위함

-처리대상이 적은 테이블을 먼저 처리하여 전체 범위처리가 되

도록 함으로, 대량의 데이터를 가지 집합은 부분범위 처리 유도

- SQL은 CATEGOR_CD가 20인 PRODUCT_CD들에 대해

주어진 기간 내의 평균 재고 수량을 구하고 있는 SQL 이다.

인라인뷰를 이용한 부분범위처리PART 4 SQL 튜닝

Page 156: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

156

SELECT x.CUST_NO, x.ADDR, x.NAME, .............SELECT x.CUST_NO, x.ADDR, x.NAME, .............FROM FROM CUST x, REQT yCUST x, REQT y

WHERE x.CUST_NO = y.CUST_NOWHERE x.CUST_NO = y.CUST_NOAND x.CUST_STAT in ('A', 'C', 'F') AND x.CUST_STAT in ('A', 'C', 'F') AND y.UN_PAY > 0 AND y.UN_PAY > 0

GROUP BY x.CUST_NOGROUP BY x.CUST_NOHAVING SUM(y.UN_PAY) between :VAL1 and :VAL2 ;HAVING SUM(y.UN_PAY) between :VAL1 and :VAL2 ;

전체범위전체범위

부분범위부분범위

Create or replace Create or replace Function Function unpay_sumunpay_sum((vv__custnocustno in varchar2)in varchar2)

return number isreturn number issum_unpaysum_unpay number ;number ;

beginbegin............................select sum(un_pay) into select sum(un_pay) into sum_unpaysum_unpay

from from reqtreqtwhere where cust_nocust_no = = v_custnov_custno

and un_pay > 0 ;and un_pay > 0 ;................................return return sum_unpaysum_unpay ;;

end end unpay_sumunpay_sum ;;

Select cust_no, addr, un_pay, ...........

from ( select cust_no, addr,

unpay_sum(cust_no) as un_pay,

....from cust

where cust_stat in ('A', 'C', 'F') )where un_pay between :VAL1 and :VAL2

Select Select cust_nocust_no, , addraddr, un_pay, ..........., un_pay, ...........

from ( select from ( select cust_nocust_no, , addraddr, ,

unpay_sum(cust_nounpay_sum(cust_no)) as un_pay, as un_pay,

........from from custcust

where where cust_statcust_stat in ('A', 'C', 'F') )in ('A', 'C', 'F') )where where un_pay between :VAL1 and :VAL2 un_pay between :VAL1 and :VAL2

1:M 1:M JOINJOIN의의 부분범위부분범위 유도유도

저장형함수를 이용한 부분범위처리

Page 157: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

157

연간연간 개인별개인별 급여급여 현황현황

부서코드 기준일 2005/1211%부서코드 성 명 사 번 직 책 본 봉 수 당 입 사 일

1110 홍길동 12345 부장 42,000,000 5,000,000 82/10/101110 박문수 13674 과장 34,000,000 2,400,000 85/01/12 1111 김태수 14351 대리 27,000,000 91/08/15 1112 홍민철 14879 사원 24,000,000 94/09/20 1113 이수형 15278 사원 22,000,000 95/01/01 1114 김명훈 13565 부장 43,100,000 5,000,000 1/03/15 1115 정창수 18126 과장 35,240,000 2,000,000 84/10/20

SELECT 부서코드, 사번, min(직책), sum(본봉), sum(수당) ... FROM 급여테이블 x, 사원테이블 yWHERE x.사번 = y.사번

AND x.x.부서코드부서코드 LIKE LIKE ‘‘11%11%’AND x.급여일 between ‘970101’ and ‘971231’

GROUP BY 부서코드, x.사번

- Master와 Detail관계를 가진 경우에는 SQL을 분리함으로 수행효과를 높인다.

쿼리의 분리를 이용한 부분범위처리PART 4 SQL 튜닝

SELECT SELECT 부서코드부서코드 into :DEPTNOinto :DEPTNO

FROM FROM 부서테이블부서테이블

WHERE WHERE 부서코드부서코드 like like ‘‘11%11%’’ ;;

여기서여기서 :DEPTNO:DEPTNO는는 배열변수로배열변수로 지정된지정된호스트호스트 변수이며변수이며 부서코드는부서코드는 인덱스를인덱스를 가짐가짐

SELECT :DEPTNO, SELECT :DEPTNO, 사번사번, min(, min(직책직책), sum(), sum(본봉본봉), ), sum(sum(수당수당) ... ) ...

FROM FROM 급여테이블급여테이블 x, x, 사원테이블사원테이블 yy

WHERE x.WHERE x.사번사번 = y.= y.사번사번

AND AND x.x.부서코드부서코드 = :DEPTNO= :DEPTNOAND x.AND x.급여일급여일 between between ‘‘970101970101’’ and and ‘‘971231971231’’

GROUP BY x.GROUP BY x.사번사번

Page 158: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

158

인덱스인덱스 컬럼순서와컬럼순서와 연산자연산자

SELECT * FROM TAB1WHERE COL1 = ‘C’

and COL2 between ‘111’ and ‘113’

INDEXINDEX

B 999 10B 999 10

C 111 11C 111 11

C 112 5C 112 5

C 115 23C 115 23

C 113 18 C 113 18

C 114 22C 114 22

C 116 29C 116 29

C 117 25C 117 25

C 118 26C 118 26

C 119 30C 119 30

C 120 19C 120 19

C 121 32C 121 32

C 122 41C 122 41

C 123 45C 123 45

COL1 COL2 ROWIDCOL1 COL2 ROWID

INDEXINDEX

110 110 D 98 D 98

111 111 A 21A 21

111111 B 47B 47

111 111 C 11C 11

111111 D 65D 65

112112 A 75A 75

112112 B 70B 70

112112 C 5C 5

112112 D 76D 76

113113 A 48A 48

113113 B 44B 44

COL2 COL1 ROWIDCOL2 COL1 ROWID

113113 C 18C 18

113113 D 49D 49

114114 B 77B 77

ININ을을 활용한활용한 액세스액세스 효율화효율화PART 4 SQL 튜닝

Page 159: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

159

ININ을을 활용한활용한 액세스액세스 효율화효율화

IN IN 연산자의연산자의 특성특성

A and (B or C) = A and (B or C) =

(A and B) or (A and C)(A and B) or (A and C)

A = and B in ( A = and B in ( ‘‘11’’, , ‘‘33’’ ) = ) =

(A = and B = (A = and B = ‘‘11’’) or (A = and B = ) or (A = and B = ‘‘33’’))

A * (B + C) = A * (B + C) =

(A * B) + (A * C)(A * B) + (A * C)

수학적수학적 의미의미

기하학적기하학적 의미의미

A A GG선분

A B C D E F GA B C D E F G

COL BETWEEN COL BETWEEN ‘‘AA’’ and and ‘‘GG’’

COL IN (COL IN (‘‘AA’’,,‘‘BB’’,,‘‘CC’’,,‘‘DD’’,,‘‘EE’’,,‘‘FF’’,,‘‘GG’’))

ININ은은 nn개의개의 ==이다이다 !!

PART 4 SQL 튜닝

Page 160: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

160

INDEX1INDEX1

COL2 COL1 ROWIDCOL2 COL1 ROWID

110 A 10110 A 10

110 B 41110 B 41

111 A 11111 A 11

111 B 65111 B 65

111 C 96 111 C 96

111 D 5 111 D 5

112 A 73112 A 73

112 B 18 112 B 18

112 C 45 112 C 45

112 D 22112 D 22

CONCATENATIONTABLE ACCESS BY ROWID TAB1TABLE ACCESS BY ROWID TAB1

INDEX RANGE SCAN INDEX1INDEX RANGE SCAN INDEX1TABLE ACCESS BY ROWID TAB1TABLE ACCESS BY ROWID TAB1

INDEX RANGE SCAN INDEX1INDEX RANGE SCAN INDEX1

TABLE ACCESS BY ROWID TAB1TABLE ACCESS BY ROWID TAB1INDEX RANGE SCAN INDEX1INDEX RANGE SCAN INDEX1

SELECT * FROM TAB1SELECT * FROM TAB1WHERE COL1 = WHERE COL1 = ‘‘BB’’

and COL2 in (and COL2 in (‘‘112112’’,,‘‘111111’’))

INDEX1INDEX1

111 B 65111 B 65111 C 96 111 C 96

111 D 5 111 D 5 112 A 73112 A 73

112 B 18 112 B 18

112 C 45112 C 45112 D 22112 D 22

111 A 11111 A 11

110 A 10110 A 10

110 B 41110 B 41

COL2 COL1 ROWIDCOL2 COL1 ROWID

SELECT * FROM TAB1SELECT * FROM TAB1WHERE COL1 = WHERE COL1 = ‘‘BB’’

and COL2 between and COL2 between ‘‘111111’’ and and ‘‘112112’’

ININ을을 활용한활용한 액세스액세스 효율화효율화-- IN IN 의의 결합처리결합처리 실행계획실행계획PART 4 SQL 튜닝

Page 161: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

161

TAB1TAB1의의 인덱스인덱스 SELECT . . .SELECT . . .FROM TAB1FROM TAB1WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

AND AND 매출일자매출일자 between between ‘‘1998030219980302’’and and ‘‘1998030319980303’’

SELECT . . .SELECT . . .FROM TAB1FROM TAB1WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

AND 부서코드 like ‘%’AND AND 매출일자매출일자 between between ‘‘1998030219980302’’

and and ‘‘1998030319980303’’

SELECT . . .SELECT . . .FROM TAB1FROM TAB1WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

AND 부서코드 IN ( SELECT 부서코드

FROM 부서

WHERE 부서구분=‘S’)AND AND 매출일자매출일자 between between ‘‘1998030219980302’’

and and ‘‘1998030319980303’’22일간의일간의 자료만자료만

인덱스인덱스 스캔스캔

엑세스엑세스 효율효율개선개선 ??

해당해당 상품의상품의모든모든 범위를범위를인덱스인덱스 스캔스캔

PRINTER 1110 19980301PRINTER 1110 19980301PRINTER 1110 19980301PRINTER 1110 19980301PRINTER 1110 19980302PRINTER 1110 19980303……………………. . ……... ... ………………......PRINTER 1110 19980331PRINTER 1110 19980331PRINTER 1120 19980301PRINTER 1120 19980301PRINTER 1120 19980302PRINTER 1120 19980302……………………. . ……... ... ………………......PRINTER 1120 19980304PRINTER 1120 19980304PRINTER 1120 19980312PRINTER 1120 19980312PRINTER 1120 19980312PRINTER 1120 19980312PRINTER 1120 19980331PRINTER 1120 19980331……………………. . ……... ... ………………......PRINTER 9120 19980301PRINTER 9120 19980301PRINTER 9120 19980301PRINTER 9120 19980301PRINTER 9120 19980302PRINTER 9120 19980303……………………. . ……... ... ………………... ... PRINTER 9120 19980331PRINTER 9120 19980331MOUSE 1120 19980301MOUSE 1120 19980301MOUSE 1120 19980301MOUSE 1120 19980301……………………. . ……... ... ………………......MOUSE 1120 19980301MOUSE 1120 19980301……………………. . ……... ... ………………......

상상 품품 부서코드부서코드 매출일자매출일자

테이블테이블 액세스액세스

PART 4 SQL 튜닝

ININ을을 활용한활용한 액세스액세스 효율화효율화-- IN IN 의의 효율화효율화 사례사례

Page 162: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

162

모조모조(Dummy) (Dummy) 테이블을테이블을 이용하는이용하는 방법방법

YMD_DUALYMD_DUAL

YMD YMD_DATEYMD YMD_DATE

19500101 0119500101 01--JANJAN--19501950

19500102 0219500102 02--JANJAN--19501950…………………… …………………………..

19980101 0119980101 01--JANJAN--19981998……………………. . …………………………..

20491231 3120491231 31--DECDEC--20492049

YM_DUALYM_DUAL

YM6 YM4YM6 YM4

195001 195001 50015001

195002 5002195002 5002……..………… ……......

199801 9801199801 9801……………… …………

204912 4912204912 4912

COPY_TCOPY_T

NO NO2NO NO2

1 01 011

2 022 02…… ......

10 1010 10…… ……

99 9999 99

각각 테이블의테이블의 컬럼마다컬럼마다 UNIQUE UNIQUE 인덱스인덱스를를 생성해생성해 둘둘 것것

YMD_DUALYMD_DUAL은은 일자일자 기간을기간을 점으로점으로 만들어만들어 주기주기 위해위해 사용사용

YM_DUALYM_DUAL은은 월별월별 기간을기간을 점으로점으로 만들어만들어 주기주기 위해위해 사용사용

COPY_TCOPY_T는는 데이터데이터 복제나복제나 임의의임의의 값을값을 생성해생성해 주기주기 위해위해 사용사용

ININ을을 활용한활용한 액세스액세스 효율화효율화-- IN IN 의의 효율화효율화 사례사례

PART 4 SQL 튜닝

Page 163: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

163

SELECT *SELECT *

FROM TAB1FROM TAB1

WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

and and 판매일자판매일자 between between ‘‘1998070119980701’’

and and ‘‘1998072019980720’’

and and 부서부서 LIKE :VAL1||LIKE :VAL1||’’%%’’ ;;

SELECT *SELECT *FROM TAB1FROM TAB1WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

and and 판매일자판매일자 IN ( SELECT YMDIN ( SELECT YMDFROM YMD_DUALFROM YMD_DUALWHERE YMD between WHERE YMD between ‘‘1998070119980701’’

and and ‘‘1998072019980720’’ ) )

and and 부서부서 like :VAL1||like :VAL1||’’%%’’ ;;

상품+판매일자+부서

인덱스 사용한다고 가정

상품상품++판매일자판매일자++부서부서

인덱스인덱스 사용한다고사용한다고 가정가정

SELECT *SELECT *

FROM TAB2FROM TAB2

WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

and and 구분구분 like :TYPE||like :TYPE||’’%%’’

and and 생산일자생산일자 = = ‘‘1998071019980710’’ ;;

SELECT *SELECT *FROM TAB2FROM TAB2WHERE WHERE 상품상품 = = ‘‘PRINTERPRINTER’’

and and 구분구분 IN ( SELECT :TYPE||NOIN ( SELECT :TYPE||NOFROM COPY_TFROM COPY_TWHERE NO <= decode(:type,WHERE NO <= decode(:type,’’AA’’,10,15) ) ,10,15) )

and and 생산일자생산일자 = = ‘‘1998071019980710’’ ;;

상품+구분+생산일자

인덱스 사용한다고 가정

상품상품++구분구분++생산일자생산일자

인덱스인덱스 사용한다고사용한다고 가정가정

구분은구분은 A01,..,A10, B01,..B15... A01,..,A10, B01,..B15...

ININ을을 활용한활용한 액세스액세스 효율화효율화-- IN IN 의의 효율화효율화 사례사례PART 4 SQL 튜닝

Page 164: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

164

COL1 = constantCOL1 = constant

COL2 IN ( constants..) COL2 IN ( constants..) 정상적인정상적인 분리분리 COL2COL2까지만까지만 분리분리 가능가능

COL3 IN ( constants..) COL3 IN ( constants..)

COL1 = constantCOL1 = constant

COL2 IN ( COL2 IN ( subquerysubquery..) ..) COL2COL2까지만까지만 분리분리 COL2COL2까지만까지만 분리분리 불가능불가능

COL3 IN ( constants..) COL3 IN ( constants..)

COL1 = constantCOL1 = constant

COL2 IN ( COL2 IN ( subquerysubquery..) ..) 정상적인정상적인 분리분리 정상적인정상적인 분리분리

COL3 = constant COL3 = constant

COL1 = constantCOL1 = constant

COL2 IN ( COL2 IN ( subquerysubquery..) ..) 정상적인정상적인 분리분리 정상적인정상적인 분리분리

COL3 LIKE constant COL3 LIKE constant

COL1 IN ( constants..)COL1 IN ( constants..)

COL2 IN ( constants..) COL2 IN ( constants..) 정상적인정상적인 분리분리 정상적인정상적인 분리분리

COL3 = constant COL3 = constant

COL1 IN ( constants..)COL1 IN ( constants..)

COL2 IN ( COL2 IN ( subquerysubquery..) ..) 정상적인정상적인 분리분리 정상적인정상적인 분리분리

COL3 = constant COL3 = constant

33컬럼이하컬럼이하 44컬럼이상컬럼이상 힌트사용시힌트사용시조조 건건 유유 형형

조건기술조건기술 순서순서 = = 인덱스인덱스 컬럼순서로컬럼순서로 가정가정

ININ을을 활용한활용한 액세스액세스 효율화효율화-- 연결형태별연결형태별 활용기준활용기준PART 4 SQL 튜닝

Page 165: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

165

COL1 IN ( COL1 IN ( subquerysubquery..)..)

COL2 IN ( constants..) COL2 IN ( constants..) COL1COL1까지만까지만 분리분리 COL1COL1까지만까지만 분리분리 불가능불가능

COL3 = constant COL3 = constant

COL1 IN ( constants..)COL1 IN ( constants..)

COL2 IN ( COL2 IN ( subquerysubquery..) ..) 정상적인정상적인 분리분리 정상적인정상적인 분리분리

COL3 LIKE constant COL3 LIKE constant

COL1 IN ( COL1 IN ( subquerysubquery..)..)

COL2 = constant COL2 = constant COL3COL3는는 분리되지않음분리되지않음 COL3COL3는는 분리되지않음분리되지않음 불가능불가능

COL3 IN ( constants..) COL3 IN ( constants..)

COL1 IN ( constants..)COL1 IN ( constants..)

COL2 = constant COL2 = constant 정상적인정상적인 분리분리 COL3COL3는는 분리되지않음분리되지않음 가능가능

COL3 IN ( constants..) COL3 IN ( constants..)

COL1 = constantCOL1 = constant

COL2 = constant COL2 = constant 정상적인정상적인 분리분리 COL3COL3는는 분리되지않분리되지않 가능가능

COL3 IN ( constants..) COL3 IN ( constants..)

33컬럼이하컬럼이하 44컬럼이상컬럼이상 힌트사용시힌트사용시조조 건건 유유 형형

조건기술조건기술 순서순서 = = 인덱스인덱스 컬럼순서로컬럼순서로 가정가정

ININ을을 활용한활용한 액세스액세스 효율화효율화-- 연결형태별연결형태별 활용기준활용기준PART 4 SQL 튜닝

Page 166: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

166

바인드 변수

> 애플리케이션을 구축할 때 내려야 할 가장 중요한 결정 요소중 하나

> 바인드 변수를 사용하지 않을 경우 성능 저하• 바인드 변수를 사용할 경우 SQL문에 대해 한번만 하드 파싱을 수행하고 이 이후 동일

SQL문일 경우 소프트 파싱을 수행

• 동일한 문을 반복적으로 하드 파싱하는데 소요되는 시간은 바인드 변수를 사용할때 보다 몇배의 시간이 소요된다

> 바인드 변수를 사용되지 않을 경우(dynamic sql) 코드의 안전도가낮아진다

• SQL injection

SELECT empno, ename, sal, deptno

FROM emp

WHERE deptno = :v_deptno

SELECT empno, ename, sal, deptno

FROM emp

WHERE deptno = :v_deptno

PART 4 SQL 튜닝

Page 167: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

167

제약조건이 PLAN 에 미치는 영향

> PRIMARY KEY, FOREIGN KEY, NOT NULL 등과 같은 무결성제약조건(INTEGRITY CONSTRAINT)들은 옵티마이져 입장에서매우 중요한 정보 역할 제공

SELECT deptno, COUNT(*)

FROM emp

GROUP BY deptno;

SELECT deptno, COUNT(*)

FROM emp

GROUP BY deptno;

SELECT STATEMENT Optimizer Mode=ALL_ROWSHASH GROUP BY

TABLE ACCESS FULL SCOTT.EMP

SELECT STATEMENT Optimizer Mode=ALL_ROWSHASH GROUP BY

TABLE ACCESS FULL SCOTT.EMP

SELECT STATEMENT Optimizer Mode=ALL_ROWSSORT GROUP BY NOSORT

INDEX FULL SCAN SCOTT.EMP_IDX2

SELECT STATEMENT Optimizer Mode=ALL_ROWSSORT GROUP BY NOSORT

INDEX FULL SCAN SCOTT.EMP_IDX2

DEPTNO 에 인덱스 존재 및 NULL

DEPTNO 에 인덱스 존재 및 NOT NULL

PART 4 SQL 튜닝

Page 168: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

168

Execution Plan

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

SELECT STATEMENT Optimizer=CHOOSE

TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

NESTED LOOPS

TABLE ACCESS (FULL) OF 'DEPT'

INDEX (RANGE SCAN) OF 'EMP_DEPTNO_IDX' (NON-UNIQUE)

Execution Plan

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

SELECT STATEMENT Optimizer=CHOOSE

TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

NESTED LOOPS

TABLE ACCESS (FULL) OF 'DEPT'

INDEX (RANGE SCAN) OF 'EMP_DEPTNO_IDX' (NON-UNIQUE)

제약조건이 PLAN 에 미치는 영향

> 서브쿼리에서 리턴되는 컬럼에 UNIQUE 인덱스를 갖거나 UNIQUE 또는 PK 제약이 설정되어 있다면 메인쿼리에 결과집합을제공하기에 앞서 수행되어야 하는 SORT 연산을 생략

SELECT empno, ename, sal, deptno

FROM emp

WHERE deptno in ( SELECT /*+use_nl(dept) */

deptno

FROM dept

WHERE loc = 'CHICAGO')

SELECT empno, ename, sal, deptno

FROM emp

WHERE deptno in ( SELECT /*+use_nl(dept) */

deptno

FROM dept

WHERE loc = 'CHICAGO')

Execution Plan

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

SELECT STATEMENT Optimizer=CHOOSE

TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

NESTED LOOPS

SORT (UNIQUE)

TABLE ACCESS (FULL) OF 'DEPT'

INDEX (RANGE SCAN) OF 'EMP_DEPTNO_IDX' (NON-UNIQUE)

Execution Plan

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

SELECT STATEMENT Optimizer=CHOOSE

TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

NESTED LOOPS

SORT (UNIQUE)

TABLE ACCESS (FULL) OF 'DEPT'

INDEX (RANGE SCAN) OF 'EMP_DEPTNO_IDX' (NON-UNIQUE)

DEPT 테이블의 DEPTNO 인덱스 없음

DEPT 테이블의 DEPTNO 에 UNIQUE 인덱스 존재

PART 4 SQL 튜닝

Page 169: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

169

제약조건이 PLAN 에 미치는 영향

> 전체범위가 유리한 상황에서 NOT IN 서브쿼리에 HASH_AJ 힌트를 사용하거나 옵티마이져의 선택에 의해 HASH ANTI JOIN으로 실행된다면 고전적으로 많이 사용되던 필터처리방식과는 비교도 할 수 없을 만큼 빠르게 수행된다.

> 단, 메인쿼리와 서브쿼리 간에 비교되는 컬럼들이 NULL 값을포함하지 않아야 한다

PART 4 SQL 튜닝

Page 170: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

170

Hint

> Hints for Optimization Approaches and Goals• ALL_ROWS

• FIRST_ROWS(n)> Hints for Access Paths

• FULL

• CLUSTER

• HASH

• INDEX

• NO_INDEX

• INDEX_ASC

• INDEX_COMBINE

• INDEX_JOIN

• INDEX_DESC

• INDEX_FFS

• NO_INDEX_FFS

• INDEX_SS

• INDEX_SS_ASC

• INDEX_SS_DESC

• NO_INDEX_SS

PART 4 SQL 튜닝

Page 171: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

171

Hint

> Hints for Query Transformations• NO_QUERY_TRANSFORMATION• USE_CONCAT• NO_EXPAND• REWRITE• NO_REWRITE• MERGE• NO_MERGE• STAR_TRANSFORMATION• NO_STAR_TRANSFORMATION• FACT• NO_FACT• UNNEST• NO_UNNEST

PART 4 SQL 튜닝

Page 172: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

172

Hint

> Hints for Join Orders• LEADING• ORDERED

> Hints for Join Operations• USE_NL• NO_USE_NL• USE_NL_WITH_INDEX• USE_MERGE• NO_USE_MERGE• USE_HASH• NO_USE_HASH

> Hints for Parallel Execution• PARALLEL• PARALLEL• PQ_DISTRIBUTE• PARALLEL_INDEX• NO_PARALLEL_INDEX

PART 4 SQL 튜닝

Page 173: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

173

Hint

> Additional Hints• APPEND• NOAPPEND• CACHE• NOCACHE• PUSH_PRED• NO_PUSH_PRED• PUSH_SUBQ• NO_PUSH_SUBQ• QB_NAME• CURSOR_SHARING_EXACT• DRIVING_SITE• DYNAMIC_SAMPLING• MODEL_MIN_ANALYSIS

PART 4 SQL 튜닝

Page 174: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

174

PART 5 PL/SQL 튜닝

• PL/SQL 을 쓰는이유. • 패키지의 사용의 당위성. • %TYPE 과 %ROWTYPE을 이용하라. • NATIVE COMPILER 의 사용. • DBMS_SHARED_POOL 의 사용

• 결과집합을 CLIENT 에 반환하는것은 REF CURSOR 를 사용하라.• BULK COLLECT. • FORALL• FORALL 및 BULK COLLECT 와의 연동

• DML 후의 SELECT 는 RETURNNING 절로 대체하라.• 인자를 대량으로 넘길때는 NOCOPY Hint 를 사용하라.• 대용량 데이터 처리 function 에서는 PARALLEL_ENABLE 힌트를 사용하라

• compile-time warnings• Pipelined Function

PART 5 PL/SQL 튜닝

Page 175: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

175

PL/SQL 을 사용하는 이유.

> EJB 에 비해서 NETWORK I/O 가 없다.• I/O 속도 : NETWORK < HARD DISK < MEMORY

> 부분범위처리 및 SQL SENDING I/O 획기적 감소• PIPELINED FUNCTION(8i 이후)

> 무파싱• PL/SQL 은 이미 PARSING 작업이 끝남.• HARD PARSING < SOFT PARSING < 무파싱

• SQL injection (DB 보안에 유리)

> SQL 작성이 쉽다. • “” 또는 바인딩이 불필요함.• CONNECTION 불필요.• ARRAY PROCESSING(8i 이후)

> 사용자 함수를 NATIVE C 컴파일러로 컴파일이 가능함 (9i 이후)

PART 5 PL/SQL 튜닝

Page 176: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

176

PART 5 패키지를 사용해야 하는이유

> 패키지의 사용의 당위성• 종속성 체인이 사라짐

• 컴파일 개수의 축소

• 명칭공간을 증가시킴 : Pkg1.f_get_code(), pkg2.f_get_code()

• Overloading 을 지원함.

• 세션지속형 변수를 지원한다.

• 초기화코드를 지원한다.

• 관련기능을 업무단위로 묵을수 있다.

PART 5 PL/SQL 튜닝

Page 177: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

177

PART 5 %TYPE 과 %ROWTYPE

> 테이블형 또는 컬럼형 변수의 사용

Declare

emp_rec emp%rowtype;

Dept_loc dept.loc%type;

cusor c1 isselect ….from empwhere ~ ;

c1_rec c1%rowtype;

Begin….End;

Empno number(6);Ename varchar2(20);Salary number(12,2)Job varchar2(2);manager number(6);

변화에 취약

Dept_loc varchar2(6);

Empno number(6);Ename varchar2(20);Salary number(12,2)Job varchar2(2);manager number(6);

PART 5 PL/SQL 튜닝

Page 178: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

178

PART 5 NATIVE COMPILER 의 사용

> NATIVE COMPILER 의 사용.

• 빌트인 함수와 같은 속도를 낸다.• C COMPILER 로 컴파일됨.• 사용법 : PLSQL_CODE_TYPE = NATIVE 지정후 PL/SQL 컴파일.• 세션에서 지정가능

PART 5 PL/SQL 튜닝

Page 179: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

179

PART 5 REF CURSORREF CURSOR

> 결과집합을 CLIENT 에반환하는것은 REF CURSOR 를 사용하라• REF CURSOR 의 잇점

• 프로그램의 용이성 : PL/SQL 로 반환집합만 정의하면 된다.• 융통성 : ARRAY SIZE 를 자유롭게 설정할수 있다.(10~100)• 성능 : 부분범위처리가 가능하다.(마지막 행이 처리되기를 기다릴 필요없이

즉시 10건(ARRAY SIZE 가 10인경우)을 반환한다.• NETWORK I/O 의 감소 : 많은 줄의 SQL 이 DB 서버로 전달되지않고

한줄의 PROCEDURE 만 호출하면된다.EXAMPLE) AUTOTRACE 의 Statistics 에서

bytes received via SQL*net from client 가 획기적으로 감소. idle event???

PART 5 PL/SQL 튜닝

Page 180: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

180

PART 5 REF CURSORREF CURSOR

> REF CURSOR 예제

create table t asselect * from all_objects;

create or replace package demo_pkgas

type rc is ref cursor;procedure ref_cursor( p_owner in varchar2, p_cursor in out rc );

end;/

create or replace package body demo_pkgasprocedure ref_cursor( p_owner in varchar2, p_cursor in out rc )isbegin

open p_cursor forselect object_name, object_type, timestampfrom twhere owner = p_owner;

end;end;/

PART 5 PL/SQL 튜닝

Page 181: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

181

PART 5 REF CURSORREF CURSOR

> REF CURSOR 예제 (다음장 계속)

import java.sql.*;import java.util.Date;import oracle.jdbc.driver.*;import oracle.sql.*;

class indexby{

static long start = new Date().getTime();public static void showElapsed( String msg ){long end = new Date().getTime();

System.out.println( msg + " " + (end - start) + " ms");start = end;

}

public static void main(String args[])throws Exception{

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

Connection conn=DriverManager.getConnection("jdbc:oracle:oci8:@ora920.us.oracle.com","scott", "tiger");

showElapsed( "Connected, going to prepare" );

PART 5 PL/SQL 튜닝

Page 182: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

182

PART 5 REF CURSORREF CURSOR

> REF CURSOR 예제(계속)

((OracleConnection)conn).setDefaultRowPrefetch(100); /* array size 지정 */

OracleCallableStatement cstmt =(OracleCallableStatement)conn.prepareCall( "begin demo_pkg.ref_cursor(?,?); end;" );

showElapsed( "Prepared, going to bind" );cstmt.setString( 1, "SYS" );cstmt.registerOutParameter(2, OracleTypes.CURSOR); /* 커서유형으로 binding 지정 */

showElapsed( "Bound, going to execute" );cstmt.execute();

ResultSet rset = (ResultSet)cstmt.getObject(2);

if (rset.next())showElapsed("First Row");

String data;int i;for(i = 1; rset.next(); i++ ){

data = rset.getString(1);data = rset.getString(2);data = rset.getString(3);

}showElapsed( "Last Row "+i );

}}

PART 5 PL/SQL 튜닝

Page 183: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

183

PART 5 Bulk collectBulk collect

> Bulk collect

• Loop 를 없앰.• Context switching 이 획기적으로 사라짐.• 사용이 간편함.• 속도가 빠름.• Cursor• Select bulk collect into :배열변수

Declarecursor emp_cur is select * from emp;type emp_array is table of

emp_cur%rowtype index by binary_integer;l_emp emp_array;

Beginfetch emp_cur bulk collect into l_emp;

End;

PART 5 PL/SQL 튜닝

Page 184: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

184

PART 5 Forall

> FORALL 의 사용.

• Loop 를 없앰.• Context switching 이 획기적으로 사라짐.• 사용이 간편함.• 속도가 빠름.• Insert, update, delete, merge

Declaretype employee_aat is table of emp.emono%type;l_empno employee_aat;

Beginl_empno(1) = 200;l_empno(2) = 210;l_empno(3) = 220;

forall i in l_empno.first .. l_empno.lastupdate emp set sal = 1000000where empno = l_empno(i);

End;

PART 5 PL/SQL 튜닝

Page 185: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

185

PART 5 :FORALL 및 BULK COLLECT 와의 연동

declaretype ridArray is table of rowid;type vcArray is table of t2.object_name%type;

l_rids ridArray;l_names vcArray;

cursor c is select rowid, object_name from t2;begin

open c;loop

fetch c bulk collect into l_rids, l_names LIMIT 100;

forall i in 1 .. l_rids.countupdate t2set object_name = lower(l_names(i))where rowid = l_rids(i);

exit when c%notfound;

end loop;close c;commit;end;/

배열단위 지정한번에 100건 fetch

배열변수 선언

배열 선언

PART 5 PL/SQL 튜닝

Page 186: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

186

PART 5 RETURNNING

> DML 후의 SELECT 는 RETURNNING 절로 대체하라.• Select 를 수행할 필요가 없어 속도가 빠르다.• 여러건일경우는 bulk collect 를 사용해야 한다.

BEGINforall i in deptlist.first..deptlist.lastupdate emp set sal = sal + sal * 0.1where deptno = deptlist(i)returning empno bulk collect into enolist;-- 변경된 사원번호를 배열에 대입한다.

END

PART 5 PL/SQL 튜닝

Page 187: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

187

NOCOPY

• Out, inout 인자에만 적용가능함.• CALL BY VALUE 를 CALL BY REFERENCE 로 바꿈

• 대용량의 인자를 넘기는경우에 유용함.• 직접인지를 넘기는것이 아니라 주소값만 RETURN.• COMMAND 가 아니라 OPTIMIZER hint 임.• remote procedure 에서는 실행되지 않음.• Nocopy 를 적용할경우 Exception 절에서는 out , inout 인자값을 이용할수

없음.• 예제)

DECLARETYPE emptabtype IS TABLE OF employees%ROWTYPE;emp_tab emptabtype;PROCEDURE populate(tab IN OUT NOCOPY emptabtype)IS BEGIN ... END;BEGINpopulate(emp_tab);END;

PART 5 PL/SQL 튜닝

Page 188: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

188

PARALLEL_ENABLE HintPARALLEL_ENABLE Hint

> PARALLEL_ENABLE :• optimization hint임.• 함수내에서 parallel 쿼리(SELECT, INSERT, UPDATE, DLETE, MERGE) 쿼리를

가능하게 함.

• 예제)CREATE OR REPLACE FUNCTION f2 (p1 NUMBER)

RETURN NUMBER PARALLEL_ENABLE ISBEGIN…. --- PARALLEL 쿼리 위치

END;

PART 5 PL/SQL 튜닝

Page 189: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

189

Compile-time warnings!(10g)

> 개념 : 컴파일시에 모든에러, 내포된 문제점, 튜닝 포인트를 알려준다.> Global 파라메터 사용은 속도를 저하시킬수 있으므로 세션에서 사용.

• 예제)• 현재상태를 먼저 확인한다.DBMS_OUTPUT.PUT_LINE( DBMS_WARNING.GET_WARNING_SETTING_STRING());• Enable 시킨다.ALTER SESSION SET plsql_warnings = 'enable:all‘;

옵션 : [ENABLE | DISABLE | ERROR]

• 패키지를 만들어 컴파일 해본다. SQL> CREATE OR REPLACE PACKAGE create_policy IS2 PROCEDURE process_dec_page ( dec_page IN OUT CLOB );3 END create_policy;4 /SP2-0808: Package created with compilation warnings

SQL> show errErrors for PACKAGE CREATE_POLICY:LINE/COL ERROR-------- -----------------------------------------------------------------2/32 PLW-07203: parameter 'DEC_PAGE' may benefit from use of the NOCOPY

compiler hint

PART 5 PL/SQL 튜닝

Page 190: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

190

Compile-time warnings!(10g) - 계속

SQL> CREATE OR REPLACE PACKAGE BODY create_policy IS2 PROCEDURE process_dec_page (3 dec_page IN OUT NOCOPY CLOB ) IS4 BEGIN5 default_dec(dec_page);6 END process_dec_page;7 END create_policy;8 /SP2-0810: Package Body created with compilation warningsSQL> show errErrors for PACKAGE BODY CREATE_POLICY:LINE/COL ERROR-------- -----------------------------------------------------------------3/6 PLW-05000: mismatch in NOCOPY qualification between specification and body

SQL> CREATE OR REPLACE PROCEDURE dead_code IS2 x NUMBER := 10;3 BEGIN4 IF x = 10 THEN5 x := 20;6 ELSE7 x := 100; -- dead code8 END IF;9 END dead_code;10 /SP2-0804: Procedure created with compilation warningsSQL> show errErrors for PROCEDURE DEAD_CODE:LINE/COL ERROR-------- -----------------------------------------------------------------7/7 PLW-06002: Unreachable code

PART 5 PL/SQL 튜닝

Page 191: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

191

PIPELINED function

> A4지 기준 2장이 넘는 SQL 은 network I/O 증가> 이럴경우 자주쓰는 SQL 은 PIPELINED function 적용 고려> PIPELINED function의 특징 : 부분범위처리> 예제)

CREATE OR REPLACE TYPE OBJ_C_COMMON AS OBJECT (COM_CLS4 VARCHAR2(4),COM_CLS2 VARCHAR2(2),COM_CLS4_NM VARCHAR2(100),COM_CLS4_ALIAS_CD VARCHAR2(6),COM_CLS4_DESC VARCHAR2(250),CLS1 VARCHAR2(1),COM_NUM_FROM NUMBER(22,2),COM_NUM_TO NUMBER(22,2),COM_DATE_FROM DATE,COM_DATE_TO DATE,COM_STRING_FROM VARCHAR2(100),COM_STRING_TO VARCHAR2(100)

);

CREATE OR REPLACETYPE COMLIST_T IS TABLE OF OBJ_C_COMMON;

PART 5 PL/SQL 튜닝

Page 192: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

192

PIPELINED function

CREATE OR REPLACE FUNCTION get_com_info (CLS_24 IN VARCHAR2) RETURN COMLIST_T PIPELINEDAS

/* TOLC_C_COMMON 테이블의 모든내용을 RETURN 하는 함수 */

COMLIST OBJ_C_COMMON := OBJ_C_COMMON();

REC TOLC_C_COMMON%ROWTYPE;

CURSOR c_zip (CLS_24 IN TOLC_C_COMMON.COM_CLS4%TYPE) ISSELECT *FROM TOLC_C_COMMON

WHERE COM_CLS4 LIKE CLS_24||'%'

BEGIN

FOR REC IN c_zip --> 만약 온라인화면이 아니라 배치작업이면 BULK COLLECT 로 바꾸어야 한다.LOOP

COMLIST.COM_CLS4 := REC.COM_CLS4 ;COMLIST.COM_CLS2 := REC.COM_CLS2 ;COMLIST.COM_CLS4_NM := REC.COM_CLS4_NM ;COMLIST.COM_CLS4_ALIAS_CD := REC.COM_CLS4_ALIAS_CD;COMLIST.COM_CLS4_DESC := REC.COM_CLS4_DESC ;COMLIST.CLS1 := REC.CLS1 ;COMLIST.COM_NUM_FROM := REC.COM_NUM_FROM ;COMLIST.COM_NUM_TO := REC.COM_NUM_TO ;COMLIST.COM_DATE_FROM := REC.COM_DATE_FROM ;COMLIST.COM_DATE_TO := REC.COM_DATE_TO ;COMLIST.COM_STRING_FROM := REC.COM_STRING_FROM ;COMLIST.COM_STRING_TO := REC.COM_STRING_TO ;PIPE ROW(COMLIST); -- 부분범위처리

END LOOP;

RETURN;

EXCEPTIONWHEN OTHERS THEN --예외 발생시 null structure 를 return 한다.

RETURN NULL;

END ;

PART 5 PL/SQL 튜닝

Page 193: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

193

PIPELINED function

> 함수 사용법

select X.SUBCON_CD,X.SUBCON_NM,X.SUBCON_CONTI_CLS,X.SUBCON_DESC,Y.COM_CLS4_NM,Y.COM_CLS4_ALIAS_CD,Y.COM_CLS2,Y.COM_CLS4_DESC

From TOLC_S_SUBCONTINENT X,TABLE( CAST( get_com_info(X.SUBCON_CONTI_CLS) AS COMLIST_T) ) Y;

• 9i, 10g 에서는 CAST 생략가능

PART 5 PL/SQL 튜닝

Page 194: jupid.tistory.com · 2015-01-22 · 2 PART 1 개요 • DBMS 시스템튜닝의목표 • DBMS 시스템튜닝의주체 • DBMS 시스템튜닝의순서 • DBMS 시스템튜닝을위한기본사항

194

Oracle 9i &10g Oracle 9i &10g New New feauturesfeauturesSQL & PL/SQL & DBMS SQL & PL/SQL & DBMS TunningTunning

Special Key NoteSpecial Key Note