반응형

10g에 추가된 Tuning Advisor


SQL ID 와 Begin SNAP 부분은 addm 을 통해 조회하여 입력하는 것이 좋음.(자동 생성 SH은 비밀글 참조...)


출처 : http://blog.daum.net/onjshop/175


★★ www.oraclejava3.co.kr 에서 더욱 유용한 정보를 확인하실 수 있습니다. ★★ 
(분당정자점은 양재, 강남에서 15분 거리에 있습니다. ^^)

Automatic SQL Tuning in Oracle Database 10g(SQL Tuning Advisor) 

이번 강좌에서는 오라클 10g의 새 특징인 자동 SQL 튜닝기능에 대해 알아 보도록 하겠습니다. 

Normal Mode에서 오라클 옵티마이저는 아주 짧은 시간에 최적의 실행 계획을 계산해 내야 합니다. 그러므로 항상 최선의 실행 계획을 만들어 낼 수는 없다 이겁니다~^^ 

Oracle 10g는 옵티마이저가 튜닝 모드에서 실행될 수 있도록 하여 추가적인 통계 정보를 모아 추후에는 튜닝된 최적의 실행 계획을 만들어 낼 수 있도록 지원 합니다. 물론 이러한 프로세스는 하나의 SQL문장에 대해 몇 분이 걸릴지도 모르므로 리소스를 많이 잡아 먹는 경향이 있습니다. 

튜닝모드에서 옵티마이저가 하는 일에 대해 정리해 볼까요? 

- 통계 분석(statistics Analysis) : 옵티마이저는 오래전에 만들어진 통계 정보나 또는 통계 정보가 없는 부분에 대해 통계 정보를 생산 하는 것을 권고 하며 SQL Profile안에 부가적인 객체에 대한 통계 정보를 저장 합니다. 

- SQL Profileing : CBO(Cost Base Optimizer)로 수행될 때 SQL문을 위해서는 부가 정보들이 필요 합니다. 이러한 SQL문의 정보들을 SQL 프로파일이라는 형태로 수집해 놓습니다. 이러한 SQL 프로파일이 필요할 때마다 SQL Tuning Advisor 에 의해 업데이트됩니다. 

- 실행 경로 분석(Access Path Analysis) : 어떤 인덱스를 통해 데이터를 접근하여 추출할지를 결정 합니다. 필요하다면 SQL Access Advisor를 호출해 인덱스에 대한 권고를 요구하기도 합니다. 

- SQL 구조 분석(SQL Structure Analysis) : SQL문이 비효율적인 실행 계획을 생성할 경우 같은 결과를 보여줄 수 있는 비슷한 SQL문을 생성해 권고하는 역할을 합니다. 

이러한 Automatic SQL Tuning 특징은 EM(Enterprise Manager)의 “Advisor Central” 을 이용해서도 사용 할 수 있으며 또한 PL/SQL의 DBMS_SQLTUNE 패키지를 이용해서도 사용 가능 합니다. 본 강좌에서는 PL/SQL에 초점을 맞추어서 진행토록 하겠습니다. 

SQL Tuning Advisor 

SQL Tuning API에 접근 하기 위해서는 ADVISOR라는 권한이 있어야 합니다. 

아래처럼 하면 됩니다. 

SQL>CONN sys/password AS SYSDBA 
SQL>GRANT ADVISOR TO scott; 
SQL>CONN scott/tiger 

SQL Tuning Advisor를 사용하기 위한 첫 번째 단계는 CREATE_TUNING_TASK를 이용하여 새로운 tuning task를 만드는 일입니다. 분석되고자 하는 SQL 문장은 AWR이나 CURSOR CACHE, SQL Tuning set 또는 매뉴얼하게 만들어져 검색 될 수 있습니다. 

SET SERVEROUTPUT ON 

