SQL Advisor 사용을 하셔서 튜닝을 진행 해 보신적이 있는지요 ?
했다 안 했다기 보다는 우선 사용방법 부터 익히고 차 후 튜닝진행시 보조역할자로 사용 해 보시것도 고해 해 보시라는 의미로
글을 올려 봅니다.
테스트한 기반으로 내용을 채워 보겠습니다.
AS
SELECT A.LV, ROWNUM AS RID, OBJECT_TYPE, OBJECT_NAME
FROM DBA_OBJECTS , (
SELECT LEVEL LV
FROM DUAL
CONNECT BY LEVEL <=10000
)A ;
통계수집도 진행
select count(*) from t_offset;
T_OFFSET
--------
Rows=544,377,340 Blocks=3,530,057
Empty_Blocks=0 Avg_Space=0
Chain_Count=0 Avg_Row_Length=41
Avg_Space_Freelist_Blocks=0 Freelist_Blocks=0
Sample_Size=54,437,734 Last_Analyzed='2020-04-01 11:02:23'
Partitioned='NO' Tablespace='USERS'
Column Name Nullable Column Type Distinct Buckets
-------------------------------- -------- ------------------- ---------- ----------
LV NUMBER 10,000 1
RID NUMBER 544,377,340 1
OBJECT_TYPE VARCHAR2(23) 41 1
OBJECT_NAME VARCHAR2(128) 24,006 1
INDEX
-----------------------------------------------------------------------------
'No Index'
sql문도 수행 해 보고 DBMS Xplan도 확인 해보고, SQL ID도 확인 해봅니다.
중요한것은 반드시 SQL ID를 찾아야 합니다.
FROM (SELECT rid, rownum AS rnum
FROM (SELECT *
FROM T_OFFSET
ORDER BY rid)
WHERE rownum <= 100
)
WHERE rnum >= 90;
SQL_ID ca44dx44qrq6s, child number 0
-------------------------------------
SELECT * FROM (SELECT rid, rownum AS rnum FROM (SELECT *
FROM T_OFFSET ORDER BY rid)
WHERE rownum <= 100 ) WHERE rnum >= 90
Plan hash value: 1388389564
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | | 6733K(100)| | 11 |00:01:58.32 | 3526K| 3526K| | | |
|* 1 | VIEW | | 1 | 100 | 2600 | | 6733K (1)| 00:04:24 | 11 |00:01:58.32 | 3526K| 3526K| | | |
|* 2 | COUNT STOPKEY | | 1 | | | | | | 100 |00:01:58.32 | 3526K| 3526K| | | |
| 3 | VIEW | | 1 | 544M| 6749M| | 6733K (1)| 00:04:24 | 100 |00:01:58.32 | 3526K| 3526K| | | |
|* 4 | SORT ORDER BY STOPKEY| | 1 | 544M| 20G| 28G| 6733K (1)| 00:04:24 | 100 |00:01:58.32 | 3526K| 3526K| 6144 | 6144 | 6144 (0)|
| 5 | TABLE ACCESS FULL | T_OFFSET | 1 | 544M| 20G| | 959K (1)| 00:00:38 | 544M|00:01:12.09 | 3526K| 3526K| | | |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$2 / from$_subquery$_001@SEL$1
2 - SEL$2
3 - SEL$3 / from$_subquery$_002@SEL$2
4 - SEL$3
5 - SEL$3 / T_OFFSET@SEL$3
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RNUM">=90)
2 - filter(ROWNUM<=100)
4 - filter(ROWNUM<=100)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "from$_subquery$_001"."RID"[NUMBER,22], "RNUM"[NUMBER,22]
2 - "RID"[NUMBER,22], ROWNUM[8]
3 - "RID"[NUMBER,22]
4 - (#keys=1) "T_OFFSET"."RID"[NUMBER,22]
5 - "T_OFFSET"."RID"[NUMBER,22]
또는 아래 처럼 찾아 보기도 합니다.
selecT SQL_ID , SQL_TEXT, SQL_FULLTEXT from V$SQLAREA WHERE SQL_FULLTEXT LIKE '%T_OFFSET%';
DBA_ADVISOR_LOG 테이블을 이용하여 어떤 단계인지도 확인 해 봅니다.
DBMS_SQLTUNE 패키지를 이용하여 SQL문 튜닝 권고를 받을 수 있도록 수행이 필요 합니다.
근데 아쉽게도 Enterprise Edition 에서만 진행이 가능 합니다. - 여기서 오라클의 뒷통수를 크게 맞네요. ( SE2 사용자분들은 어찌 해야 할지 난감 하네요. )
튜닝 가이드를 받기 위해서는 아래 절차가 필요 합니다.
Create Tuning Task -> Execute Tuning Task -> Tuning advisor Report -> Drop tuning Task 전에 반드시 Tuning Task list 확인 후 지우시면 됩니다.
1. Create Tuning Task
l_sql_tune_task_id VARCHAR2(100);
BEGIN
l_sql_tune_task_id := DBMS_SQLTUNE.CREATE_TUNING_TASK (
sql_id => '7r036z8114hd8',
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 1800,
task_name => '7r036z8114hd8_tuning_task',
description => 'Tuning task for statement 7r036z8114hd8.');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
/
2. Execute Tuning Task
3. Tuning advisor Report
SET LONG 10000;
SET PAGESIZE 1000
SET LINESIZE 200
col RECOMMENT FORMAT a350
SELECT DBMS_SQLTUNE.report_tuning_task('ca44dx44qrq6s_tuning_task') AS RECOMMENT FROM dual;
SET PAGESIZE 24
결과는 아래와 같습니다.
SQL*Plus: Release 19.0.0.0.0 - Production on 화 3월 31 16:27:49 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
사용자명 입력: xxxxx/"xxxxx!@"@xxx
마지막 성공한 로그인 시간: 화 3월 31 2020 16:21:12 +09:00
다음에 접속됨:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> SET LONG 10000;
SQL> SET PAGESIZE 1000
SQL> SET LINESIZE 200
SQL> col RECOMMENT FORMAT a350
SQL> SELECT DBMS_SQLTUNE.report_tuning_task('ca44dx44qrq6s_tuning_task') AS RECOMMENT FROM dual;
RECOMMENT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : ca44dx44qrq6s_tuning_task
Tuning Task Owner : OWNER명
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status : COMPLETED
Started at : 04/09/2020 11:13:41
Completed at : 04/09/2020 11:13:42
-------------------------------------------------------------------------------
Schema Name: OWNER명
SQL ID : ca44dx44qrq6s
SQL Text : SELECT *
FROM (SELECT rid, rownum AS rnum
FROM (SELECT *
FROM T_OFFSET
ORDER BY rid)
WHERE rownum <= 100
)
WHERE rnum >= 90
-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------
1- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------
이 명령문에 대해 잠재적으로 더 나은 실행 계획이 발견되었습니다.
Recommendation (estimated benefit: 93.05%)
------------------------------------------
- 이 명령문에 병렬 실행을 사용하려면 권장 SQL 프로파일을 그대로 적용하는 것이 좋습니다.
execute dbms_sqltune.accept_sql_profile(task_name =>
'ca44dx44qrq6s_tuning_task', task_owner => 'owner명',
replace => TRUE, profile_type => DBMS_SQLTUNE.PX_PROFILE);
DOP 16을(를) 사용하여 이 병렬 질의를 실행하면 원래 계획에 대한 응답 시간 93.06%이(가) 향상됩니다. 단, 병렬 실행을
사용으로 설정하면 명령문의 리소스 소비가 11.06%까지 증가하여 시스템 처리량이 줄어들 수 있습니다. 또한 훨씬 짧은 기간에 리소스가
소비되므로 사용 가능한 하드웨어 용량이 부족할 경우 동시 명령문의 응답 시간에 부정적인 영향을 줄 수 있습니다.
The following data shows some sampled statistics for this SQL from the past
week and projected weekly values when parallel execution is enabled.
Past week sampled statistics for this SQL
-----------------------------------------
Number of executions 0
Percent of total activity 0
Percent of samples with #Active Sessions > 2*CPU 0
Weekly DB time (in sec) 0
Projected statistics with Parallel Execution
--------------------------------------------
Weekly DB time (in sec) 0
-------------------------------------------------------------------------------
ADDITIONAL INFORMATION SECTION
-------------------------------------------------------------------------------
- 최적기는 실행 계획의 행 ID 3에서 뷰를 병합할 수 없었습니다. 명령문이 "DELETE" 또는 "UPDATE"이고 상위 질의가
명령문에서 최상위 질의가 아닌 경우 최적기는 "ORDER BY" 절을 포함하는 뷰를 병합할 수 없습니다.
- 최적기는 실행 계획의 행 ID 1에서 뷰를 병합할 수 없었습니다. 최적기는 "ROWNUM" 의사 열을 포함하는 뷰를 병합할 수 없습니다.
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
1- Original
-----------
Plan hash value: 1388389564
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100 | 2600 | | 6733K (1)| 00:04:24 |
|* 1 | VIEW | | 100 | 2600 | | 6733K (1)| 00:04:24 |
|* 2 | COUNT STOPKEY | | | | | | |
| 3 | VIEW | | 544M| 6749M| | 6733K (1)| 00:04:24 |
|* 4 | SORT ORDER BY STOPKEY| | 544M| 20G| 28G| 6733K (1)| 00:04:24 |
| 5 | TABLE ACCESS FULL | T_OFFSET | 544M| 20G| | 959K (1)| 00:00:38 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RNUM">=90)
2 - filter(ROWNUM<=100)
4 - filter(ROWNUM<=100)
2- Using Parallel Execution
---------------------------
Plan hash value: 162111451
-------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100 | 2600 | | 467K (1)| 00:00:19 | | | |
|* 1 | VIEW | | 100 | 2600 | | 467K (1)| 00:00:19 | | | |
|* 2 | COUNT STOPKEY | | | | | | | | | |
| 3 | PX COORDINATOR | | | | | | | | | |
| 4 | PX SEND QC (ORDER) | :TQ10001 | 544M| 6749M| | 467K (1)| 00:00:19 | Q1,01 | P->S | QC (ORDER) |
| 5 | VIEW | | 544M| 6749M| | 467K (1)| 00:00:19 | Q1,01 | PCWP | |
|* 6 | SORT ORDER BY STOPKEY | | 544M| 20G| 28G| 467K (1)| 00:00:19 | Q1,01 | PCWP | |
| 7 | PX RECEIVE | | 100 | 1300 | | | | Q1,01 | PCWP | |
| 8 | PX SEND RANGE | :TQ10000 | 100 | 1300 | | | | Q1,00 | P->P | RANGE |
|* 9 | SORT ORDER BY STOPKEY| | 100 | 1300 | | | | Q1,00 | PCWP | |
| 10 | PX BLOCK ITERATOR | | 544M| 20G| | 66590 (1)| 00:00:03 | Q1,00 | PCWC | |
| 11 | TABLE ACCESS FULL | T_OFFSET | 544M| 20G| | 66590 (1)| 00:00:03 | Q1,00 | PCWP | |
-------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RNUM">=90)
2 - filter(ROWNUM<=100)
6 - filter(ROWNUM<=100)
9 - filter(ROWNUM<=100)
-------------------------------------------------------------------------------
SQL> SET PAGESIZE 24
SQL>
결과 가이드 확인해 보시길 바랍니다.
꼭 가이드가 맞는것은 아니지만, 그렇다고 틀리다고는 할 수 없을듯 합니다.
어느곳에서는 잘 활용이 가능 할 듯 하고, 어느 곳에서는 "응" 이라고 할 수 있습니다.
필수는 아니지만 그래도 알고 모르고의 차이도 있을 수 있으니 여러방향으로 의견을 낼때 가능 할 수 있도록 활용을 하시면 됩니다.
4. Drop tuning Task
SELECT OWNER, TASK_NAME, EXECUTION_START, EXECUTION_END, STATUS FROM DBA_ADVISOR_LOG WHERE OWNER='owner명';
## 삭제 하기
BEGIN
DBMS_SQLTUNE.DROP_TUNING_TASK (task_name => 'ca44dx44qrq6s_tuning_task');
END;
/
https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sqltun.htm#i1006896
보시면 SQL ID, SQL TEXT, AWR SNAP ID 이용 등 다양한 방법으로 사용이 가능 하도록 제공 해 주고 있습니다.
꼭 필요하신 분들은 꼼꼼히 보신 후 활용을 해 보시길 바랍니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
10 | events 활용 (10384,10046,10053 ) MOS 기준 [2] | 우뽕 | 2023.04.06 | 660 |
9 | 튜닝시 SQL 문장의 OutLine 정보를 추출하는 SQL 문장 | 명품관 | 2021.01.14 | 35591 |
» | SQL Advisor 사용법을 이용한 튜닝 가이드 | 우뽕 | 2020.04.09 | 3519 |
7 | [12cR1 이상] Limiting SQL Rows 활용하여 페이징 처리 해 보기 [1] | 우뽕 | 2020.03.27 | 2068 |
6 | DB 유저가 DBMS_XPLAN 패키기 사용시 필요한 권한 | 명품관 | 2020.03.20 | 1329 |
5 | DBMS_SHARED_POOL 사용 | 우뽕 | 2020.03.11 | 1014 |
4 | Column 를 이용한 hint 사용하기 [1] | 우뽕 | 2020.02.28 | 1972 |
3 | _smu_debug_mode 와_undo_autotune 관련 내용 정리 | 우뽕 | 2020.01.23 | 1241 |
2 | [12cR2 이상] _cursor_obsolete_threshold 기본값으로 변경 하기 | 우뽕 | 2020.01.23 | 1382 |
1 | V$SQL_HINT를 통해 HINT 종류 확인 | 명품관 | 2019.05.29 | 778 |