What is the SQL Tuning Advisor and How to Run SQL Tuning Advisor Manually in Oracle | Oracle Database Performance Tuning Tutorial -10

Hi,

I will explain what is the SQL Tuning Advisor and how to use it in this Article.

 

You can read the following article before this.

Optimizer Access Paths & Join Operators ( Hash Join, Nested Loop ) in Oracle | Oracle Database Performance Tuning Tutorial -8

 

 

 

Oracle database has Query optimizer which can perform SQL Tuning automatically. This Query optimizer is running in two modes.

Normal Mode: Optimizer should operate with very limited time, and it must find a good execution in this limited time. This execution plan is not probably the best.

Tuning Mode: Optimizer operates in several minutes to tune SQL Statements, there is no limited time. Oracle optimizer try to find lots of execution plan which is better than the execution plan produced under the normal mode.

 

There are many advisors who direct DBAs and facilitate their some tasks in the Oracle Database as follows. Using these advisors, you can perform some tasks much more easily.

  • SQL Tuning Advisor
  • SQL Access Advisor
  • Memory Advisor
  • Undo Advisor
  • Data Recovery Advisor (DRA)

 

SQL Tuning Advisor is introduced with Oracle Database 10g and the one of the most popular advisor of the Oracle database for Database Administrator ( DBA ). Because it analyzes high load SQL statements which is called TOP SQLs and offer you some useful recommendations for Tuning.

SQL Tuning Advisor analyzes one or more SQL statements same time, it invokes the Automatic Tuning Optimizer to perform SQL tuning on the statements. Some of SQL Tuning Advisor recommendations are as follows.

  • Collection of Table or Index statistics
  • New Index creation
  • Restructuring of the SQL statement
  • SQL Profile creation

I will explain SQL Tuning advisor usage in this article.

 

 

These are just recommendations, not implementation. DBA should probe and analyze these recommendations, if they are appopriate for related SQLs, they can be applied as follows.

 

 

 

Now let’s go to run SQL Tuning Advisor for any SQL. You should select this SQL between TOP SQL. If you don’t know which SQL you should tune, then you can generate an AWR report to see TOP SQL.

Read the following article if you don’t know how to generate an AWR report, or what is the AWR report.

https://ittutorial.org/awr-report-sqlplus-enterprise-manager-and-toad-how-to-generate-in-oracle/

 

 

I will run SQL Tuning Advisor ( STA ) for SQL_ID: dz3rmaqvta9uq .

 

Step-1:  Firstly Create Tuning task as follows.

variable stmt_task VARCHAR2(64); 
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => 'dz3rmaqvta9uq',task_name=>'msd_dz3rmaqvta9uq');

 

 

This will create tuning task for related SQL_ID if it exist in the Cache. If it doesn’t exist, you should create Tuning task using AWR Snapshow as follows.

 

SET SERVEROUTPUT ON
DECLARE
l_sql_tune_task_id VARCHAR2(100);
BEGIN
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
begin_snap => 43000,
end_snap => 43700,
sql_id => 'dz3rmaqvta9uq',
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 60,
task_name => 'msd_dz3rmaqvta9uq',
description => 'Tuning task for statement msd_dz3rmaqvta9uq');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
/

 

Step -2: Check if it exists or not as follows.

SQL> SELECT status FROM USER_ADVISOR_TASKS WHERE task_name ='msd_dz3rmaqvta9uq';

STATUS
-----------
COMPLETED

SQL>

 

Step -3: Once Tuning task is created, you should execute it as follows.

BEGIN
dbms_sqltune.execute_tuning_task (task_name => 'msd_dz3rmaqvta9uq');
end;
/

 

Step -4: If Execution of Tuning task is completed, you can display the Report as follows.

 

SET linesize 200
SET LONG 999999999
SET pages 1000
SET longchunksize 20000 
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'msd_dz3rmaqvta9uq' ) FROM DUAL;







All content of Tuning task are as follows.

 

 

GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : msd_dz3rmaqvta9uq
Tuning Task Owner  : SYS
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status  : COMPLETED
Started at         : 11/19/2019 11:34:47
Completed at       : 11/19/2019 11:35:32
-------------------------------------------------------------------------------
Schema Name: SYS
SQL ID     : dz3rmaqvta9uq
SQL Text   : SELECT TO_NUMBER(NULL) DFNUMBER, TO_NUMBER(NULL) CREATE_SCN,
BRL.RESETLOGS_CHANGE# RESET_SCN, BRL.RESETLOGS_TIME RESET_TIME,
TO_NUMBER(NULL) CKP_SCN, TO_DATE(NULL) CKP_TIME, TO_NUMBER(NULL)
STOP_SCN, BRL.THREAD# LOGTHREAD, BRL.SEQUENCE# LOGSEQUENCE,
TO_NUMBER(NULL) SETSTAMP, TO_NUMBER(NULL) SETCOUNT,
BS.COMPLETION_TIME COMPTIME, 0 NBACKUPS, BRL.TERMINAL
LOGTERMINAL, BRL.NEXT_CHANGE# NEXT_SCN, 0 PLUGGEDRONLY, 0
PLUGINSCN, 0 PLUGINRLGSCN, TO_DATE(NULL) PLUGINRLGTIME,
TO_NUMBER(NULL) NEWCREATE_SCN, TO_NUMBER(NULL) NEWRESET_SCN,
TO_DATE(NULL) NEWRESET_TIME FROM V$BACKUP_REDOLOG BRL, (SELECT
DISTINCT THREAD#, SEQUENCE#, RESETLOGS_CHANGE#, RESETLOGS_TIME
FROM V$ARCHIVED_LOG WHERE STATUS = 'A' AND ARCHIVED = 'YES' AND
STANDBY_DEST = 'NO' AND (:B15 IS NULL OR THREAD# = :B15 ) AND
(:B14 IS NULL OR SEQUENCE# >= :B14 ) AND (:B13 IS NULL OR
SEQUENCE# <= :B13 ) AND (:B12 IS NULL OR NEXT_CHANGE# > :B12 )
AND (:B11 IS NULL OR FIRST_CHANGE# < :B11 ) AND (:B10 IS NULL OR
NAME LIKE :B10 ) AND (:B9 IS NULL OR NEXT_TIME > :B9 ) AND (:B8
IS NULL OR FIRST_TIME <= :B8 )) AL, (SELECT DISTINCT
BS.SET_STAMP, BS.SET_COUNT, BS.COMPLETION_TIME FROM
V$BACKUP_PIECE BP, V$BACKUP_SET BS WHERE BP.STATUS = 'A' AND
BS.BACKUP_TYPE = 'L' AND BS.SET_STAMP = BP.SET_STAMP AND
BS.SET_COUNT = BP.SET_COUNT AND (:B7 IS NULL OR (:B7 != 'B' AND
:B7 != 'D') OR ((:B7 = 'B' OR :B7 = 'D') AND ((:B6 IS NULL AND
BS.KEEP_OPTIONS IS NULL) OR (:B6 = BP.TAG AND BS.KEEP_OPTIONS IS
NOT NULL)))) AND (:B5 IS NULL OR :B5 = BP.DEVICE_TYPE) AND ((:B4
IS NULL AND :B3 IS NULL AND :B2 IS NULL AND :B1 IS NULL) OR
(BP.HANDLE LIKE :B4 OR BP.HANDLE LIKE :B3 OR BP.HANDLE LIKE :B2
OR BP.HANDLE LIKE :B1 )) GROUP BY BS.SET_STAMP, BS.SET_COUNT,
BP.DEVICE_TYPE, BP.COPY#, BS.PIECES, BS.COMPLETION_TIME HAVING
COUNT(DISTINCT BP.PIECE#) = BS.PIECES) BS WHERE BRL.THREAD# =
AL.THREAD# AND BRL.SEQUENCE# = AL.SEQUENCE# AND
BRL.RESETLOGS_CHANGE# = AL.RESETLOGS_CHANGE# AND
BRL.RESETLOGS_TIME = AL.RESETLOGS_TIME AND BS.SET_STAMP =
BRL.SET_STAMP AND BS.SET_COUNT = BRL.SET_COUNT UNION ALL SELECT
TO_NUMBER(NULL) DFNUMBER, TO_NUMBER(NULL) CREATE_SCN,
XAL.RESETLOGS_CHANGE# RESET_SCN, XAL.RESETLOGS_TIME RESET_TIME,
TO_NUMBER(NULL) CKP_SCN, TO_DATE(NULL) CKP_TIME, TO_NUMBER(NULL)
STOP_SCN, XAL.THREAD# LOGTHREAD, XAL.SEQUENCE# LOGSEQUENCE,
TO_NUMBER(NULL) SETSTAMP, TO_NUMBER(NULL) SETCOUNT,
XAL.COMPLETION_TIME COMPTIME, 0 NBACKUPS, XAL.TERMINAL
LOGTERMINAL, XAL.NEXT_CHANGE# NEXT_SCN, 0 PLUGGEDRONLY, 0
PLUGINSCN, 0 PLUGINRLGSCN, TO_DATE(NULL) PLUGINRLGTIME,
TO_NUMBER(NULL) NEWCREATE_SCN, TO_NUMBER(NULL) NEWRESET_SCN,
TO_DATE(NULL) NEWRESET_TIME FROM V$PROXY_ARCHIVEDLOG XAL,
(SELECT DISTINCT THREAD#, SEQUENCE#, RESETLOGS_CHANGE#,
RESETLOGS_TIME FROM V$ARCHIVED_LOG WHERE STATUS = 'A' AND
ARCHIVED = 'YES' AND STANDBY_DEST = 'NO' AND (:B15 IS NULL OR
THREAD# = :B15 ) AND (:B14 IS NULL OR SEQUENCE# >= :B14 ) AND
(:B13 IS NULL OR SEQUENCE# <= :B13 ) AND (:B12 IS NULL OR
NEXT_CHANGE# > :B12 ) AND (:B11 IS NULL OR FIRST_CHANGE# < :B11
) AND (:B10 IS NULL OR NAME LIKE :B10 ) AND (:B9 IS NULL OR
NEXT_TIME > :B9 ) AND (:B8 IS NULL OR FIRST_TIME <= :B8 )) AL
WHERE XAL.THREAD# = AL.THREAD# AND XAL.SEQUENCE# = AL.SEQUENCE#
AND XAL.RESETLOGS_CHANGE# = AL.RESETLOGS_CHANGE# AND
XAL.RESETLOGS_TIME = AL.RESETLOGS_TIME AND XAL.STATUS = 'A' AND
(:B7 IS NULL OR (:B7 != 'B' AND :B7 != 'D') OR ((:B7 = 'B' OR
:B7 = 'D') AND ((:B6 IS NULL AND XAL.KEEP_OPTIONS IS NULL) OR
(:B6 = XAL.TAG AND XAL.KEEP_OPTIONS IS NOT NULL)))) AND (:B5 IS
NULL OR :B5 = XAL.DEVICE_TYPE) AND ((:B4 IS NULL AND :B3 IS NULL
AND :B2 IS NULL AND :B1 IS NULL) OR (XAL.HANDLE LIKE :B4 OR
XAL.HANDLE LIKE :B3 OR XAL.HANDLE LIKE :B2 OR XAL.HANDLE LIKE
:B1 )) ORDER BY RESET_SCN, RESET_TIME, LOGTHREAD, LOGSEQUENCE,
LOGTERMINAL DESC, COMPTIME
Bind Variables :
1 -  (NUMBER):NULL
2 -  (NUMBER):NULL
3 -  (NUMBER):NULL
4 -  (NUMBER):NULL
5 -  (NUMBER):NULL
6 -  (NUMBER):NULL
7 -  (NUMBER):0
8 -  (NUMBER):0
9 -  (NUMBER):281474976710656
10 -  (NUMBER):281474976710656
11 -  (VARCHAR2(2000)):NULL
12 -  (VARCHAR2(2000)):NULL
13 -  (DATE):NULL
14 -  (DATE):NULL
15 -  (DATE):NULL
16 -  (DATE):NULL
17 -  (VARCHAR2(32)):B
18 -  (VARCHAR2(32)):B
19 -  (VARCHAR2(32)):B
20 -  (VARCHAR2(32)):B
21 -  (VARCHAR2(32)):B
22 -  (VARCHAR2(32)):NULL
23 -  (VARCHAR2(32)):NULL
24 -  (VARCHAR2(32)):DISK
25 -  (VARCHAR2(32)):DISK
26 -  (VARCHAR2(32)):NULL
27 -  (VARCHAR2(32)):NULL
28 -  (VARCHAR2(32)):NULL
29 -  (VARCHAR2(32)):NULL
30 -  (VARCHAR2(32)):NULL
31 -  (VARCHAR2(32)):NULL
32 -  (VARCHAR2(32)):NULL
33 -  (VARCHAR2(32)):NULL
34 -  (NUMBER):NULL
35 -  (NUMBER):NULL
36 -  (NUMBER):NULL
37 -  (NUMBER):NULL
38 -  (NUMBER):NULL
39 -  (NUMBER):NULL
40 -  (NUMBER):0
41 -  (NUMBER):0
42 -  (NUMBER):281474976710656
43 -  (NUMBER):281474976710656
44 -  (VARCHAR2(2000)):NULL
45 -  (VARCHAR2(2000)):NULL
46 -  (DATE):NULL
47 -  (DATE):NULL
48 -  (DATE):NULL
49 -  (DATE):NULL
50 -  (VARCHAR2(32)):B
51 -  (VARCHAR2(32)):B
52 -  (VARCHAR2(32)):B
53 -  (VARCHAR2(32)):B
54 -  (VARCHAR2(32)):B
55 -  (VARCHAR2(32)):NULL
56 -  (VARCHAR2(32)):NULL
57 -  (VARCHAR2(32)):DISK
58 -  (VARCHAR2(32)):DISK
59 -  (VARCHAR2(32)):NULL
60 -  (VARCHAR2(32)):NULL
61 -  (VARCHAR2(32)):NULL
62 -  (VARCHAR2(32)):NULL
63 -  (VARCHAR2(32)):NULL
64 -  (VARCHAR2(32)):NULL
65 -  (VARCHAR2(32)):NULL
66 -  (VARCHAR2(32)):NULL
-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------
1- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------
  A potentially better execution plan was found for this statement.
  Recommendation (estimated benefit: 73.23%)
  ------------------------------------------
  - Consider accepting the recommended SQL profile.
    execute dbms_sqltune.accept_sql_profile(task_name => 'msd_dz3rmaqvta9uq',
            task_owner => 'SYS', replace => TRUE);
Validation results
------------------
The SQL profile was tested by executing both its plan and the original plan
and measuring their respective execution statistics. A plan may have been
only partially executed if the other could be run to completion in less time.
Original Plan  With SQL Profile  % Improved
-------------  ----------------  ----------
Completion Status:             PARTIAL          COMPLETE
Elapsed Time (s):           15.252865          3.207375      78.97 %
CPU Time (s):               14.394812          3.018541      79.03 %
User I/O Time (s):            .003049           .002106      30.92 %
Buffer Gets:                      114               114          0 %
Physical Read Requests:          1263               430      65.95 %
Physical Write Requests:            0                 0 
Physical Read Bytes:       1110736896         345833472      68.86 %
Physical Write Bytes:               0                 0 
Rows Processed:                     0              4181 
Fetches:                            0              4181 
Executions:                         0                 1 
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
1- Original With Adjusted Cost
------------------------------
Plan hash value: 523732790
------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |           |  4182 |   527K|       | 10050  (97)| 00:00:01 |
|   1 |  SORT ORDER BY             |           |  4182 |   527K|  1872K|  9684 (100)| 00:00:01 |
|   2 |   UNION-ALL                |           |       |       |       |            |          |
|   3 |    NESTED LOOPS            |           |  4181 |   526K|       |  9683 (100)| 00:00:01 |
|   4 |     NESTED LOOPS           |           |  4181 |   396K|       |     2 (100)| 00:00:01 |
|   5 |      VIEW                  |           |     3 |   135 |       |     1 (100)| 00:00:01 |
|   6 |       HASH UNIQUE          |           |     3 |   477 |       |     1 (100)| 00:00:01 |
|*  7 |        FIXED TABLE FULL    | X$KCCAL   |  2158 |   335K|       |     0   (0)| 00:00:01 |
|*  8 |      FIXED TABLE FULL      | X$KCCBL   |  1394 | 72488 |       |     0   (0)| 00:00:01 |
|*  9 |     VIEW                   |           |     1 |    32 |       |     2 (100)| 00:00:01 |
|  10 |      SORT UNIQUE           |           |  1404 | 70200 |       |     2 (100)| 00:00:01 |
|* 11 |       FILTER               |           |       |       |       |            |          |
|  12 |        SORT GROUP BY       |           |  1404 | 70200 |       |     2 (100)| 00:00:01 |
|  13 |         VIEW               | VM_NWVW_1 |  3546 |   173K|       |     1 (100)| 00:00:01 |
|  14 |          SORT GROUP BY     |           |  3546 |   512K|       |     1 (100)| 00:00:01 |
|* 15 |           HASH JOIN        |           |  3546 |   512K|       |     0   (0)| 00:00:01 |
|* 16 |            FIXED TABLE FULL| X$KCCBP   |  4566 |   481K|       |     0   (0)| 00:00:01 |
|* 17 |            FIXED TABLE FULL| X$KCCBS   |  3546 |   138K|       |     0   (0)| 00:00:01 |
|  18 |    NESTED LOOPS            |           |     1 |   440 |       |     1 (100)| 00:00:01 |
|* 19 |     FIXED TABLE FULL       | X$KCCPA   |     1 |   395 |       |            |          |
|* 20 |     VIEW                   |           |     1 |    45 |       |     1 (100)| 00:00:01 |
|  21 |      SORT UNIQUE           |           |     3 |   477 |       |     1 (100)| 00:00:01 |
|* 22 |       FIXED TABLE FULL     | X$KCCAL   |  2158 |   335K|       |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
7 - filter((:B15 IS NULL OR "ALTHP"=:B15) AND (:B14 IS NULL OR "ALSEQ">=:B14) AND 
(:B13 IS NULL OR "ALSEQ"<=:B13) AND (:B10 IS NULL OR "ALNAM" LIKE :B10) AND (:B12 IS 
NULL OR TO_NUMBER("ALNXS")>:B12) AND (:B11 IS NULL OR TO_NUMBER("ALLOS")<:B11) AND (:B9 
IS NULL OR TO_DATE("ALNXT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')>:B9) AND 
(:B8 IS NULL OR TO_DATE("ALLOT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')<=:B8
) AND DECODE(BITAND("ALFLG",6145),0,'A',1,'D',2048,'X',4096,'U','?')='A' AND 
DECODE(BITAND("ALFLG",2),0,'NO','YES')='YES' AND 
DECODE(BITAND("ALFLG",8),0,'NO','YES')='NO' AND "INST_ID"=USERENV('INSTANCE'))
8 - filter("BLSEQ"="AL"."SEQUENCE#" AND "BLTHP"="AL"."THREAD#" AND 
"AL"."RESETLOGS_CHANGE#"=TO_NUMBER("BLRLS") AND TO_DATE("BLRLC",'MM/DD/RR 
HH24:MI:SS','nls_calendar=''GREGORIAN''')=INTERNAL_FUNCTION("AL"."RESETLOGS_TIME") AND 
"INST_ID"=USERENV('INSTANCE') AND BITAND("BLFLG",2)<>2)
9 - filter("BS"."SET_STAMP"="BLBSS" AND "BS"."SET_COUNT"="BLBSC")
11 - filter("$vm_col_3"=COUNT("$vm_col_1"))
15 - access("BSBSS"="BPBSS" AND "BSBSC"="BPBSC")
filter(:B7 IS NULL OR :B7<>'B' AND :B7<>'D' OR (:B7='B' OR :B7='D') AND (:B6 IS 
NULL AND DECODE(BITAND("BSTYP",1792),256,'LOGS',512,'NOLOGS',1024,'BACKUP_LOGS',NULL) 
IS NULL OR "BPTAG"=:B6 AND DECODE(BITAND("BSTYP",1792),256,'LOGS',512,'NOLOGS',1024,'BAC
KUP_LOGS',NULL) IS NOT NULL))
16 - filter((:B4 IS NULL AND :B3 IS NULL AND :B2 IS NULL AND :B1 IS NULL OR "BPHDL" 
LIKE :B4 OR "BPHDL" LIKE :B3 OR "BPHDL" LIKE :B2 OR "BPHDL" LIKE :B1) AND 
DECODE(BITAND("BPFLG",12289),0,'A',1,DECODE(BITAND("BPFLG2",1),1,'F','D'),4096,'X',8192,
'U','?')='A' AND ("BPDEV"=:B5 OR :B5 IS NULL) AND "INST_ID"=USERENV('INSTANCE'))
17 - filter(CASE BITAND("BSTYP",16) WHEN 16 THEN 'I' ELSE 
DECODE(BITAND("BSTYP",11),1,'D',2,'I',8,'L') END ='L' AND "INST_ID"=USERENV('INSTANCE') 
AND (BITAND("BSTYP",32)<>32 OR BITAND("BSTYP",32768)=32768))
19 - filter((:B5 IS NULL OR "PCDEV"=:B5) AND (:B7 IS NULL OR :B7<>'B' AND :B7<>'D' OR 
(:B6 IS NULL AND DECODE(BITAND("PAFLG",1792),256,'LOGS',512,'NOLOGS',1024,'BACKUP_LOGS',
NULL) IS NULL OR "PCTAG"=:B6 AND DECODE(BITAND("PAFLG",1792),256,'LOGS',512,'NOLOGS',102
4,'BACKUP_LOGS',NULL) IS NOT NULL) AND (:B7='B' OR :B7='D')) AND 
"INST_ID"=USERENV('INSTANCE') AND (:B4 IS NULL AND :B3 IS NULL AND :B2 IS NULL AND :B1 
IS NULL OR "PCHDL" LIKE :B4 OR "PCHDL" LIKE :B3 OR "PCHDL" LIKE :B2 OR "PCHDL" LIKE 
:B1) AND DECODE(BITAND("PCFLG",7),0,'A',1,'D',2,'X',4,'U','?')='A')
20 - filter("PATHP"="AL"."THREAD#" AND "PASEQ"="AL"."SEQUENCE#" AND 
"AL"."RESETLOGS_CHANGE#"=TO_NUMBER("PARLS") AND TO_DATE("PARLC",'MM/DD/RR 
HH24:MI:SS','nls_calendar=''GREGORIAN''')=INTERNAL_FUNCTION("AL"."RESETLOGS_TIME"))
22 - filter((:B15 IS NULL OR "ALTHP"=:B15) AND (:B14 IS NULL OR "ALSEQ">=:B14) AND 
(:B13 IS NULL OR "ALSEQ"<=:B13) AND (:B10 IS NULL OR "ALNAM" LIKE :B10) AND (:B12 IS 
NULL OR TO_NUMBER("ALNXS")>:B12) AND (:B11 IS NULL OR TO_NUMBER("ALLOS")<:B11) AND (:B9 
IS NULL OR TO_DATE("ALNXT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')>:B9) AND 
(:B8 IS NULL OR TO_DATE("ALLOT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')<=:B8
) AND DECODE(BITAND("ALFLG",6145),0,'A',1,'D',2048,'X',4096,'U','?')='A' AND 
DECODE(BITAND("ALFLG",2),0,'NO','YES')='YES' AND 
DECODE(BITAND("ALFLG",8),0,'NO','YES')='NO' AND "INST_ID"=USERENV('INSTANCE'))
2- Using SQL Profile
--------------------
Plan hash value: 2044880322
------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |           |  4182 |   527K|       |   372   (2)| 00:00:01 |
|   1 |  SORT ORDER BY             |           |  4182 |   527K|  1872K|     6 (100)| 00:00:01 |
|   2 |   UNION-ALL                |           |       |       |       |            |          |
|*  3 |    HASH JOIN               |           |  4181 |   526K|       |     4 (100)| 00:00:01 |
|   4 |     VIEW                   |           |  1404 | 44928 |       |     2 (100)| 00:00:01 |
|   5 |      HASH UNIQUE           |           |  1404 | 70200 |       |     2 (100)| 00:00:01 |
|*  6 |       FILTER               |           |       |       |       |            |          |
|   7 |        HASH GROUP BY       |           |  1404 | 70200 |       |     2 (100)| 00:00:01 |
|   8 |         VIEW               | VM_NWVW_1 |  3546 |   173K|       |     1 (100)| 00:00:01 |
|   9 |          HASH GROUP BY     |           |  3546 |   512K|       |     1 (100)| 00:00:01 |
|* 10 |           HASH JOIN        |           |  3546 |   512K|       |     0   (0)| 00:00:01 |
|* 11 |            FIXED TABLE FULL| X$KCCBS   |  3546 |   138K|       |     0   (0)| 00:00:01 |
|* 12 |            FIXED TABLE FULL| X$KCCBP   |  4566 |   481K|       |     0   (0)| 00:00:01 |
|* 13 |     HASH JOIN              |           |  4181 |   396K|       |     2 (100)| 00:00:01 |
|  14 |      VIEW                  |           |     3 |   135 |       |     1 (100)| 00:00:01 |
|  15 |       HASH UNIQUE          |           |     3 |   477 |       |     1 (100)| 00:00:01 |
|* 16 |        FIXED TABLE FULL    | X$KCCAL   |  2158 |   335K|       |     0   (0)| 00:00:01 |
|* 17 |      FIXED TABLE FULL      | X$KCCBL   | 96957 |  4923K|       |     0   (0)| 00:00:01 |
|* 18 |    HASH JOIN               |           |     1 |   440 |       |     1 (100)| 00:00:01 |
|* 19 |     FIXED TABLE FULL       | X$KCCPA   |     1 |   395 |       |            |          |
|  20 |     VIEW                   |           |     3 |   135 |       |     1 (100)| 00:00:01 |
|  21 |      HASH UNIQUE           |           |     3 |   477 |       |     1 (100)| 00:00:01 |
|* 22 |       FIXED TABLE FULL     | X$KCCAL   |  2158 |   335K|       |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("BS"."SET_STAMP"="BLBSS" AND "BS"."SET_COUNT"="BLBSC")
6 - filter("$vm_col_3"=COUNT("$vm_col_1"))
10 - access("BSBSS"="BPBSS" AND "BSBSC"="BPBSC")
filter(:B7 IS NULL OR :B7<>'B' AND :B7<>'D' OR (:B7='B' OR :B7='D') AND (:B6 IS 
NULL AND DECODE(BITAND("BSTYP",1792),256,'LOGS',512,'NOLOGS',1024,'BACKUP_LOGS',NULL) 
IS NULL OR "BPTAG"=:B6 AND DECODE(BITAND("BSTYP",1792),256,'LOGS',512,'NOLOGS',1024,'BAC
KUP_LOGS',NULL) IS NOT NULL))
11 - filter(CASE BITAND("BSTYP",16) WHEN 16 THEN 'I' ELSE 
DECODE(BITAND("BSTYP",11),1,'D',2,'I',8,'L') END ='L' AND "INST_ID"=USERENV('INSTANCE') 
AND (BITAND("BSTYP",32)<>32 OR BITAND("BSTYP",32768)=32768))
12 - filter((:B4 IS NULL AND :B3 IS NULL AND :B2 IS NULL AND :B1 IS NULL OR "BPHDL" 
LIKE :B4 OR "BPHDL" LIKE :B3 OR "BPHDL" LIKE :B2 OR "BPHDL" LIKE :B1) AND 
DECODE(BITAND("BPFLG",12289),0,'A',1,DECODE(BITAND("BPFLG2",1),1,'F','D'),4096,'X',8192,
'U','?')='A' AND ("BPDEV"=:B5 OR :B5 IS NULL) AND "INST_ID"=USERENV('INSTANCE'))
13 - access("BLTHP"="AL"."THREAD#" AND "BLSEQ"="AL"."SEQUENCE#" AND 
"AL"."RESETLOGS_CHANGE#"=TO_NUMBER("BLRLS") AND TO_DATE("BLRLC",'MM/DD/RR 
HH24:MI:SS','nls_calendar=''GREGORIAN''')=INTERNAL_FUNCTION("AL"."RESETLOGS_TIME"))
16 - filter((:B15 IS NULL OR "ALTHP"=:B15) AND (:B14 IS NULL OR "ALSEQ">=:B14) AND 
(:B13 IS NULL OR "ALSEQ"<=:B13) AND (:B10 IS NULL OR "ALNAM" LIKE :B10) AND (:B12 IS 
NULL OR TO_NUMBER("ALNXS")>:B12) AND (:B11 IS NULL OR TO_NUMBER("ALLOS")<:B11) AND (:B9 
IS NULL OR TO_DATE("ALNXT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')>:B9) AND 
(:B8 IS NULL OR TO_DATE("ALLOT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')<=:B8
) AND DECODE(BITAND("ALFLG",6145),0,'A',1,'D',2048,'X',4096,'U','?')='A' AND 
DECODE(BITAND("ALFLG",2),0,'NO','YES')='YES' AND 
DECODE(BITAND("ALFLG",8),0,'NO','YES')='NO' AND "INST_ID"=USERENV('INSTANCE'))
17 - filter("INST_ID"=USERENV('INSTANCE') AND BITAND("BLFLG",2)<>2)
18 - access("PATHP"="AL"."THREAD#" AND "PASEQ"="AL"."SEQUENCE#" AND 
"AL"."RESETLOGS_CHANGE#"=TO_NUMBER("PARLS") AND TO_DATE("PARLC",'MM/DD/RR 
HH24:MI:SS','nls_calendar=''GREGORIAN''')=INTERNAL_FUNCTION("AL"."RESETLOGS_TIME"))
19 - filter((:B5 IS NULL OR "PCDEV"=:B5) AND (:B7 IS NULL OR :B7<>'B' AND :B7<>'D' OR 
(:B6 IS NULL AND DECODE(BITAND("PAFLG",1792),256,'LOGS',512,'NOLOGS',1024,'BACKUP_LOGS',
NULL) IS NULL OR "PCTAG"=:B6 AND DECODE(BITAND("PAFLG",1792),256,'LOGS',512,'NOLOGS',102
4,'BACKUP_LOGS',NULL) IS NOT NULL) AND (:B7='B' OR :B7='D')) AND 
"INST_ID"=USERENV('INSTANCE') AND (:B4 IS NULL AND :B3 IS NULL AND :B2 IS NULL AND :B1 
IS NULL OR "PCHDL" LIKE :B4 OR "PCHDL" LIKE :B3 OR "PCHDL" LIKE :B2 OR "PCHDL" LIKE 
:B1) AND DECODE(BITAND("PCFLG",7),0,'A',1,'D',2,'X',4,'U','?')='A')
22 - filter((:B15 IS NULL OR "ALTHP"=:B15) AND (:B14 IS NULL OR "ALSEQ">=:B14) AND 
(:B13 IS NULL OR "ALSEQ"<=:B13) AND (:B10 IS NULL OR "ALNAM" LIKE :B10) AND (:B12 IS 
NULL OR TO_NUMBER("ALNXS")>:B12) AND (:B11 IS NULL OR TO_NUMBER("ALLOS")<:B11) AND (:B9 
IS NULL OR TO_DATE("ALNXT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')>:B9) AND 
(:B8 IS NULL OR TO_DATE("ALLOT",'MM/DD/RR HH24:MI:SS','nls_calendar=''GREGORIAN''')<=:B8
) AND DECODE(BITAND("ALFLG",6145),0,'A',1,'D',2048,'X',4096,'U','?')='A' AND 
DECODE(BITAND("ALFLG",2),0,'NO','YES')='YES' AND 
DECODE(BITAND("ALFLG",8),0,'NO','YES')='NO' AND "INST_ID"=USERENV('INSTANCE'))
-------------------------------------------------------------------------------

 

 

 

Step -6: You can accept the recommended SQL Profile for changing SQL Plan because estimated benefit: 73.23% for this query. You can disable it after applying, if it is not usable.

 

execute dbms_sqltune.accept_sql_profile(task_name => 'msd_dz3rmaqvta9uq',task_owner => 'SYS', replace => TRUE);

 

 

I will continue to explain Performance tuning tutorial in the next articles.

 

 

Do you want to learn Top 30 SQL Tuning Tips and Tricks, then read the following articles.

https://ittutorial.org/oracle-sql-tuning-tips-and-tricks-tutorial-3/

 

 713 views last month,  7 views today

About Mehmet Salih Deveci

I am Founder of SysDBASoft IT and IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience. I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource. I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks. I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients. If you need Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS Consultancy and Training you can send my email adress mehmetsalih.deveci@outlook.com. -                                                                                                                                                                                                                                                 - Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için  mehmetsalih.deveci@outlook.com a mail atabilirsiniz.

Check Also

Alter System Flush Buffer Cache in Oracle

Hi, I will explain Alter System Flush Buffer Cache in Oracle in this post.  3,901 views …

Leave a Reply