-- Tuning task created for specific a statement from the AWR. 
DECLARE 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
begin_snap => 764, 
end_snap => 938, 
sql_id => '19v5guvsgcd1v', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => '19v5guvsgcd1v_AWR_tuning_task', 
description => 'Tuning task for statement 19v5guvsgcd1v in AWR.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 


-- Tuning task created for specific a statement from the cursor cache. 
DECLARE 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
sql_id => '19v5guvsgcd1v', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => '19v5guvsgcd1v_tuning_task', 
description => 'Tuning task for statement 19v5guvsgcd1v.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 


-- Tuning task created from an SQL tuning set. 
DECLARE 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
sqlset_name => 'test_sql_tuning_set', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => 'sqlset_tuning_task', 
description => 'Tuning task for an SQL tuning set.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 


-- Tuning task created for a manually specified statement. 
DECLARE 
l_sql VARCHAR2(500); 
l_sql_tune_task_id VARCHAR2(100); 
BEGIN 
l_sql := 'SELECT e.*, d.* ' || 
'FROM emp e JOIN dept d ON e.deptno = d.deptno ' || 
'WHERE NVL(empno, ''0'') = :empno'; 

l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task ( 
sql_text => l_sql, 
bind_list => sql_binds(anydata.ConvertNumber(100)), 
user_name => 'scott', 
scope => DBMS_SQLTUNE.scope_comprehensive, 
time_limit => 60, 
task_name => 'emp_dept_tuning_task', 
description => 'Tuning task for an EMP to DEPT join query.'); 
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id); 
END; 



만약 TASK_NAME 파라미터에 값이 있다면 SQL tune task의 식별자로서 사용 되구요, 생략된다면 시스템에서 “TASK_1478” 등과 같이 만들어서 리턴 합니다. 

NVL이 SQL 문장에 사용되다면 옵티마이저로부터 반작용을 유발 하며 부가적으로 그러한 테이블에 관한 통계정보를 지우는 것도 가능 합니다. 

EXEC DBMS_STATS.delete_table_stats('SCOTT','EMP'); 

위에서 tuning task에 대해 정의를 했는데 그 다음으로 할 일은 EXECUTE_TUNING_TASK procedure를 이용하는 일 입니다. 

EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'emp_dept_tuning_task'); 

물론 아래처럼 task를 중단하거나 재시작 하거나 취소하거나 하는 것들이 가능 합니다. 

-- Interrupt and resume a tuning task. 
EXEC DBMS_SQLTUNE.interrupt_tuning_task (task_name => 'emp_dept_tuning_task'); 
EXEC DBMS_SQLTUNE.resume_tuning_task (task_name => 'emp_dept_tuning_task'); 

-- Cancel a tuning task. 
EXEC DBMS_SQLTUNE.cancel_tuning_task (task_name => 'emp_dept_tuning_task'); 

-- Reset a tuning task allowing it to be re-executed. 
EXEC DBMS_SQLTUNE.reset_tuning_task (task_name => 'emp_dept_tuning_task'); 
다음과 같이 tuning task는 DBA_ADVISOER_LOG라는 뷰를 통해서 확인 가능 합니다. 

SQL>SELECT task_name, status FROM dba_advisor_log WHERE owner = 'SCOTT'; 

TASK_NAME STATUS 
------------------------------ ----------- 
emp_dept_tuning_task COMPLETED 

tuning task가 성공적으로 수행 되면 REPORT_TUNING_TASK라는 함수를 통해 권고를 확인 할 수 있습니다. 

SET LONG 10000; 
SET PAGESIZE 1000 
SET LINESIZE 200 
SELECT DBMS_SQLTUNE.report_tuning_task('emp_dept_tuning_task') AS recommendations FROM dual; 
SET PAGESIZE 24 

결과는 아래와 같습니다. 

RECOMMENDATIONS 
-------------------------------------------------------------------------------- 
GENERAL INFORMATION SECTION 
------------------------------------------------------------------------------- 
Tuning Task Name : emp_dept_tuning_task 
Scope : COMPREHENSIVE 
Time Limit(seconds): 60 
Completion Status : COMPLETED 
Started at : 05/06/2004 09:29:13 
Completed at : 05/06/2004 09:29:15 

------------------------------------------------------------------------------- 
SQL ID : 0wrmfv2yvswx1 
SQL Text: SELECT e.*, d.* FROM emp e JOIN dept d ON e.deptno = d.deptno 
WHERE NVL(empno, '0') = :empno 

------------------------------------------------------------------------------- 
FINDINGS SECTION (2 findings) 
------------------------------------------------------------------------------- 

1- Statistics Finding 
--------------------- 
Table "SCOTT"."EMP" and its indices were not analyzed. 

Recommendation 
-------------- 
Consider collecting optimizer statistics for this table and its indices. 
execute dbms_stats.gather_table_stats(ownname => 'SCOTT', tabname => 
'EMP', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, 
method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE) 

Rationale 
--------- 
The optimizer requires up-to-date statistics for the table and its indices 
in order to select a good execution plan. 

2- Restructure SQL finding (see plan 1 in explain plans section) 
---------------------------------------------------------------- 
The predicate NVL("E"."EMPNO",0)=:B1 used at line ID 2 of the execution plan 
contains an __EXPRESSION!__ on indexed column "EMPNO". This __EXPRESSION!__ prevents 
the optimizer from selecting indices on table "SCOTT"."EMP". 

Recommendation 
-------------- 
Rewrite the predicate into an equivalent form to take advantage of 
indices. Alternatively, create a function-based index on the __EXPRESSION!__. 

Rationale 
--------- 
The optimizer is unable to use an index if the predicate is an inequality 
condition or if there is an __EXPRESSION!__ or an implicit data type conversion 
on the indexed column. 

------------------------------------------------------------------------------- 
EXPLAIN PLANS SECTION 
------------------------------------------------------------------------------- 

1- Original 
----------- 
Plan hash value: 1863486531 

---------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
---------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 107 | 4 (0)| 00:00:01 | 
| 1 | NESTED LOOPS | | 1 | 107 | 4 (0)| 00:00:01 | 
| 2 | TABLE ACCESS FULL | EMP | 1 | 87 | 3 (0)| 00:00:01 | 
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 | 
| 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 | 
---------------------------------------------------------------------------------------- 

Note 
----- 
- dynamic sampling used for this statement 

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


1 row selected. 

Tuning task는 다음처럼 DROP 합니다. 

BEGIN 
DBMS_SQLTUNE.drop_tuning_task (task_name => '19v5guvsgcd1v_AWR_tuning_task'); 
DBMS_SQLTUNE.drop_tuning_task (task_name => '19v5guvsgcd1v_tuning_task'); 
DBMS_SQLTUNE.drop_tuning_task (task_name => 'sqlset_tuning_task'); 
DBMS_SQLTUNE.drop_tuning_task (task_name => 'emp_dept_tuning_task'); 
END; 

 

반응형

'Database > ORACLE' 카테고리의 다른 글

one port multi listener 설정 하기  (0) 2012.12.24
DBMS_XPLAN 정보 조회  (0) 2012.09.07
10G OCP 자격증 관련  (2) 2012.07.08
오라클 패키지 CURSOR(커서) 출력 값 조회  (0) 2012.02.23
일정 시간 별로 쿼리 정보 조회  (0) 2012.02.20
반응형

흠...

병렬 인덱스가 성능을 하락 시키는 경우가 많다...

경합이라던지..

잘써야 하는데,

대부분의 사이트에는 아무런 생각없이(?) 가져다 쓰기 바쁘다...

고로...

일괄적으로 조회나 수정할 때 사용하는 쿼리 하앍..

우선

PARALLEL 옵션의 차수 Degree 를 통회 조회하는 방법


 SELECT *
    FROM  DBA_INDEXES -- Dictionary를 통해 indexes로 끝나는 것을 모두 조회하여도 됨...
   WHERE DEGREE NOT IN ('1','DEFAULT','0')
       AND OWNER NOT IN ('SYS','SYSTEM','WMSYS', 'OUTLN', 'TSMSYS', 'SYSMAN') 
 

EX) 병렬 옵션의 차수가 8인 인덱스를 일괄적으로 4로 변경 하기 !

 SELECT 'ALTER INDEX ' || OWNER || '.' || INDEX_NAME || ' PARALLEL(DEGREE 4);'
     FROM DBA_INDEXES
   WHERE DEGREE = '8'
       AND OWNER NOT IN ('SYS','SYSTEM','WMSYS', 'OUTLN', 'TSMSYS', 'SYSMAN')        
 
간단히 참고용으로 작성함... 
반응형
반응형
반응형

'UTILITY' 카테고리의 다른 글

무료 압축 프로그램 반디집  (0) 2012.06.28
PSI Probe  (0) 2012.01.18
IBM 자바 다운로드 주소  (0) 2011.12.05
FogBugZ  (0) 2011.11.17
큐베이스 5 설치  (0) 2011.09.15
반응형

 
반응형
반응형

Acrobat 9 에서는 E-mail 을 통해 PDF 양식을 배포하고 , 양식에 입력된 데이터를 한꺼번에
취합할 수 있어 편리합니다 .






반응형
반응형

{오래된 사진 수정하기}

 

 

다음 예제는 오래된 사진을 수정하는 방법에 대해 설명하고 있습니다.

지금도 마찬가지이겠지만 과거 포토샵은 사진사들에게 인기가 많은 프로그램이었다고 합니다.

과거 한 때 오래된 사진을 사진사에게 맞겨 새 사진처럼 만드는 일이 유행한 적이 있었습니다. 저희 집에서도 새롭게 복구된 사진을 보고 감탄하며 즐거워 하던 기억이 있습니다. 그때 저는 포토샵이라는 프로그램을 몰랐지만 여러분들은 부모님의 오래된 사진을 직접 수정하여 선물로 드려보는 것도 좋으리라 여깁니다.

앞의 강좌 "흑백이미지를 칼라 이미지로 바꾸기"를 함께 참고하여 오래된 흑백사진을 새로 찍은 사진처럼 만들어 보시기 바랍니다.

오래된 사진들은 색이 바래고 흠집이 생기게 마련입니다. 이 예제에서는 바랜 색을 교정하고 흠집을 없애는 방법에 대해 기술하였습니다.

예제에서 사용한 원본은 오래된 사진을 구하기 힘들어 직접 변형을 가하여 훼손시켰음을 참고하시기 바랍니다.

 

원본 사진

 

 
 
 

복구한 사진
 

 

 

 

 

1. 훼손된 이미지를 File/Open 명령으로 연다.

 

 

 

 

2. Filter/Sharpen/Sharpen 명령을 실행한다.
Tip : Sharpen Filter는 이미지를 선명하게 해 주는 도구입니다. 너무 과도하게 사용하면 이미지가

       홰손될 수 있으니 적당하게 사용하여야 합니다.

* Sharpen : 가장 낮은 단계의 Sharpen 명령.
* Sharpen Edges : 이미지의 경계부분에 Sharpen Filter를 적용
* Sharpen More : Sharpen보다 좀더 강하게 적용
* Unsharpen Mask : Sharpen이 적용될 색의 단계를 조정 가능

 

 

 

 

3. Image/Adjust/Curves 명령을 실행하고 뜨는 옵션창에서 왼쪽 그림을 참고로 그래프를 조정한다.

Tip : 오래된 사진은 대체적으로 색의 대비가 약해 선명하지 못한 이미지를 가지고 있습니다. 이 단계는 이를 보완하기 위한 작업입니다.

 

 

 

 

4. Background Layer를 복사하여 Background Copy를 만든다.

Tip : 이제 Layer를 복사하는 방법을 모르는 분들은 없으리라 여깁니다. 혹시 모르시는 분은 아래강좌를 먼저 읽어보시기 바랍니다.

 

 

 

5. Filter/Noise/Median 명령을 실행하고 뜨는 옵션창에 흠집이 뭉개질만큼 Radius 값을 적당하게 주고 OK 버튼을 누른다.

Tip : Noise Filter 그룹은 Noise(잡티)를 만들어주거나 제거해 주는 도구로 모여 있습니다. Median Filter는 명도차이가 심한 픽셀의 색을 바꾸어 주는 방법으로 Noise를 제거하는 도구입니다. 때문에 이미지가 뭉개지는 듯한 효과를 가져옵니다. Radius값을 지나치게 높게 주면 이미지가 너무 뭉개지므로 적당하게 사용하여야 합니다.

 

 

 

6. 완전히 제거되지 않은 흠은 도장툴을 사용하여 수정해 준다.

Tip : 도장툴의 자세한 사용법은 기초다지이의 - Stamp Tool 편을 참고하시기 바랍니다.

 

 

 

7. Edit/Define Pattern 명령을 실행하여 전체 이미지를 Pattern으로 등록시킨다.

Tip : Define Pattern의 설명은 "사진을 이용한 특수효과"를 참고하시기 바랍니다.

 

 

 

8. Background copy의 눈 아이콘을 클릭하여 안보이게 하여 주고 Background를 선택한다

Tool Box의 도장툴을 길 게 누르면 나타나는 확장 메뉴에서 Pattern Stamp Tool을 선택하고 상단 옵션 바 Pattern 옵션에서 전 단계에서 등록한 Pattern을 선택한다.

 

 

 

 

9. 옵션 바에서 Mode를 Lighten을 선택하고 어두운 부분의 흠을 문질러 없애준다.

Tip : Mode 옵션은 Layer파레트에 있는 Blend Mode와 같은 원리입니다. Lighten을 선택하면 원본 이미지보다 입혀질 색이 밝은 경우에만 효과가 들어가게 됩니다. 즉, 어두운 흠이 있는 부분은 등록시킨 Pattern 이미지보다 어둡기 때문에 Pattern의 이미지가 입혀지고 그 외의 부분은 같은 명도를 가지기 때문에 효과가 들어가지 않게 되는 것입니다.
Blend Mode에의 사용법은 후에 Layer에 대해 알아보면서 자세히 살펴보겠습니다.

 

 

 

 

10. 이번에는 옵션 바의 Mode옵션에서 Darken을 선택하고 밝은색의 흠을 문질러 없애준다.

Tip : Darken Mode는 Lighten Mode의 반대성질을 가진 Mode입니다.

 

 

 

11. Backgrond copy Layer를 삭제한다.

 

 

 

 

12. 다시 Background를 복사하여 새로운 Background copy를 만든다.

 

 

 

 

13. Image/Adjust/Hue/Saturation 명령을 실행하고 뜨는 대화창에서 Saturation 옵션을 높게 올려준다.

Tip : 이 과정은 Saturation (채도)을 높여주어 바랜 색을 수정하는 부분입니다. Hue/ Saturation의 자세한 설명은 "청바지 로고 만들기" 예제를 참고하시기 바랍니다.

 

 

 

14. Background copy의 Blending Mode를 Color로 바꾸어 준다.

Tip : Color Mode는 선택된 Layer의 색상을 그대로 유지하면서 아래쪽 Layer의 명도를 사용하는 합성 방법입니다. 이미지의 채도를 높여주면 명도까지 변하게 되는데 이를 보완해 주기 위해서 사용한 명령입니다.
역시 Layer에 대해 공부하면서 자세히 알아보도록 하겠습니다.

 

 

 

15. Image/ Adjust/ Curves 명령을 실행하고 적당하게 조정하여 준다.

 

 

 

 

16. 완성된 이미지

 

 
 
 
 
 
* 이 강좌는 스탭 구르미님의 강좌입니다.
 
 
반응형

+ Recent posts