DBMS_SQLTUNE.REPORT_TUNING_TASK
Hi,
In 10g R2 i receive the following :
SQL> SET LONG 1000
SQL> SET LONGCHUNKSIZE 1000
SQL> SET LINESIZE 100
SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'my_sql_tuning_task')
2 FROM DUAL;
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK')
GENERAL INFORMATION SECTION
Tuning Task Name : my_sql_tuning_task
Tuning Task Owner : SCOTT
Scope : COMPREHENSIVE
Time Limit(seconds) : 60
Completion Status : COMPLETED
Started at : 07/05/2010 17:21:36
Completed at : 07/05/2010 17:21:37
Number of Statistic Findings : 2
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK')
Schema Name: SCOTT
SQL ID : 6trybwr380un5
SQL Text : SELECT /*+ ORDERED */ * FROM emp e, dept d WHERE e.deptno =
d.deptno AND e.empno < :bnd
FINDINGS SECTION (2 findings)
1- Statistics Finding
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK')
Table "SCOTT"."DEPT" and its inMy questions are :
1-What are the findings ? It says two but displays (If no mistake from me) only one.
2-What does mean : Table "SCOTT"."DEPT" and its in ?
Thank you.
My glogin.sql file contains the following:
set pagesize 25
set linesize 121
set long 1000000 <-------------------
col name format a30
col value format a30
col column_name format a30
col object_name format a30
col segment_name format a30
col file_name format a60
col data_type format a20
SET DEFINE OFF
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';you might find it useful so you don't bump into these problems in the future.
Similar Messages
-
How could i generate HTML format report using DBMS_SQLTUNE.REPORT_TUNING_TASK function in oracle 11g
See [url http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_sqltun.htm#CHDGEIHJ]documentation for DBMS_SQLTUNE.
The TYPE parameter suggests that it would determine the format and whilst the nline documentation in the code (desc DBMS_SQLTUNE) suggests that valid values are TEXT, HTML and XML, it seems that this is not yet implemented. Whilst valid values of TEXT, HTML and XML are validated, only a TEXT report is produced. -
Unable to get the execution plan when using dbms_sqltune (11gR2)
Hi,
Database version: 11gR2
I have a user A that is granted privileges to execute dbms_sqltune.
I can create a task, excute it and run the report.
But, when I run the report I get the following error:
SQL> show user
USER is "A"
SQL> set long 10000 longchunksize 10000 linesize 200 pagesize 000
select dbms_sqltune.report_tuning_task(task_name => 'MYTEST') from dual;SQL>
GENERAL INFORMATION SECTION
Tuning Task Name : MYTEST
Tuning Task Owner : A
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status : COMPLETED
Started at : 05/15/2013 11:53:22
Completed at : 05/15/2013 11:53:23
Schema Name: SYSMAN
SQL ID : gjm43un5cy843
SQL Text : SELECT SUM(USED), SUM(TOTAL) FROM (SELECT /*+ ORDERED */
SUM(D.BYTES)/(1024*1024)-MAX(S.BYTES) USED,
SUM(D.BYTES)/(1024*1024) TOTAL FROM (SELECT TABLESPACE_NAME,
SUM(BYTES)/(1024*1024) BYTES FROM (SELECT /*+ ORDERED USE_NL(obj
tab) */ DISTINCT TS.NAME FROM SYS.OBJ$ OBJ, SYS.TAB$ TAB,
SYS.TS$ TS WHERE OBJ.OWNER# = USERENV('SCHEMAID') AND OBJ.OBJ# =
TAB.OBJ# AND TAB.TS# = TS.TS# AND BITAND(TAB.PROPERTY,1) = 0 AND
BITAND(TAB.PROPERTY,4194400) = 0) TN, DBA_FREE_SPACE SP WHERE
SP.TABLESPACE_NAME = TN.NAME GROUP BY SP.TABLESPACE_NAME) S,
DBA_DATA_FILES D WHERE D.TABLESPACE_NAME = S.TABLESPACE_NAME
GROUP BY D.TABLESPACE_NAME)
ERRORS SECTION
- ORA-00942: table or view does not exist
SQL>
It seems there a missing privileg for dislaying the execution plan.
As a workaround, this is solved by granting select any dictionay (which I don't want) to the user A.
Does someone have an idea about what privilege is missing?
Kind Regards.Hi,
SELECT ANY DICTIONARY system privilege provides access to SYS schema objects only => which you are using as workaround
SELECT_CATALOG_ROLE provides access to all SYS views only.==> Safe option
SQL> grant SELECT ANY DICTIONARY to test;
Grant succeeded.
SQL> conn test/test
Connected.
SQL> select count(*) from sys.obj$;
COUNT(*)
13284
SQL> conn /as sysdba
Connected.
SQL> revoke SELECT ANY DICTIONARY from test;
Revoke succeeded.
SQL> grant SELECT_CATALOG_ROLE to test;
Grant succeeded.
SQL> conn test/test
Connected.
SQL> select count(*) from sys.obj$;
select count(*) from sys.obj$
ERROR at line 1:
ORA-00942: table or view does not existHTH -
Errors using DBMS_SQLTUNE Advisors for Oracle 10g
I get errors trying to tune the below query for Oracle 10g using the DBMS_SQLTUNE advisors.
It happens when I wrap either a large block of PL/SQL code that uses bind variables or multiple nested subqueries with multiple JOIN conditions in a SELECT query statement that I wish to tune using the 10g SQLTUNE advisors.
Message was edited by:
benprusinskiHi, I was trying to use the DBMS_SQLTUNE package to tune my sql statements used in the huge procedure. I can successfully create a task and execute it. But when I run report tuning task, I'm always getting error like the one in below example. Two questions I have now.
1) Is this becuase I'm using bind, but not passing any values?
2) Can I able to use to this package to tune a procedures instead of sql statement?
Example output...
SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'my_sql_tuning_task3')
2 FROM DUAL;
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK3')
GENERAL INFORMATION SECTION
Tuning Task Name : my_sql_tuning_task3
Tuning Task Owner : SCOTT
Scope : COMPREHENSIVE
Time Limit(seconds) : 3000
Completion Status : COMPLETED
Started at : 02/26/2009 21:44:41
Completed at : 02/26/2009 21:44:41
Number of Errors : 1
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK3')
Schema Name: KPRAVEEN
SQL ID : 479831s42xj1n
SQL Text : SELECT a.pdrorn, a.pdrcto, a.pdrlln FROM f4311 a
WHERE a.pddoco = receiptsrcrec.prdoco AND a.pddcto = :2 AND
a.pdkcoo = :3 AND a.pdsfxo = :4 AND a.pdlnid = :5
ERRORS SECTION
SQL> -
Awr dbms_sqltune package
Hi,
Our company doesn't currently have oem installed on production. This will be done in March. Right now I am working with the sqltune package to access the database on the dev server before I run it on production. I was running the following procedure below and requested the GOLDUSER schema.
Down in the load_sqlset procdure I think I have the load_option and update_option set to the correct values. I could be wrong though. By setting these all I want is to extract the old sql statements and performace tune them.
I get those sql statements listed out and also I get a different named schema under "tables with new potential indices" (LEADUSERS).
Should I be concerned with this? Would someone just look this procedure over to see if it is correct?
I would appreciate your help in this matter.
Thanks in advance.
al
declare
cursor_1 dbms_sqltune.sqlset_cursor;
begin
open cursor_1 for
select value(p)
from table(dbms_sqltune.select_workload_repository)
750,
1501,
'parsing_schema_name= ''GOLDUSER'' AND executions > 25',
null,
null,
null,
null,
null,
10)) p;
dbms_sqltune.load_sqlset(
sqlset_name => 'prod_awr',
populate_cursor => cursor_1,
load_option => 'MERGE',
update_option => 'ACCUMULATE');
end;
/Check this one:
http://www.oracle-base.com/articles/10g/AutomaticSQLTuning10g.php
OR
DECLARE
ret_val VARCHAR2(4000);
BEGIN
ret_val := dbms_sqltune.create_tuning_task(
task_name=>'t1',
sql_id=>' '); Execute the sql prior to this and get the sql_id in place it here
dbms_sqltune.execute_tuning_task('t1');
END;
check the status by,
SELECT status FROM DBA_ADVISOR_LOG WHERE task_name ='t1';
Upon completion of the above,
SET LONG 100000
SET LONGCHUNKSIZE 99999
SET LINESIZE 20000
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 't1') FROM DUAL; -
Hi all,
i have a big problem with oracle tuning set. I'm using this script for tune some query when the EM is unusable, but for the first time i have this error: ORA-06532: Subscript outside of limit.
I have not found any solutions from google to metalink... can you help me? you need others informations?
these are the steps:
1) login with system
2) launching the script sqltune.sql
spool M:\tuning\sql_tune_TSQ.log
set long 100000
SET LONGCHUNKSIZE 100000
SET LINESIZE 200
execute DBMS_SQLTUNE.DROP_TUNING_TASK('sqltuning_request_fromuser');
DECLARE my_task_name VARCHAR2(100);
tune_sqltext CLOB;
BEGIN
tune_sqltext := q'#Select row_ticket from abc.ticket_kasdeww_export#';
my_task_name := dbms_sqltune.create_tuning_task(user_name=>'abc',sql_text=>tune_sqltext, task_name=>'sqltuning_request_fromuser', time_limit=>1800);
dbms_sqltune.execute_tuning_task(task_name=>'sqltuning_request_fromuser');
END;
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'sqltuning_request_fromuser') FROM DUAL;
spool off
3) when trying accept new sql profile:
execute dbms_sqltune.accept_sql_profile(task_name => 'sqltuning_request_fromuser', replace => TRUE);
ERROR at line 1:
ORA-06532: Subscript outside of limit
ORA-06512: at "SYS.DBMS_SQLTUNE_INTERNAL", line 7087
ORA-06512: at "SYS.DBMS_SQLTUNE", line 5559
ORA-06512: at "SYS.DBMS_SQLTUNE", line 5586
ORA-06512: at line 1
N.b. A Generic error from EM is returned when trying accept sql profile, this is the reason for using the command line method
N.b.2 This query return approximately 40.000 rows and is a select from a view that is created from the union of two type of selectuser9523366 wrote:
thanks!
no one for this unusual problem please?I think I had some time ago a similar issue. You can try to check if the SQL profile generated contains an unusual large number of hints, by querying for your tuning task here:
USER_TUNING_TASKS
And then query an underlying table called SYS.WRI$_ADV_RATIONALE like that:
select
from
sys.WRI$_ADV_RATIONALE
where
task_id = <your_task_id from USER_TUNING_TASKS>;If this query shows hundreds of rows with hints in the ATTR1 column then this might be the reason for the error. You might want to open an SR with Oracle then, because I can't remember if I found a way back then to make the "ACCEPT_SQL_PROFILE" work and I think I remember I solved the issue otherwise.
Regards,
Randolf
Oracle related stuff blog:
http://oracle-randolf.blogspot.com/
SQLTools++ for Oracle (Open source Oracle GUI for Windows):
http://www.sqltools-plusplus.org:7676/
http://sourceforge.net/projects/sqlt-pp/ -
DBMS_SQLTUNE.REPORT
Hi,
on 11g R2 on Win I run in SQLPLUS:
variable stmt_task VARCHAR2(64);
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => ‘4rc7d8c0mvfm8');
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(:stmt_task);
SET LINESIZE 140
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(:stmt_task) from dual;
DBMS_SQLTUNE.REPORT_TUNING_TASK(:STMT_TASK)
GENERAL INFORMATION SECTION
SQL>Is the report empty ? Nothing in it ? Why ?
Thank you.Is this not just the display being too small?
Try something like:
set long 10000then rerun. -
Need help to debug SQL Tuning Advisor Error Message
Hi,
I am getting an error message while try to get recommendations from the SQL Tuning Advisor.
Environment:
Oracle Version: 11.2.0.3.0
O/S: AIX
Following is my code:
declare
my_task_name varchar2 (30);
my_sqltext clob;
begin
my_sqltext := 'SELECT DISTINCT MRKT_AREA AS DIVISION, PROMO_ID,
PROMO_CODE,
RBR_DTL_TYPE.PERF_DETL_TYP,
RBR_DTL_TYPE.PERF_DETL_DESC,
RBR_DTL_TYPE.PERF_DETL_SUB_TYP,
RBR_DTL_TYPE.PERF_DETL_SUB_DESC,
BU_SYS_ITM_NUM,
RBR_CPN_LOC_ITEM_ARCHIVE.CLI_SYS_ITM_DESC,
PROMO_START_DATE,
PROMO_END_DATE,
PROMO_VALUE2,
PROMO_VALUE1,
EXEC_COMMENTS,
PAGE_NUM,
BLOCK_NUM,
AD_PLACEMENT,
BUYER_CODE,
RBR_CPN_LOC_ITEM_ARCHIVE.CLI_STAT_TYP,
RBR_MASTER_CAL_ARCHIVE.STATUS_FLAG
FROM (PROMO_REPT_OWNER.RBR_CPN_LOC_ITEM_ARCHIVE
INNER JOIN PROMO_REPT_OWNER.RBR_MASTER_CAL_ARCHIVE
ON (RBR_CPN_LOC_ITEM_ARCHIVE.CLI_PROMO_ID = PROMO_ID)
AND (RBR_CPN_LOC_ITEM_ARCHIVE.CLI_PERF_DTL_ID = PERF_DETAIL_ID)
AND (RBR_CPN_LOC_ITEM_ARCHIVE.CLI_STR_NBR = STORE_ZONE)
AND (RBR_CPN_LOC_ITEM_ARCHIVE.CLI_ITM_ID = ITM_ID))
INNER JOIN PROMO_REPT_OWNER.RBR_DTL_TYPE
ON (RBR_MASTER_CAL_ARCHIVE.PERF_DETL_TYP = RBR_DTL_TYPE.PERF_DETL_TYP)
AND (RBR_MASTER_CAL_ARCHIVE.PERF_DETL_SUB_TYP = RBR_DTL_TYPE.PERF_DETL_SUB_TYP)
WHERE ( ((MRKT_AREA)=40)
AND ((RBR_DTL_TYPE.PERF_DETL_TYP)=1)
AND ((RBR_DTL_TYPE.PERF_DETL_SUB_TYP)=1) )
AND ((CLI_STAT_TYP)=1 Or (CLI_STAT_TYP)=6)
AND ((RBR_MASTER_CAL_ARCHIVE.STATUS_FLAG)=''A'')
AND ( ((PROMO_START_DATE) >= to_date(''2011-10-20'', ''YYYY-MM-DD'')
And (PROMO_END_DATE) <= to_date(''2011-10-26'', ''YYYY-MM-DD'')) )
ORDER BY MRKT_AREA';
my_task_name := dbms_sqltune.create_tuning_task
(sql_text => my_sqltext,
user_name => 'PROMO_REPT_OWNER',
scope => 'COMPREHENSIVE',
time_limit => 3600,
task_name => 'Test_Query',
description => 'Test Query');
end;
begin
dbms_sqltune.execute_tuning_task(task_name => 'Test_Query');
end;
set serveroutput on size unlimited;
set pagesize 5000
set linesize 130
set long 50000
set longchunksize 500000
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('Test_Query') FROM DUAL;
Output:
snippet .....
FINDINGS SECTION (1 finding)
1- Index Finding (see explain plans section below)
The execution plan of this statement can be improved by creating one or more
indices.
Recommendation (estimated benefit: 71.48%)
- Consider running the Access Advisor to improve the physical schema design
or creating the recommended index.
Error: Cannot fetch actions for recommendation: INDEX
Error: ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Rationale
Creating the recommended indices significantly improves the execution plan
of this statement. However, it might be preferable to run "Access Advisor"
using a representative SQL workload as opposed to a single statement. This
will allow to get comprehensive index recommendations which takes into
account index maintenance overhead and additional space consumption.
snippet
Any ideas why I am getting ORA-06502 error?
Thanks in advance
RogersBug 14407401 - ORA-6502 from index recommendation section of DBMS_SQLTUNE output (Doc ID 14407401.8)
Fixed:
The fix for 14407401 is first included in
12.1.0.1 (Base Release) -
11.2.0.3.5 / 2 node rac on rhel-6 / 64-bit
I would like to a profile a sql_id since its following 4 plans and one of them is the optimal.
But im unable to do it as it throwing ORA-13786.
Steps I followed :
{code}
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 => 29676,
end_snap => 29707,
sql_id => 'fjndcnvzkjkb5',
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 60,
task_name => '420tavt57dxkx_tuning_task',
description => 'Tuning task for statement 420tavt57dxkx in AWR.');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'fjndcnvzkjkb5_CFO_tuning_task');
SET LONG 10000;
SET PAGESIZE 1000
SET LINESIZE 200
SELECT DBMS_SQLTUNE.report_tuning_task('420tavt57dxkx_tuning_task') AS recommendations FROM dual;
SET PAGESIZE 24
SQL> execute dbms_sqltune.accept_sql_profile(task_name =>'420tavt57dxkx_tuning_task_task', replace => TRUE,force_match => TRUE);
BEGIN dbms_sqltune.accept_sql_profile(task_name =>420tavt57dxkx_tuning_task', replace => TRUE,force_match => TRUE); END;
ERROR at line 1:
ORA-13786: missing SQL text of statement object "1" for tuning task "420tavt57dxkx_tuning_task"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.DBMS_SQLTUNE_INTERNAL", line 16442
ORA-06512: at "SYS.PRVT_SQLPROF_INFRA", line 31
ORA-06512: at "SYS.DBMS_SQLTUNE", line 7544
ORA-06512: at "SYS.DBMS_SQLTUNE", line 7568
ORA-06512: at line 1
{code}
Can somebody help me out on this?Hi Experts,
i too getting this error while attaching the tuning task to the sql profiler, below are the details, appreciate any help on this.
SQL> SQL> VAR profile_name VARCHAR2(30);
SQL> BEGIN
:profile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(task_name => 'sql_tuning_task');
END;
/ 2 3 4
BEGIN
ERROR at line 1:
ORA-13786: missing SQL text of statement object "1" for tuning task "sql_tuning_task"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.DBMS_SQLTUNE_INTERNAL", line 16442
ORA-06512: at "SYS.PRVT_SQLPROF_INFRA", line 31
ORA-06512: at "SYS.DBMS_SQLTUNE", line 7544
ORA-06512: at line 2
SQL> select banner from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production -
How to see an explain plan?
Hi all,
I'm looking to tune one sql sentence of my application. To do it, I've used the sqltune package. When I see the report, I obtain the actual explain plan and, finally the suggestion to use an SQL Profile.
How can I see the new explain plan of this option before apply it?
I attach the report result for your information:
SELECT DBMS_SQLTUNE.report_tuning_task('analisis_matriculation_view') AS recommendations FROM dual;SQL> SQL> SQL>
RECOMMENDATIONS
GENERAL INFORMATION SECTION
Tuning Task Name : analisis_matriculation_view
Tuning Task Owner : A9
Scope : COMPREHENSIVE
Time Limit(seconds) : 3600
Completion Status : COMPLETED
Started at : 08/11/2010 09:33:18
Completed at : 08/11/2010 10:23:16
Number of SQL Profile Findings : 1
Schema Name: A9
SQL ID : gd8b5pwyj0yu8
SQL Text : SELECT PO.ID POID, BO.ID BOID, MAT.AGENT_ID AGENTID,
MAT.AGENCY_ID AGENCYID, MAT.ID MATID,MAT.PARTNERBRANCH_ID
PBRANCHID, MAT.DOSSIERNUMBER, MAT.DOSSIERVERSION,
MAT.FILINGDATE,MAT.TELEMATIC, MAT.MANUALDGTTAXCODE,
MAT.ASSIGNDGTTAX, MAT.STATUS, MAT.PLATENUMBER,MAT.REJECTIONCAUSE,
MAT.REJECTIONNOTES, MAT.COLOR, MAT.CREATEDON, MAT.MODIFIEDON,
FO.COLOR,AG.MEMBERID, US.NAME AGENTNAME, US.SURNAME
AGENTSURNAME, US.SURNAME2 AGENTSURNAME2, US.NIF AGENTNIF,AY.NAME
AGENCYNAME, VD.SERIALNUMBER, VOWN.NAME OWNERNAME, VOWN.SURNAME
OWNERSURNAME,VOWN.SURNAME2 OWNERSURNAME2, UPPER(VOWN.NAME) || '
' || UPPER(VOWN.SURNAME) || ' ' || UPPER(VOWN.SURNAME2)
OWNERFULLNAME,VOWN.FISCALID OWNERNIF, FO.ID FOLDERID, FO.NAME
FOLDERNAME, FO.STATUS FOLDERSTATUS, IVTM.ID IVTMID,IVTM.STATUS
IVTMSTATUS, IVTM.FINALAMOUNT IVTMAMOUNT, IVTM.IVTMCOLLECTOR,
F576.ID F576ID,F576.PAYMENTCOMPLETEREFNUMBER NRC576,
F576.MATRICULATIONCODE CEM576, F576.AEATELECTRONICCODEMANUAL
CEM576MANUAL,F576.NRCMANUAL NRC576MANUAL, F06.ID F06ID,
F06.MATRICULATIONCODE CEM06, F06.AEATELECTRONICCODEMANUAL
CEM06MANUAL,F06.NRE NRE06, F06.NREMANUAL NRE06MANUAL, F05.ID
F05ID, F05.MATRICULATIONCODE CEM05, F05.AEATELECTRONICCODEMANUAL
CEM05MANUAL FROM A9_MATRICULATION MAT INNER JOIN A9_AGENT AG ON
(MAT.AGENT_ID = AG.ID) INNER JOIN A9_USER US ON (AG.ID = US.ID)
INNER JOIN A9_BRANCHOFFICE BO ON (AG.BRANCHOFFICE_ID = BO.ID)
INNER JOIN A9_PROFESSIONALORDER PO ON (BO.PROFESSIONALORDER_ID =
PO.ID) INNER JOIN A9_AGENCY AY ON (MAT.AGENCY_ID = AY.ID) INNER
JOIN A9_VEHICLEDATA VD ON (MAT.VEHICLEDATA_ID = VD.ID) INNER
JOIN A9_VEHICLEOWNER VOWN ON (VOWN.MATRICULATION_ID = MAT.ID)
LEFT JOIN A9_MATRICULATIONFOLDER FO ON
(MAT.MATRICULATIONFOLDER_ID = FO.ID) LEFT JOIN A9_IVTM IVTM ON
(MAT.IVTM_ID = IVTM.ID)LEFT JOIN A9_FORM576 F576 ON
(MAT.FORM576_ID = F576.ID) LEFT JOIN A9_FORM05 F05 ON
(MAT.FORM05_ID = F05.ID) LEFT JOIN A9_FORM06 F06 ON
(MAT.FORM06_ID = F06.ID) WHERE VOWN.MAINOWNER = 1 AND MAT.VALID
= 1 AND US.DELETEDON IS NULL AND PO.DELETEDON IS NULL AND
BO.DELETEDON IS NULL AND AY.DELETEDON IS NULL AND VOWN.DELETEDON
IS NULL AND FO.DELETEDON IS NULL AND IVTM.DELETEDON IS NULL AND
VD.DELETEDON IS NULL AND F576.DELETEDON IS NULL AND
F05.DELETEDON IS NULL AND F06.DELETEDON IS NULL AND
MAT.DELETEDON IS NULL ORDER BY DOSSIERNUMBER DESC
FINDINGS SECTION (1 finding)
1- SQL Profile Finding (see explain plans section below)
Se ha encontrado un plan de ejecucion potencialmente mejor para esta
sentencia.
Recommendation (estimated benefit: 35,82%)
- Puede aceptar el perfil SQL recomendado.
execute dbms_sqltune.accept_sql_profile(task_name =>
'analisis_matriculation_view', replace => TRUE);
EXPLAIN PLANS SECTION
1- Original With Adjusted Cost
Plan hash value: 1271206505
Id Operation Name Rows Bytes TempSpc Cost (%CPU) Time
0 SELECT STATEMENT 4728K 2015M 783K (1) 02:36:41
1 SORT ORDER BY 4728K 2015M 4346M 783K (1) 02:36:41
* 2 HASH JOIN 4728K 2015M 1857M 333K (1) 01:06:48
* 3 HASH JOIN 4728K 1803M 1736M 231K (1) 00:46:14
* 4 HASH JOIN 4728K 1682M 133K (1) 00:26:42
* 5 TABLE ACCESS FULL A9_AGENCY 1076 34432 8 (0) 00:00:01
* 6 FILTER
* 7 HASH JOIN OUTER 5029K 1635M 1568M 133K (1) 00:26:42
* 8 FILTER
* 9 HASH JOIN OUTER 5029K 1510M 235M 45724 (2) 00:09:09
* 10 FILTER
* 11 HASH JOIN RIGHT OUTER 846K 226M 7792K 23780 (2) 00:04:46
12 TABLE ACCESS FULL A9_MATRICULATIONFOLDER 185K 5613K 731 (2) 00:00:09
* 13 FILTER
* 14 HASH JOIN RIGHT OUTER 846K 201M 6784K 12190 (2) 00:02:27
15 TABLE ACCESS FULL A9_FORM06 192K 4517K 1340 (3) 00:00:17
* 16 FILTER
* 17 HASH JOIN RIGHT OUTER 65680 14M 2784K 9769 (2) 00:01:58
18 TABLE ACCESS FULL A9_FORM05 91913 1705K 592 (2) 00:00:08
* 19 HASH JOIN 65680 12M 8360 (2) 00:01:41
* 20 HASH JOIN 560 37520 25 (8) 00:00:01
* 21 HASH JOIN 560 14560 10 (10) 00:00:01
* 22 HASH JOIN 8 112 7 (15) 00:00:01
* 23 TABLE ACCESS FULL A9_PROFESSIONALORDER 6 30 3 (0) 00:00:01
* 24 TABLE ACCESS FULL A9_BRANCHOFFICE 16 144 3 (0) 00:00:01
25 TABLE ACCESS FULL A9_AGENT 1053 12636 3 (0) 00:00:01
* 26 TABLE ACCESS FULL A9_USER 2245 92045 14 (0) 00:00:01
* 27 TABLE ACCESS FULL A9_MATRICULATION 123K 16M 8333 (2) 00:01:41
28 TABLE ACCESS FULL A9_FORM576 899K 30M 8158 (2) 00:01:38
29 TABLE ACCESS FULL A9_IVTM 1207K 29M 7562 (3) 00:01:31
* 30 TABLE ACCESS FULL A9_VEHICLEDATA 979K 25M 9552 (1) 00:01:55
* 31 TABLE ACCESS FULL A9_VEHICLEOWNER 983K 44M 7771 (2) 00:01:34
Predicate Information (identified by operation id):
2 - access("VOWN"."MATRICULATION_ID"="MAT"."ID")
3 - access("MAT"."VEHICLEDATA_ID"="VD"."ID")
4 - access("MAT"."AGENCY_ID"="AY"."ID")
5 - filter("AY"."DELETEDON" IS NULL)
6 - filter("IVTM"."DELETEDON" IS NULL)
7 - access("MAT"."IVTM_ID"="IVTM"."ID"(+))
8 - filter("F576"."DELETEDON" IS NULL)
9 - access("MAT"."FORM576_ID"="F576"."ID"(+))
10 - filter("FO"."DELETEDON" IS NULL)
11 - access("MAT"."MATRICULATIONFOLDER_ID"="FO"."ID"(+))
13 - filter("F06"."DELETEDON" IS NULL)
14 - access("MAT"."FORM06_ID"="F06"."ID"(+))
16 - filter("F05"."DELETEDON" IS NULL)
17 - access("MAT"."FORM05_ID"="F05"."ID"(+))
19 - access("MAT"."AGENT_ID"="AG"."ID")
20 - access("AG"."ID"="US"."ID")
21 - access("AG"."BRANCHOFFICE_ID"="BO"."ID")
22 - access("BO"."PROFESSIONALORDER_ID"="PO"."ID")
23 - filter("PO"."DELETEDON" IS NULL)
24 - filter("BO"."DELETEDON" IS NULL)
26 - filter("US"."DELETEDON" IS NULL)
27 - filter("MAT"."VALID"=1 AND "MAT"."DELETEDON" IS NULL)
30 - filter("VD"."DELETEDON" IS NULL)
31 - filter("VOWN"."DELETEDON" IS NULL AND "VOWN"."MAINOWNER"=1)
2- Using SQL Profile
Plan hash value: 1408211821
Best regards,
dbajug
Edited by: dbajug on Aug 11, 2010 6:31 AMHi all,
the aswer is on this post:
Re: Explain plan
Regards,
dbajug -
I am working as a junior DBA. I tried to tune a query using SQL Tuning Advisor that is with DBMS_SQLTUNE.I have created the tuning task successfully with DBMS_SQLTUNE.create_tuning_task.But when i execute the tuning task with EXEC DBMS_SQLTUNE.execute_tuning_task() i got an error like
SQL> EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'rep_three');
BEGIN DBMS_SQLTUNE.execute_tuning_task(task_name => 'rep_three'); END;
ERROR at line 1:
ORA-00081: address range [0x60000000000A7D70, 0x60000000000A7D74) is not
readable
ORA-00600: internal error code, arguments: [kesatmGetSqlStats:optCost], [], [],
ORA-06512: at "SYS.PRVT_ADVISOR", line 1624
ORA-06512: at "SYS.DBMS_ADVISOR", line 186
ORA-06512: at "SYS.DBMS_SQLTUNE", line 1008
ORA-06512: at line 1The oracle version is Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bi. The OS is HP-UX. The version is HP-UX B.11.23 U ia64.
I tried to execute DBMS_SQLTUNE as DWH user.I have granted the advisor,DROP ANY SQL PROFILE,ALTER ANY SQL PROFILE,CREATE ANY SQL PROFILE privileges and DBA roles to the DWH user. The way i ran DBMS_SQLTUNE is, first i logged in as DWH user and i tried to execute the query for getting the SQL_ID for the query. For getting the SQL_ID i selected the SQL_ID column value for the DWH user session from v$session.I kept that query executing and meanwhile i opened another session as DWH user and created the tuning task as follows
DECLARE
l_sql_tune_task_id VARCHAR2(100);
BEGIN
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
sql_id => 'b65fj39dkkb9v',
scope => DBMS_SQLTUNE.scope_limited,
time_limit => 3600,
task_name => 'rep_three',
description => 'Report Tuning');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
/The creation of tuning task was successful.And i executed the tuning task as follows
EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'rep_three');The above mentioned errors came when i executed the tuning task.
I am also adding the query which i have tried to tune
select * from dwh.beneficiary_dim BEN_DIM,
(Select adr_dp_id,
adr_account_no,
ADR_ADDRESS_LINE_1 || ' ' ||
ADR_ADDRESS_LINE_2 || ' ' ||
ADR_ADDRESS_LINE_3 || ' ' ||
ADR_ADDRESS_LINE_4 as ADDRESS,
adr_pin_code,adr_phone_no,adr_fax_no
from dwh.beneficiary_address_dim where adr_type_id = 1) PERMANENT_ADD_DIM,
(Select adr_dp_id,
adr_account_no,
ADR_ADDRESS_LINE_1 || ' ' ||
ADR_ADDRESS_LINE_2 || ' ' ||
ADR_ADDRESS_LINE_3 || ' ' ||
ADR_ADDRESS_LINE_4 as ADDRESS,
adr_pin_code,adr_phone_no,adr_fax_no
from dwh.beneficiary_address_dim where adr_type_id = 2) BANK_ADD_DIM,
(Select adr_dp_id,
adr_account_no,
ADR_ADDRESS_LINE_1 || ' ' ||
ADR_ADDRESS_LINE_2 || ' ' ||
ADR_ADDRESS_LINE_3 || ' ' ||
ADR_ADDRESS_LINE_4 as ADDRESS,
adr_pin_code,adr_phone_no,adr_fax_no
from dwh.beneficiary_address_dim where adr_type_id = 3) NOM_GUARDIAN_ADD_DIM,
(Select adr_dp_id,
adr_account_no,
ADR_ADDRESS_LINE_1 || ' ' ||
ADR_ADDRESS_LINE_2 || ' ' ||
ADR_ADDRESS_LINE_3 || ' ' ||
ADR_ADDRESS_LINE_4 as ADDRESS,
adr_pin_code,adr_phone_no,adr_fax_no
from dwh.beneficiary_address_dim where adr_type_id = 4) CORR_ADD_DIM,
(Select adr_dp_id,
adr_account_no,
ADR_ADDRESS_LINE_1 || ' ' ||
ADR_ADDRESS_LINE_2 || ' ' ||
ADR_ADDRESS_LINE_3 || ' ' ||
ADR_ADDRESS_LINE_4 as ADDRESS,
adr_pin_code,adr_phone_no,adr_fax_no
from dwh.beneficiary_address_dim where adr_type_id = 6) MINOR_ADDRESS,
(Select rp.requestid as requestid,
decode(rp.value,'ALL','ALL','','ALL',decode(substr(rp.value,1,instr(rp.value,'|',1,1)-1),'','ALL',substr(rp.value,1,instr(rp.value,'|',1,1)-1))) as Name,
decode(rp.value,'ALL','ALL','','ALL',decode(substr(rp.value,(instr(rp.value,'|',1,1)+1),((instr(rp.value,'|',1,2))-(instr(rp.value,'|',1,1)+1))),'','ALL',substr(rp.value,(instr(rp.value,'|',1,1)+1),((instr(rp.value,'|',1,2))-(instr(rp.value,'|',1,1)+1))))) as Address,
decode(rp.value,'ALL','ALL','','ALL',decode(substr(rp.value,(instr(rp.value,'|',1,2)+1)),'','ALL',substr(rp.value,(instr(rp.value,'|',1,2)+1)))) as PAN
from disadmin.requestparameters rp, disadmin.requestparameters rps, disadmin.reportrequests rr
where rp.parameterid = 'CNAS_PARAM_VALUE'
and rr.status = 'A'
and rp.requestid = rr.id
and rp.id = rps.id) P_PARAM_VALUE,
(Select rp.requestid as requestid, rp.value as Type
from disadmin.requestparameters rp, disadmin.reportrequests rr
where rp.parameterid = 'CNAS_NAME_TYPE'
and rr.status = 'A'
and rp.requestid = rr.id) P_NAME_TYPE,
(Select rp.requestid as requestid, rp.value as Addtype
from disadmin.requestparameters rp, disadmin.reportrequests rr
where rp.parameterid = 'CNAS_ADDRESS_TYPE'
and rr.status = 'A'
and rp.requestid = rr.id) P_ADDRESS_TYPE
where ( 1= case when P_NAME_TYPE.Type = 'F' then
case when BEN_DIM.BDM_FIRST_HOLDER_NAME like DECODE(P_PARAM_VALUE.Name,'ALL','%'||BEN_DIM.BDM_FIRST_HOLDER_NAME||'%','%'||P_PARAM_VALUE.Name||'%')
or BEN_DIM.BDM_FIRST_HOLDER_SURNAME like DECODE(P_PARAM_VALUE.Name,'ALL','%'||BEN_DIM.BDM_FIRST_HOLDER_SURNAME||'%','%'||P_PARAM_VALUE.Name||'%')
then 1
else null end
else
case when P_NAME_TYPE.Type = 'ALL' then
case when (BEN_DIM.BDM_FIRST_HOLDER_NAME like DECODE(P_PARAM_VALUE.Name,'ALL','%'||BEN_DIM.BDM_FIRST_HOLDER_NAME||'%','%'||P_PARAM_VALUE.Name||'%')
or BEN_DIM.BDM_FIRST_HOLDER_SURNAME like DECODE(P_PARAM_VALUE.Name,'ALL','%'||BEN_DIM.BDM_FIRST_HOLDER_SURNAME||'%','%'||P_PARAM_VALUE.Name||'%'))
and BEN_DIM.BDM_SECOND_HOLDER_NAME like DECODE(P_PARAM_VALUE.Name,'ALL','%'||BEN_DIM.BDM_SECOND_HOLDER_NAME||'%','%'||P_PARAM_VALUE.Name||'%')
and BEN_DIM.BDM_THIRD_HOLDER_NAME like DECODE(P_PARAM_VALUE.Name,'ALL','%'||BEN_DIM.BDM_THIRD_HOLDER_NAME||'%','%'||P_PARAM_VALUE.Name||'%')
then 1
else null end
else null end
end )
and BEN_DIM.BDM_IT_PAN like DECODE(P_PARAM_VALUE.PAN,'ALL','%'||BEN_DIM.BDM_IT_PAN||'%','%'||P_PARAM_VALUE.PAN||'%')
and (1 = case when P_ADDRESS_TYPE.ADDTYPE = 1 then
case when instr(PERMANENT_ADD_DIM.ADDRESS, DECODE(P_PARAM_VALUE.ADDRESS,'ALL',PERMANENT_ADD_DIM.ADDRESS, P_PARAM_VALUE.ADDRESS)) <> 0
then 1
else null end
when P_ADDRESS_TYPE.ADDTYPE = 3 then
case when instr(NOM_GUARDIAN_ADD_DIM.ADDRESS, DECODE(P_PARAM_VALUE.ADDRESS,'ALL',NOM_GUARDIAN_ADD_DIM.ADDRESS, P_PARAM_VALUE.ADDRESS)) <> 0
then 1
else null end
when P_ADDRESS_TYPE.ADDTYPE = 4 then
case when instr(CORR_ADD_DIM.ADDRESS, DECODE(P_PARAM_VALUE.ADDRESS,'ALL',CORR_ADD_DIM.ADDRESS, P_PARAM_VALUE.ADDRESS)) <> 0
then 1
else null end
when P_ADDRESS_TYPE.ADDTYPE = 6 then
case when instr(MINOR_ADDRESS.ADDRESS, DECODE(P_PARAM_VALUE.ADDRESS,'ALL',MINOR_ADDRESS.ADDRESS, P_PARAM_VALUE.ADDRESS)) <> 0
then 1
else null end
else null end );The above query also tries to access some tables from another user DISADMIN. Could you please help me in solving this problem while using SQL Tuning Advisor ? I am the only DBA here.will the rows really be updated just by using the package?Considering DMLs
SQL> select * from test
2 /
NO
1
2
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 my_task_name VARCHAR2(30);
3 my_sqltext CLOB;
4 BEGIN
5 my_sqltext := 'insert into test values (3)';
6 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
7 sql_text => my_sqltext,
8 task_name => 'my_sql_tuning_task');
9* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> BEGIN
2 DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'my_sql_tuning_task' );
3 END;
4 /
PL/SQL procedure successfully completed.
SQL> select * from test
2 /
NO
1
2
SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'my_sql_tuning_task')
2 FROM DUAL;
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK')
GENERAL INFORMATION SECTION
Tuning Task Name : my_sql_tuning_task
Tuning Task Owner : TEST
Scope : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status : COMPLETED
Started at : 03/27/2008 05:16:14
Completed at : 03/27/2008 05:16:16
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK')
Schema Name: TEST
SQL ID : gwkmgmyj9824t
SQL Text : insert into test values (3)
There are no recommendations to improve the statement.
-------------------------------------------------------------------------------Adith -
Hi,
on 11g R2 64 bits on Win 2008 R2, when query runs CPU is used at 100%.
AWR says :
Event Waits Time(s) (ms) time Wait Class
DB CPU 2,805 80.1
db file sequential read 5,189 100 19 2.8 User I/O
direct path read 1,633 9 5 .2 User I/O
log file sync 1,245 7 5 .2 Commit
db file scattered read 73 2 24 .0 User I/O
Host CPU (CPUs: 1 Cores: 1 Sockets: 1)And SQL Tunning job, when ran said :
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK')
Schema Name: userSQL ID : ad7t7wmzzdfmu
SQL Text : SELECT * FROM VW_I
There are no recommendations to improve the statement.Is the CPU utilization to 100% generated from an Oracle process ?
Is there any utility in Win 2008 or Oracle to check the threads from the Windows side ?
Thank you.Thanks to all.
my explain plan is too large and we are limited to 30000 characthers. What can I do ? Here is a part
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
| 0 | SELECT STATEMENT | | 1 | 255 | 1009 (0)|
| 1 | TABLE ACCESS BY INDEX ROWID | PS_NAME_PREFIX_LNG | 1 | 12 | 1 (0)|
|* 2 | INDEX UNIQUE SCAN | PS_NAME_PREFIX_LNG | 1 | | 0 (0)|
| 3 | TABLE ACCESS BY INDEX ROWID | PS_PERSONAL_PHONE | 1 | 29 | 2 (0)|
|* 4 | INDEX UNIQUE SCAN | PS_PERSONAL_PHONE | 1 | | 1 (0)|
| 5 | TABLE ACCESS BY INDEX ROWID | PS_EMAIL_ADDRESSES | 1 | 37 | 2 (0)|
|* 6 | INDEX UNIQUE SCAN | PS_EMAIL_ADDRESSES | 1 | | 1 (0)|
| 7 | SORT UNIQUE | | 1 | 24 | 8 (13)|
| 8 | TABLE ACCESS BY INDEX ROWID | PS_WKF_CNT_TYPE | 1 | 24 | 3 (0)|
|* 9 | INDEX RANGE SCAN | PS_WKF_CNT_TYPE | 1 | | 2 (0)|
| 10 | SORT AGGREGATE | | 1 | 20 | |
|* 11 | INDEX RANGE SCAN | PS_WKF_CNT_TYPE | 1 | 20 | 2 (0)|
|* 12 | INDEX RANGE SCAN | PS_WKF_CNT_TYPE | 1 | 20 | 2 (0)|
| 13 | SORT AGGREGATE | | 1 | 20 | |
|* 14 | INDEX RANGE SCAN | PS_WKF_CNT_TYPE | 1 | 20 | 2 (0)|
|* 15 | TABLE ACCESS BY INDEX ROWID | PS_DEPT_TBL | 1 | 28 | 3 (0)|
|* 16 | INDEX RANGE SCAN | PS4DEPT_TBL | 1 | | 2 (0)|
| 17 | SORT AGGREGATE | | 1 | 21 | |
|* 18 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
|* 19 | TABLE ACCESS BY INDEX ROWID | PS_DEPT_TBL | 1 | 28 | 3 (0)|
|* 20 | INDEX RANGE SCAN | PS4DEPT_TBL | 1 | | 2 (0)|
| 21 | SORT AGGREGATE | | 1 | 21 | |
|* 22 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
|* 23 | TABLE ACCESS BY INDEX ROWID | PS_DEPT_TBL | 1 | 28 | 3 (0)|
|* 24 | INDEX RANGE SCAN | PS4DEPT_TBL | 1 | | 2 (0)|
| 25 | SORT AGGREGATE | | 1 | 21 | |
|* 26 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
|* 27 | TABLE ACCESS BY INDEX ROWID | PS_DEPT_TBL | 1 | 28 | 3 (0)|
|* 28 | INDEX RANGE SCAN | PS4DEPT_TBL | 1 | | 2 (0)|
| 29 | SORT AGGREGATE | | 1 | 21 | |
|* 30 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
| 31 | SORT AGGREGATE | | 1 | 28 | |
|* 32 | TABLE ACCESS BY INDEX ROWID | PS_DEPT_TBL | 1 | 28 | 8 (0)|
|* 33 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | | 7 (0)|
| 34 | SORT AGGREGATE | | 1 | 21 | |
|* 35 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
|* 36 | TABLE ACCESS BY INDEX ROWID | PS_DEPT_TBL | 1 | 28 | 3 (0)|
|* 37 | INDEX RANGE SCAN | PS4DEPT_TBL | 1 | | 2 (0)|
| 38 | SORT AGGREGATE | | 1 | 21 | |
|* 39 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
|* 40 | FILTER | | | | |
| 41 | NESTED LOOPS | | 1 | 255 | 77 (0)|
| 42 | NESTED LOOPS | | 1 | 218 | 76 (0)|
| 43 | NESTED LOOPS | | 1 | 192 | 74 (0)|
| 44 | MERGE JOIN CARTESIAN | | 1 | 101 | 72 (0)|
| 45 | NESTED LOOPS | | 1 | 75 | 69 (0)|
| 46 | NESTED LOOPS | | 3 | 165 | 63 (0)|
| 47 | TABLE ACCESS BY INDEX ROWID| PS_NAMES | 3 | 120 | 60 (0)|
|* 48 | INDEX SKIP SCAN | PSANAMES | 3 | | 57 (0)|
| 49 | SORT AGGREGATE | | 1 | 19 | |
|* 50 | INDEX RANGE SCAN | PS_NAMES | 1 | 19 | 2 (0)|
| 51 | TABLE ACCESS BY INDEX ROWID| PS_PERSON | 1 | 15 | 1 (0)|
|* 52 | INDEX UNIQUE SCAN | PS_PERSON | 1 | | 0 (0)|
| 53 | TABLE ACCESS BY INDEX ROWID | PS_PERS_DATA_EFFDT | 1 | 20 | 2 (0)|
|* 54 | INDEX RANGE SCAN | PS_PERS_DATA_EFFDT | 1 | | 1 (0)|
| 55 | SORT AGGREGATE | | 1 | 15 | |
|* 56 | INDEX RANGE SCAN | PS_PERS_DATA_EFFDT | 1 | 15 | 2 (0)|
| 57 | BUFFER SORT | | 1013 | 26338 | 70 (0)|
| 58 | INDEX FAST FULL SCAN | PS4DEPT_TBL | 1013 | 26338 | 3 (0)|
|* 59 | TABLE ACCESS BY INDEX ROWID | PS_JOB | 1 | 91 | 2 (0)|
|* 60 | INDEX RANGE SCAN | PS1JOB | 1 | | 1 (0)|
|* 61 | TABLE ACCESS BY INDEX ROWID | PS_JOB | 1 | 26 | 3 (0)|
|* 62 | INDEX RANGE SCAN | PSAJOB | 1 | | 2 (0)|
| 63 | SORT AGGREGATE | | 1 | 17 | |
|* 64 | INDEX RANGE SCAN | PSAJOB | 4 | 68 | 2 (0)|
| 65 | SORT AGGREGATE | | 1 | 20 | |
|* 66 | INDEX RANGE SCAN | PSAJOB | 1 | 20 | 2 (0)|
| 67 | SORT AGGREGATE | | 1 | 17 | |
|* 68 | INDEX RANGE SCAN | PSAJOB | 4 | 68 | 2 (0)|
| 69 | SORT AGGREGATE | | 1 | 20 | |
|* 70 | INDEX RANGE SCAN | PSAJOB | 1 | 20 | 2 (0)|
| 71 | TABLE ACCESS BY INDEX ROWID | PS_JOBCODE_TBL | 1 | 26 | 2 (0)|
|* 72 | INDEX RANGE SCAN | PS_JOBCODE_TBL | 1 | | 1 (0)|
| 73 | SORT AGGREGATE | | 1 | 20 | |
|* 74 | INDEX RANGE SCAN | PS_JOBCODE_TBL | 1 | 20 | 2 (0)|
| 75 | TABLE ACCESS BY INDEX ROWID | PS_JOB_CL_I | 1 | 37 | 1 (0)|
|* 76 | INDEX UNIQUE SCAN | PS_JOB_CL_I | 1 | | 0 (0)|
| 77 | SORT AGGREGATE | | 1 | 21 | |
|* 78 | INDEX RANGE SCAN | PS_DEPT_TBL | 1 | 21 | 2 (0)|
Predicate Information (identified by operation id):
2 - access("L"."NAME_PREFIX"=:B1 AND "L"."LANGUAGE_CD"='FRA')
4 - access("F"."EMPLID"=:B1 AND "F"."PHONE_TYPE"='BUSN')
6 - access("G"."EMPLID"=:B1 AND "G"."E_ADDR_TYPE"='BUSN')
9 - access("H"."EMPLID"=:B1 AND "H"."CONTRACT_NUM"=:B2)
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_WKF_CNT_TYPE" "W"
WHERE SYS_OP_DESCEND("EFFDT") IS NOT NULL AND
SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-
MM-DD')) AND "W"."CONTRACT_NUM"=:B1 AND "W"."EMPLID"=:B2 AND
SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YY
YY-MM-DD')))
11 - access("W"."EMPLID"=:B1 AND "W"."CONTRACT_NUM"=:B2 AND
SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-
MM-DD')) AND SYS_OP_DESCEND("EFFDT") IS NOT NULL)
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE@!,'YY
YY-MM-DD'),'YYYY-MM-DD'))
12 - access("H"."EMPLID"=:B1 AND "H"."CONTRACT_NUM"=:B2)
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_WKF_CNT_TYPE" "W"
WHERE SYS_OP_DESCEND("EFFDT") IS NOT NULL AND
SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-
MM-DD')) AND "W"."CONTRACT_NUM"=:B1 AND "W"."EMPLID"=:B2 AND
SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YY
YY-MM-DD')))
14 - access("W"."EMPLID"=:B1 AND "W"."CONTRACT_NUM"=:B2 AND
SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-
MM-DD')) AND SYS_OP_DESCEND("EFFDT") IS NOT NULL)
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE@!,'YY
YY-MM-DD'),'YYYY-MM-DD'))
15 - filter("DEPT"."EFF_STATUS"='A')
16 - access("DEPT"."MANAGER_ID"=:B1 AND "DEPT"."SETID"='SHARE' AND
"DEPT"."DEPTID"='F0100R')
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL" "DEPT1"
WHERE "DEPT1"."DEPTID"=:B1 AND "DEPT1"."SETID"=:B2))
18 - access("DEPT1"."SETID"=:B1 AND "DEPT1"."DEPTID"=:B2)
19 - filter("DEPT"."EFF_STATUS"='A')
20 - access("DEPT"."MANAGER_ID"=:B1 AND "DEPT"."SETID"='SHARE')
filter(SUBSTR("DEPT"."DEPTID",4,1)='0' AND (SUBSTR("DEPT"."DEPTID",1,1)='R' OR
SUBSTR("DEPT"."DEPTID",1,1)='C') AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))=
(SELECT MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL"
"DEPT1" WHERE "DEPT1"."DEPTID"=:B1 AND "DEPT1"."SETID"=:B2))
22 - access("DEPT1"."SETID"=:B1 AND "DEPT1"."DEPTID"=:B2)
23 - filter("DEPT"."EFF_STATUS"='A')
24 - access("DEPT"."MANAGER_ID"=:B1 AND "DEPT"."SETID"='SHARE')
filter(SUBSTR("DEPT"."DEPTID",1,1)='F' AND SUBSTR("DEPT"."DEPTID",4,1)='0' AND
"DEPT"."DEPTID"<>'F0100R' AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL" "DEPT1"
WHERE "DEPT1"."DEPTID"=:B1 AND "DEPT1"."SETID"=:B2))
26 - access("DEPT1"."SETID"=:B1 AND "DEPT1"."DEPTID"=:B2)
27 - filter("DEPT"."EFF_STATUS"='A')
28 - access("DEPT"."MANAGER_ID"=:B1 AND "DEPT"."SETID"='SHARE')
filter(SUBSTR("DEPT"."DEPTID",4,1)<>'0' AND
SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL" "DEPT1"
WHERE "DEPT1"."DEPTID"=:B1 AND "DEPT1"."SETID"=:B2))
30 - access("DEPT1"."SETID"=:B1 AND "DEPT1"."DEPTID"=:B2)
32 - filter("DEPTM"."EFF_STATUS"='A')
33 - access("DEPTM"."SETID"='SHARE')
filter(SUBSTR("DEPTM"."DEPTID",4,1)='0' AND
SUBSTR("DEPTM"."DEPTID",1,3)=SUBSTR(:B1,1,3) AND
SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL" "DEPT1"
WHERE "DEPT1"."DEPTID"=:B2 AND "DEPT1"."SETID"=:B3))
35 - access("DEPT1"."SETID"=:B1 AND "DEPT1"."DEPTID"=:B2)
36 - filter("DEPT"."EFF_STATUS"='A')
37 - access("DEPT"."MANAGER_ID"=:B1 AND "DEPT"."SETID"='SHARE')
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL" "DEPT1"
WHERE "DEPT1"."DEPTID"=:B1 AND "DEPT1"."SETID"=:B2))
39 - access("DEPT1"."SETID"=:B1 AND "DEPT1"."DEPTID"=:B2)
40 - filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_DEPT_TBL" "Y" WHERE
SYS_OP_DESCEND("EFFDT") IS NOT NULL AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DAT
E(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-MM-DD')) AND "Y"."DEPTID"=:B1 AND
"Y"."SETID"=:B2 AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE
@!,'YYYY-MM-DD'),'YYYY-MM-DD')))
48 - access("C"."NAME_TYPE"='PRI')
filter("C"."NAME_TYPE"='PRI' AND "C"."EFFDT"= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_NAMES" "J" WHERE
SYS_OP_DESCEND("EFFDT") IS NOT NULL AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DAT
E(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-MM-DD')) AND "J"."NAME_TYPE"=:B1 AND
"J"."EMPLID"=:B2 AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDAT
E@!,'YYYY-MM-DD'),'YYYY-MM-DD')))
50 - access("J"."EMPLID"=:B1 AND "J"."NAME_TYPE"=:B2 AND
SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-
MM-DD')) AND SYS_OP_DESCEND("EFFDT") IS NOT NULL)
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE@!,'YY
YY-MM-DD'),'YYYY-MM-DD'))
52 - access("C"."EMPLID"="D"."EMPLID")
54 - access("D"."EMPLID"="E"."EMPLID")
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT
MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_PERS_DATA_EFFDT" "S"
WHERE SYS_OP_DESCEND("EFFDT") IS NOT NULL AND
SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-
MM-DD')) AND "S"."EMPLID"=:B1 AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(T
O_CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-MM-DD')))
56 - access("S"."EMPLID"=:B1 AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(TO_DATE(TO_
CHAR(SYSDATE@!,'YYYY-MM-DD'),'YYYY-MM-DD')) AND SYS_OP_DESCEND("EFFDT") IS NOT NULL)
filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(TO_CHAR(SYSDATE@!,'YY
YY-MM-DD'),'YYYY-MM-DD'))
- 'PLAN_TABLE' is old version -
Question Regarding SQL logic error!
Hello everyone,
I get the following error when executing an Informatica mapping with teh following SQL in the Source Qualifier.
error - OR- 00936: missing expression.
Can anyone help please!
SELECT
PS_CUSTOMER.SETID
, PS_CUSTOMER.CUST_ID
, PS_CUSTOMER.CUST_STATUS
, PS_CUSTOMER.ADD_DT
, PS_CUSTOMER.NAME1
, PS_CUSTOMER.TAXPAYER_ID
, PS_CUSTOMER.WEB_URL
, PS_CUSTOMER.LAST_MAINT_OPRID
, PS_CUSTOMER.DATE_LAST_MAINT
, PS_CUST_SIC_CODES.SIC_CD_QUAL
, PS_CUST_SIC_CODES.SIC_CODE
, PS_CUST_CGRP_LNK.CUST_GRP_TYPE
, PS_CUST_CGRP_LNK.CUSTOMER_GROUP
, PS_CUST_CGRP_LNK.LASTUPDDTTM
, PS_CUST_ID_NBRS.STD_ID_NUM
, PS_CUSTOMER.SUBCUST_QUAL1
FROM PS_CUSTOMER
select SIC1.SETID, SIC1.CUST_ID, MAX(SIC1.SIC_CODE) SIC_CODE, SIC1.SIC_CD_QUAL
from PS_CUST_SIC_CODES SIC1
where SIC1.SIC_CD_QUAL =
( select MAX(SIC_CD_QUAL)
from PS_CUST_SIC_CODES SIC2
where SIC2.CUST_ID = SIC1.CUST_ID
and SIC2.SETID = SIC1.SETID
group by SETID, CUST_ID, SIC1.SIC_CD_QUAL
) PS_CUST_SIC_CODES
select A.CUST_ID, A.SETID, A.CUST_GRP_TYPE
, MAX(A.CUSTOMER_GROUP) CUSTOMER_GROUP, A.LASTUPDDTTM
from PS_CUST_CGRP_LNK A
where A.CUST_GRP_TYPE =
SELECT MAX(CUST_GRP_TYPE)
FROM PS_CUST_CGRP_LNK B
WHERE A.CUST_ID = B.CUST_ID
AND A.SETID = B.SETID
AND A.LASTUPDDTTM = B.LASTUPDDTTM
AND B.LASTUPDDTTM =
SELECT MAX(LASTUPDDTTM)
FROM PS_CUST_CGRP_LNK C
WHERE C.CUST_ID = B.CUST_ID
AND C.SETID = B.SETID
GROUP BY CUST_ID, SETID, CUST_GRP_TYPE, LASTUPDDTTM
) PS_CUST_CGRP_LNK
select SETID, CUST_ID, STD_ID_NUM
from PS_CUST_ID_NBRS
where STD_ID_NUM_QUAL = 'DNS'
) PS_CUST_ID_NBRS
WHERE
{ PS_CUSTOMER
LEFT OUTER JOIN
PS_CUST_SIC_CODES ON
PS_CUSTOMER.SETID = PS_CUST_SIC_CODES.SETID
AND PS_CUSTOMER.CUST_ID = PS_CUST_SIC_CODES.CUST_ID
LEFT OUTER JOIN
PS_CUST_CGRP_LNK ON
PS_CUSTOMER.SETID = PS_CUST_CGRP_LNK.SETID
AND PS_CUSTOMER.CUST_ID = PS_CUST_CGRP_LNK.CUST_ID
LEFT OUTER JOIN
PS_CUST_ID_NBRS ON
PS_CUSTOMER.SETID = PS_CUST_ID_NBRS.SETID
AND PS_CUSTOMER.CUST_ID = PS_CUST_ID_NBRS.CUST_ID
ORDER BY PS_CUSTOMER.CUST_ID , PS_CUSTOMER.SETID
Thanks,
Ajay.Kramer wrote:
Hi
So.. do we have to pay for the feature regarding sql tuning advisor?
Can we use the dbms_sqltune package for free in oracle?
No, you need the license. Please read below,
http://download.oracle.com/docs/cd/E11882_01/license.112/e10594/options.htm#CIHFIHFG
I `m doing below test on my Linux. I installed an oracle on it and only for study purpose so didn`t pay.
As you can see. I got no output.
SQL> exec dbms_sqltune.execute_tuning_task('TASK_1634');
PL/SQL procedure successfully completed.
SQL> select dbms_sqltune.report_tuning_task('TASK_1634') from dual;
DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_1634')
GENERAL INFORMATION SECTION
Please read the below link to learn how to use the STA.
http://download.oracle.com/docs/cd/E11882_01/server.112/e16638/sql_tune.htm
HTH
Aman.... -
Perf issue : wrong choice of index
Hi,
I'm on 10.2.0.4, AIX5.3
Statistics have been gathered, they are up-to-date.
I have a query which run for several hours, here is the query :
UPDATE ps_AB_PDI_CN_TAO_TMP
SET country_2char = COALESCE((
SELECT c.COUNTRY_2CHAR
FROM PSOPRDEFN o
, PS_JOB j
, PS_LOCATION_TBL l
, PS_COUNTRY_TBL c
WHERE j.EMPLID = o.EMPLID
AND j.EFFDT = (SELECT MAX(j1.EFFDT)
FROM PS_JOB j1
WHERE j1.EMPLID = j.EMPLID
AND j1.EMPL_RCD = j.EMPL_RCD
AND j1.EFFDT <= sysdate)
AND j.EFFSEQ = (SELECT MAX(j2.EFFSEQ)
FROM PS_JOB j2
WHERE j2.EMPLID = j.EMPLID
AND j2.EMPL_RCD = j.EMPL_RCD
AND j2.EFFDT = j.EFFDT)
AND j.EMPL_RCD = (SELECT MAX(js.EMPL_RCD)
FROM PS_JOB js
WHERE js.EMPLID = j.EMPLID
AND js.EFFDT = (SELECT MAX(js1.EFFDT)
FROM PS_JOB js1
WHERE js1.EMPLID = js.EMPLID
AND js1.EMPL_RCD = js.EMPL_RCD
AND js1.EFFDT <= sysdate)
AND js.EFFSEQ = (SELECT MAX(js2.EFFSEQ)
FROM PS_JOB js2
WHERE js2.EMPLID = js.EMPLID
AND js2.EMPL_RCD = js.EMPL_RCD
AND js2.EFFDT = js.EFFDT))
AND l.SETID = j.SETID_LOCATION
AND l.LOCATION = j.LOCATION
AND l.EFFDT = (SELECT MAX(l1.EFFDT)
FROM PS_LOCATION_TBL l1
WHERE l1.SETID = l.SETID
AND l1.LOCATION = l.LOCATION
AND l1.EFFDT <= j.EFFDT)
AND l.EFF_STATUS = 'A'
AND c.COUNTRY = l.COUNTRY
AND o.oprid = ps_AB_PDI_CN_TAO_TMP.OPRID),' ' )
WHERE COUNTRY_2CHAR = ' ';Explain plan is the following :
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | UPDATE STATEMENT | | 1 | 52 | 45 (3)| 00:00:01 |
| 1 | UPDATE | PS_AB_PDI_CN_TAO_TMP | | | | |
|* 2 | TABLE ACCESS FULL | PS_AB_PDI_CN_TAO_TMP | 1 | 52 | 45 (3)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 80 | 8 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 1 | 73 | 7 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 48 | 5 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | PSOPRDEFN | 1 | 15 | 2 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | PS_PSOPRDEFN | 1 | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID | PS_JOB | 1 | 33 | 3 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | PS_JOB | 1 | | 2 (0)| 00:00:01 |
| 10 | SORT AGGREGATE | | 1 | 19 | | |
| 11 | FIRST ROW | | 14 | 266 | 3 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 14 | 266 | 3 (0)| 00:00:01 |
| 13 | SORT AGGREGATE | | 1 | 22 | | |
| 14 | FIRST ROW | | 1 | 22 | 3 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 1 | 22 | 3 (0)| 00:00:01 |
| 16 | SORT AGGREGATE | | 1 | 22 | | |
| 17 | FIRST ROW | | 1 | 22 | 7 (58)| 00:00:01 |
|* 18 | INDEX FULL SCAN (MIN/MAX) | PSIJOB | 1 | 22 | 7 (58)| 00:00:01 |
| 19 | SORT AGGREGATE | | 1 | 19 | | |
| 20 | FIRST ROW | | 14 | 266 | 3 (0)| 00:00:01 |
|* 21 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 14 | 266 | 3 (0)| 00:00:01 |
| 22 | SORT AGGREGATE | | 1 | 22 | | |
| 23 | FIRST ROW | | 1 | 22 | 3 (0)| 00:00:01 |
|* 24 | INDEX RANGE SCAN (MIN/MAX)| PSAJOB | 1 | 22 | 3 (0)| 00:00:01 |
|* 25 | TABLE ACCESS BY INDEX ROWID | PS_LOCATION_TBL | 1 | 25 | 2 (0)| 00:00:01 |
|* 26 | INDEX RANGE SCAN | PS_LOCATION_TBL | 1 | | 1 (0)| 00:00:01 |
| 27 | SORT AGGREGATE | | 1 | 19 | | |
| 28 | FIRST ROW | | 1 | 19 | 2 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN (MIN/MAX) | PS_LOCATION_TBL | 1 | 19 | 2 (0)| 00:00:01 |
| 30 | TABLE ACCESS BY INDEX ROWID | PS_COUNTRY_TBL | 1 | 7 | 1 (0)| 00:00:01 |
|* 31 | INDEX UNIQUE SCAN | PS_COUNTRY_TBL | 1 | | 0 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter("COUNTRY_2CHAR"=' ')
7 - access("O"."OPRID"=:B1)
9 - access("J"."EMPLID"="O"."EMPLID")
filter("J"."EFFDT"= (SELECT MAX("J1"."EFFDT") FROM "PS_JOB" "J1" WHERE "J1"."EFFDT"<=SYSDATE@! AND
"J1"."EMPL_RCD"=:B1 AND "J1"."EMPLID"=:B2) AND "J"."EFFSEQ"= (SELECT MAX("J2"."EFFSEQ") FROM "PS_JOB" "J2"
WHERE "J2"."EFFDT"=:B3 AND "J2"."EMPL_RCD"=:B4 AND "J2"."EMPLID"=:B5) AND "J"."EMPL_RCD"= (SELECT
MAX("JS"."EMPL_RCD") FROM "PS_JOB" "SYS_ALIAS_5" WHERE "JS"."EMPLID"=:B6 AND "JS"."EFFDT"= (SELECT
MAX("JS1"."EFFDT") FROM "PS_JOB" "JS1" WHERE "JS1"."EFFDT"<=SYSDATE@! AND "JS1"."EMPL_RCD"=:B7 AND
"JS1"."EMPLID"=:B8) AND "JS"."EFFSEQ"= (SELECT MAX("JS2"."EFFSEQ") FROM "PS_JOB" "JS2" WHERE "JS2"."EFFDT"=:B9
AND "JS2"."EMPL_RCD"=:B10 AND "JS2"."EMPLID"=:B11)))
12 - access("J1"."EMPLID"=:B1 AND "J1"."EMPL_RCD"=:B2 AND "J1"."EFFDT"<=SYSDATE@!)
15 - access("J2"."EMPLID"=:B1 AND "J2"."EMPL_RCD"=:B2 AND "J2"."EFFDT"=:B3)
18 - filter("JS"."EMPLID"=:B1 AND "JS"."EFFDT"= (SELECT MAX("JS1"."EFFDT") FROM "PS_JOB" "JS1" WHERE
"JS1"."EFFDT"<=SYSDATE@! AND "JS1"."EMPL_RCD"=:B2 AND "JS1"."EMPLID"=:B3) AND "JS"."EFFSEQ"= (SELECT
MAX("JS2"."EFFSEQ") FROM "PS_JOB" "JS2" WHERE "JS2"."EFFDT"=:B4 AND "JS2"."EMPL_RCD"=:B5 AND
"JS2"."EMPLID"=:B6))
21 - access("JS1"."EMPLID"=:B1 AND "JS1"."EMPL_RCD"=:B2 AND "JS1"."EFFDT"<=SYSDATE@!)
24 - access("JS2"."EMPLID"=:B1 AND "JS2"."EMPL_RCD"=:B2 AND "JS2"."EFFDT"=:B3)
25 - filter("L"."EFF_STATUS"='A')
26 - access("L"."SETID"="J"."SETID_LOCATION" AND "L"."LOCATION"="J"."LOCATION")
filter("L"."EFFDT"= (SELECT MAX("L1"."EFFDT") FROM "PS_LOCATION_TBL" "L1" WHERE "L1"."EFFDT"<=:B1 AND
"L1"."LOCATION"=:B2 AND "L1"."SETID"=:B3))
29 - access("L1"."SETID"=:B1 AND "L1"."LOCATION"=:B2 AND "L1"."EFFDT"<=:B3)
31 - access("C"."COUNTRY"="L"."COUNTRY")The line 18 looks weird, the index PSIJOB should not be used, but, according to the columns used in the query and the indexes definitions it should be PSAJOB instead.
Here the indexes definition :
PS_JOB PSAJOB EMPLID 1
PS_JOB PSAJOB EMPL_RCD 2
PS_JOB PSAJOB EFFDT 3
PS_JOB PSAJOB EFFSEQ 4
PS_JOB PSAJOB DEPTID 5
PS_JOB PSIJOB EMPL_RCD 1
PS_JOB PSIJOB REG_REGION 2
PS_JOB PSIJOB PAYGROUP 3
PS_JOB PSIJOB COMPANY 4
PS_JOB PSIJOB EMPL_STATUS 5
PS_JOB PSIJOB AB_APPR_STATUS 6
PS_JOB PSIJOB EFFDT 7
PS_JOB PSIJOB EFFSEQ 8
PS_JOB PSIJOB EMPLID 9If I drop the PSIJOB index, PSAJOB is used and query run in few minutes.
And here the explain plan if I drop this index :
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | UPDATE STATEMENT | | 1 | 52 | 45 (3)| 00:00:01 |
| 1 | UPDATE | PS_AB_PDI_CN_TAO_TMP | | | | |
|* 2 | TABLE ACCESS FULL | PS_AB_PDI_CN_TAO_TMP | 1 | 52 | 45 (3)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 80 | 8 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 1 | 73 | 7 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 48 | 5 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | PSOPRDEFN | 1 | 15 | 2 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | PS_PSOPRDEFN | 1 | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID | PS_JOB | 1 | 33 | 3 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | PS_JOB | 1 | | 2 (0)| 00:00:01 |
| 10 | SORT AGGREGATE | | 1 | 19 | | |
| 11 | FIRST ROW | | 14 | 266 | 3 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 14 | 266 | 3 (0)| 00:00:01 |
| 13 | SORT AGGREGATE | | 1 | 22 | | |
| 14 | FIRST ROW | | 1 | 22 | 3 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 1 | 22 | 3 (0)| 00:00:01 |
| 16 | SORT AGGREGATE | | 1 | 22 | | |
| 17 | FIRST ROW | | 1 | 22 | 7 (58)| 00:00:01 |
|* 18 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 1 | 22 | 7 (58)| 00:00:01 |
| 19 | SORT AGGREGATE | | 1 | 19 | | |
| 20 | FIRST ROW | | 14 | 266 | 3 (0)| 00:00:01 |
|* 21 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 14 | 266 | 3 (0)| 00:00:01 |
| 22 | SORT AGGREGATE | | 1 | 22 | | |
| 23 | FIRST ROW | | 1 | 22 | 3 (0)| 00:00:01 |
|* 24 | INDEX RANGE SCAN (MIN/MAX)| PSAJOB | 1 | 22 | 3 (0)| 00:00:01 |
|* 25 | TABLE ACCESS BY INDEX ROWID | PS_LOCATION_TBL | 1 | 25 | 2 (0)| 00:00:01 |
|* 26 | INDEX RANGE SCAN | PS_LOCATION_TBL | 1 | | 1 (0)| 00:00:01 |
| 27 | SORT AGGREGATE | | 1 | 19 | | |
| 28 | FIRST ROW | | 1 | 19 | 2 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN (MIN/MAX) | PS_LOCATION_TBL | 1 | 19 | 2 (0)| 00:00:01 |
| 30 | TABLE ACCESS BY INDEX ROWID | PS_COUNTRY_TBL | 1 | 7 | 1 (0)| 00:00:01 |
|* 31 | INDEX UNIQUE SCAN | PS_COUNTRY_TBL | 1 | | 0 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter("COUNTRY_2CHAR"=' ')
7 - access("O"."OPRID"=:B1)
9 - access("J"."EMPLID"="O"."EMPLID")
filter("J"."EFFDT"= (SELECT MAX("J1"."EFFDT") FROM "PS_JOB" "J1" WHERE "J1"."EFFDT"<=SYSDATE@! AND
"J1"."EMPL_RCD"=:B1 AND "J1"."EMPLID"=:B2) AND "J"."EFFSEQ"= (SELECT MAX("J2"."EFFSEQ") FROM "PS_JOB" "J2"
WHERE "J2"."EFFDT"=:B3 AND "J2"."EMPL_RCD"=:B4 AND "J2"."EMPLID"=:B5) AND "J"."EMPL_RCD"= (SELECT
MAX("JS"."EMPL_RCD") FROM "PS_JOB" "SYS_ALIAS_5" WHERE "JS"."EMPLID"=:B6 AND "JS"."EFFDT"= (SELECT
MAX("JS1"."EFFDT") FROM "PS_JOB" "JS1" WHERE "JS1"."EFFDT"<=SYSDATE@! AND "JS1"."EMPL_RCD"=:B7 AND
"JS1"."EMPLID"=:B8) AND "JS"."EFFSEQ"= (SELECT MAX("JS2"."EFFSEQ") FROM "PS_JOB" "JS2" WHERE "JS2"."EFFDT"=:B9
AND "JS2"."EMPL_RCD"=:B10 AND "JS2"."EMPLID"=:B11)))
12 - access("J1"."EMPLID"=:B1 AND "J1"."EMPL_RCD"=:B2 AND "J1"."EFFDT"<=SYSDATE@!)
15 - access("J2"."EMPLID"=:B1 AND "J2"."EMPL_RCD"=:B2 AND "J2"."EFFDT"=:B3)
18 - access("JS"."EMPLID"=:B1)
filter("JS"."EFFDT"= (SELECT MAX("JS1"."EFFDT") FROM "PS_JOB" "JS1" WHERE "JS1"."EFFDT"<=SYSDATE@! AND
"JS1"."EMPL_RCD"=:B1 AND "JS1"."EMPLID"=:B2) AND "JS"."EFFSEQ"= (SELECT MAX("JS2"."EFFSEQ") FROM "PS_JOB"
"JS2" WHERE "JS2"."EFFDT"=:B3 AND "JS2"."EMPL_RCD"=:B4 AND "JS2"."EMPLID"=:B5))
21 - access("JS1"."EMPLID"=:B1 AND "JS1"."EMPL_RCD"=:B2 AND "JS1"."EFFDT"<=SYSDATE@!)
24 - access("JS2"."EMPLID"=:B1 AND "JS2"."EMPL_RCD"=:B2 AND "JS2"."EFFDT"=:B3)
25 - filter("L"."EFF_STATUS"='A')
26 - access("L"."SETID"="J"."SETID_LOCATION" AND "L"."LOCATION"="J"."LOCATION")
filter("L"."EFFDT"= (SELECT MAX("L1"."EFFDT") FROM "PS_LOCATION_TBL" "L1" WHERE "L1"."EFFDT"<=:B1 AND
"L1"."LOCATION"=:B2 AND "L1"."SETID"=:B3))
29 - access("L1"."SETID"=:B1 AND "L1"."LOCATION"=:B2 AND "L1"."EFFDT"<=:B3)
31 - access("C"."COUNTRY"="L"."COUNTRY")As you can see, the cost is exactly same for the line 18, however it is using a different index and scan.
Do you have any explanation why Oracle is using PSIJOB instead of PSAJOB in first case ?
How Oracle could prefer a INDEX FULL SCAN than INDEX RANGE SCAN (PS_JOB is a 3.3 millions rows table) ?
Lastly, here an extract of the trace 10053 file when PSIJOB is used :
QUERY BLOCK TEXT
SELECT MAX(js.EMPL_RCD)
FROM PS_JOB js
WHERE js.EMPLID = j.EMPLID
AND js.EFFDT = (SELECT MAX(js1.EFFDT)
FROM PS_JOB js1
WHERE js1.EMPLID = js.EMPLID
AND js1.EMPL_RCD = js.EMPL_RCD
AND js1.EFFDT <= sysdate)
AND js.EFFSEQ = (SELECT MAX(js2.EFFSEQ)
FROM PS_JOB js2
WHERE js2.EMPLID = js.EMPLID
AND js2.EMPL_RCD = js.EMPL_RCD
AND js2.EFFDT = js.EFFDT)
Index Stats::
Index: PSAJOB Col#: 1 2 3 4 5
LVLS: 2 #LB: 16434 #DK: 3155830 LB/K: 1.00 DB/K: 1.00 CLUF: 3020072.00
Index: PSIJOB Col#: 2 72 23 22 10 229 3 4 1
LVLS: 2 #LB: 21287 #DK: 3303072 LB/K: 1.00 DB/K: 1.00 CLUF: 3035026.00
SINGLE TABLE ACCESS PATH
BEGIN Single Table Cardinality Estimation
Column (#1): EMPLID(VARCHAR2)
AvgLen: 8.00 NDV: 116590 Nulls: 0 Density: 8.5771e-06
Histogram: HtBal #Bkts: 254 UncompBkts: 254 EndPtVals: 255
Column (#3): EFFDT(DATE)
AvgLen: 8.00 NDV: 2085 Nulls: 0 Density: 2.6799e-04 Min: 2415386 Max: 2455585
Histogram: HtBal #Bkts: 254 UncompBkts: 254 EndPtVals: 183
Column (#2): EMPL_RCD(NUMBER)
AvgLen: 3.00 NDV: 2 Nulls: 0 Density: 0.0026359 Min: 0 Max: 1
Histogram: Freq #Bkts: 2 UncompBkts: 5501 EndPtVals: 2
Column (#4): EFFSEQ(NUMBER)
AvgLen: 3.00 NDV: 5 Nulls: 0 Density: 9.0893e-05 Min: 0 Max: 4
Histogram: Freq #Bkts: 5 UncompBkts: 5501 EndPtVals: 5
Table: PS_JOB Alias: SYS_ALIAS_5
Card: Original: 3282026 Rounded: 28 Computed: 28.15 Non Adjusted: 28.15
END Single Table Cardinality Estimation
Access Path: index (index (FFS))
Index: PSAJOB
resc_io: 2848.00 resc_cpu: 653526199
ix_sel: 0.0000e+00 ix_sel_with_filters: 1
Access Path: index (FFS)
Cost: 3306.55 Resp: 3306.55 Degree: 1
Cost_io: 2848.00 Cost_cpu: 653526199
Resp_io: 2848.00 Resp_cpu: 653526199
Access Path: index (index (FFS))
Index: PSIJOB
resc_io: 3688.00 resc_cpu: 713117750
ix_sel: 0.0000e+00 ix_sel_with_filters: 1
Access Path: index (FFS)
Cost: 4188.36 Resp: 4188.36 Degree: 1
Cost_io: 3688.00 Cost_cpu: 713117750
Resp_io: 3688.00 Resp_cpu: 713117750
Access Path: index (Min/Max)
Index: PSAJOB
resc_io: 3.00 resc_cpu: 21564
ix_sel: 0.035714 ix_sel_with_filters: 0.035714
Cost: 7.13 Resp: 7.13 Degree: 1
Access Path: index (Min/Max)
Index: PSIJOB
resc_io: 3.00 resc_cpu: 21564
ix_sel: 0.035714 ix_sel_with_filters: 0.035714
Cost: 7.13 Resp: 7.13 Degree: 1
Best:: AccessPath: IndexRange Index: PSIJOB
Cost: 7.13 Degree: 1 Resp: 7.13 Card: 28.15 Bytes: 0
Card adjusted, Rounded Card: 1 Computed Card: 0.00
...Thanks.I don't know if you are interested, but I did the following test, and I get a new explain plan :
SQL> alter session set optimizer_features_enable='9.2.0';
Session altered.
SQL>
SQL> DECLARE
2 my_task_name VARCHAR2(30);
3 my_sqltext CLOB;
4 BEGIN
5 my_sqltext := 'UPDATE ps_AB_PDI_CN_TAO_TMP
6 SET country_2char = COALESCE((
7 SELECT c.COUNTRY_2CHAR
8 FROM PSOPRDEFN o
9 , PS_JOB j
10 , PS_LOCATION_TBL l
11 , PS_COUNTRY_TBL c
12 WHERE j.EMPLID = o.EMPLID
13 AND j.EFFDT = (SELECT MAX(j1.EFFDT)
14 FROM PS_JOB j1
15 WHERE j1.EMPLID = j.EMPLID
16 AND j1.EMPL_RCD = j.EMPL_RCD
17 AND j1.EFFDT <= sysdate)
18 AND j.EFFSEQ = (SELECT MAX(j2.EFFSEQ)
19 FROM PS_JOB j2
20 WHERE j2.EMPLID = j.EMPLID
21 AND j2.EMPL_RCD = j.EMPL_RCD
22 AND j2.EFFDT = j.EFFDT)
23 AND j.EMPL_RCD = (SELECT MAX(js.EMPL_RCD)
24 FROM PS_JOB js
25 WHERE js.EMPLID = j.EMPLID
26 AND js.EFFDT = (SELECT MAX(js1.EFFDT)
27 FROM PS_JOB js1
28 WHERE js1.EMPLID = js.EMPLID
29 AND js1.EMPL_RCD = js.EMPL_RCD
30 AND js1.EFFDT <= sysdate)
31 AND js.EFFSEQ = (SELECT MAX(js2.EFFSEQ)
32 FROM PS_JOB js2
33 WHERE js2.EMPLID = js.EMPLID
34 AND js2.EMPL_RCD = js.EMPL_RCD
35 AND js2.EFFDT = js.EFFDT))
36 AND l.SETID = j.SETID_LOCATION
37 AND l.LOCATION = j.LOCATION
38 AND l.EFFDT = (SELECT MAX(l1.EFFDT)
39 FROM PS_LOCATION_TBL l1
40 WHERE l1.SETID = l.SETID
41 AND l1.LOCATION = l.LOCATION
42 AND l1.EFFDT <= j.EFFDT)
43 AND l.EFF_STATUS = ''A''
44 AND c.COUNTRY = l.COUNTRY
45 AND o.oprid = ps_AB_PDI_CN_TAO_TMP.OPRID),'' '' )
46 WHERE COUNTRY_2CHAR = '' ''';
47 my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
48 sql_text => my_sqltext,
49 user_name => 'SYSADM',
50 scope => 'COMPREHENSIVE',
51 time_limit => 3600,
52 task_name => 'sysadm_avoid_psijob',
53 description => 'Task to avoid PSIJOB index on update - PDI');
54 END;
55 /
PL/SQL procedure successfully completed.
SQL>
SQL> BEGIN
2 DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'sysadm_avoid_psijob');
3 end;
4 /
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'sysadm_avoid_psijob') from DUAL;
GENERAL INFORMATION SECTION
Tuning Task Name : sysadm_avoid_psijob
Tuning Task Owner : SYSADM
Scope : COMPREHENSIVE
Time Limit(seconds) : 3600
Completion Status : COMPLETED
Started at : 07/03/2009 20:35:36
Completed at : 07/03/2009 20:38:40
Number of Statistic Findings : 1
Number of SQL Profile Findings : 1
Schema Name: SYSADM
SQL ID : 7xcbcszgj1znc
SQL Text : UPDATE ps_AB_PDI_CN_TAO_TMP
SET country_2char = COALESCE((
SELECT c.COUNTRY_2CHAR
FROM PSOPRDEFN o
, PS_JOB j
, PS_LOCATION_TBL l
, PS_COUNTRY_TBL c
WHERE j.EMPLID = o.EMPLID
AND j.EFFDT = (SELECT MAX(j1.EFFDT)
FROM PS_JOB j1
WHERE j1.EMPLID = j.EMPLID
AND j1.EMPL_RCD = j.EMPL_RCD
AND j1.EFFDT <= sysdate)
AND j.EFFSEQ = (SELECT MAX(j2.EFFSEQ)
FROM PS_JOB j2
WHERE j2.EMPLID = j.EMPLID
AND j2.EMPL_RCD = j.EMPL_RCD
AND j2.EFFDT = j.EFFDT)
AND j.EMPL_RCD = (SELECT MAX(js.EMPL_RCD)
FROM PS_JOB js
WHERE js.EMPLID = j.EMPLID
AND js.EFFDT = (SELECT MAX(js1.EFFDT)
FROM PS_JOB js1
WHERE js1.EMPLID = js.EMPLID
AND js1.EMPL_RCD = js.EMPL_RCD
AND js1.EFFDT <= sysdate)
AND js.EFFSEQ = (SELECT MAX(js2.EFFSEQ)
FROM PS_JOB js2
WHERE js2.EMPLID = js.EMPLID
AND js2.EMPL_RCD =
js.EMPL_RCD
AND js2.EFFDT = js.EFFDT))
AND l.SETID = j.SETID_LOCATION
AND l.LOCATION = j.LOCATION
AND l.EFFDT = (SELECT MAX(l1.EFFDT)
FROM PS_LOCATION_TBL l1
WHERE l1.SETID = l.SETID
AND l1.LOCATION = l.LOCATION
AND l1.EFFDT <= j.EFFDT)
AND l.EFF_STATUS = 'A'
AND c.COUNTRY = l.COUNTRY
AND o.oprid = ps_AB_PDI_CN_TAO_TMP.OPRID),' ' )
WHERE COUNTRY_2CHAR = ' '
FINDINGS SECTION (2 findings)
1- Statistics Finding
Optimizer statistics for table "SYSADM"."PS_AB_PDI_CN_TAO_TMP" and its
indices are stale.
Recommendation
- Consider collecting optimizer statistics for this table.
execute dbms_stats.gather_table_stats(ownname => 'SYSADM', tabname =>
'PS_AB_PDI_CN_TAO_TMP', estimate_percent =>
DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE
AUTO');
Rationale
The optimizer requires up-to-date statistics for the table in order to
select a good execution plan.
2- SQL Profile Finding (see explain plans section below)
A potentially better execution plan was found for this statement.
Recommendation (estimated benefit<=10%)
- Consider accepting the recommended SQL profile.
execute dbms_sqltune.accept_sql_profile(task_name =>
'sysadm_avoid_psijob', replace => TRUE);
EXPLAIN PLANS SECTION
1- Original With Adjusted Cost
Plan hash value: 4225281431
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | UPDATE STATEMENT | | 48482 | 284K| 54 (19)| 00:00:01 |
| 1 | UPDATE | PS_AB_PDI_CN_TAO_TMP | | | | |
|* 2 | TABLE ACCESS FULL | PS_AB_PDI_CN_TAO_TMP | 48482 | 284K| 54 (19)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 80 | 8 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 1 | 73 | 7 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 48 | 5 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | PSOPRDEFN | 1 | 15 | 2 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | PS_PSOPRDEFN | 1 | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID | PS_JOB | 1 | 33 | 3 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | PSAJOB | 1 | | 2 (0)| 00:00:01 |
| 10 | SORT AGGREGATE | | 1 | 19 | | |
| 11 | FIRST ROW | | 10 | 190 | 3 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 10 | 190 | 3 (0)| 00:00:01 |
| 13 | SORT AGGREGATE | | 1 | 22 | | |
| 14 | FIRST ROW | | 1 | 22 | 3 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 1 | 22 | 3 (0)| 00:00:01 |
| 16 | SORT AGGREGATE | | 1 | 22 | | |
| 17 | FIRST ROW | | 1 | 22 | 9 (67)| 00:00:01 |
|* 18 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 1 | 22 | 9 (67)| 00:00:01 |
| 19 | SORT AGGREGATE | | 1 | 19 | | |
| 20 | FIRST ROW | | 10 | 190 | 3 (0)| 00:00:01 |
|* 21 | INDEX RANGE SCAN (MIN/MAX) | PSAJOB | 10 | 190 | 3 (0)| 00:00:01 |
| 22 | SORT AGGREGATE | | 1 | 22 | | |
| 23 | FIRST ROW | | 1 | 22 | 3 (0)| 00:00:01 |
|* 24 | INDEX RANGE SCAN (MIN/MAX)| PSAJOB | 1 | 22 | 3 (0)| 00:00:01 |
|* 25 | TABLE ACCESS BY INDEX ROWID | PS_LOCATION_TBL | 1 | 25 | 2 (0)| 00:00:01 |
|* 26 | INDEX RANGE SCAN | PS_LOCATION_TBL | 1 | | 1 (0)| 00:00:01 |
| 27 | SORT AGGREGATE | | 1 | 19 | | |
| 28 | FIRST ROW | | 1 | 19 | 2 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN (MIN/MAX) | PS_LOCATION_TBL | 1 | 19 | 2 (0)| 00:00:01 |
| 30 | TABLE ACCESS BY INDEX ROWID | PS_COUNTRY_TBL | 1 | 7 | 1 (0)| 00:00:01 |
|* 31 | INDEX UNIQUE SCAN | PS_COUNTRY_TBL | 1 | | 0 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter("COUNTRY_2CHAR"=' ')
7 - access("O"."OPRID"=:B1)
9 - access("J"."EMPLID"="O"."EMPLID")
filter("J"."EFFDT"= (SELECT /*+ INDEX ("J1" "PSAJOB") */ MAX("J1"."EFFDT") FROM "PS_JOB" "J1" WHERE
"J1"."EFFDT"<=SYSDATE@! AND "J1"."EMPL_RCD"=:B1 AND "J1"."EMPLID"=:B2) AND "J"."EFFSEQ"= (SELECT /*+ INDEX
("J2" "PSAJOB") */ MAX("J2"."EFFSEQ") FROM "PS_JOB" "J2" WHERE "J2"."EFFDT"=:B3 AND "J2"."EMPL_RCD"=:B4 AND
"J2"."EMPLID"=:B5) AND "J"."EMPL_RCD"= (SELECT /*+ INDEX ("SYS_ALIAS_5" "PSAJOB") */ MAX("JS"."EMPL_RCD") FR
"PS_JOB" "SYS_ALIAS_5" WHERE "JS"."EMPLID"=:B6 AND "JS"."EFFDT"= (SELECT /*+ INDEX ("JS1" "PSAJOB") */
MAX("JS1"."EFFDT") FROM "PS_JOB" "JS1" WHERE "JS1"."EFFDT"<=SYSDATE@! AND "JS1"."EMPL_RCD"=:B7 AND
"JS1"."EMPLID"=:B8) AND "JS"."EFFSEQ"= (SELECT /*+ INDEX ("JS2" "PSAJOB") */ MAX("JS2"."EFFSEQ") FROM "PS_JO
"JS2" WHERE "JS2"."EFFDT"=:B9 AND "JS2"."EMPL_RCD"=:B10 AND "JS2"."EMPLID"=:B11)))
12 - access("J1"."EMPLID"=:B1 AND "J1"."EMPL_RCD"=:B2 AND "J1"."EFFDT"<=SYSDATE@!)
15 - access("J2"."EMPLID"=:B1 AND "J2"."EMPL_RCD"=:B2 AND "J2"."EFFDT"=:B3)
18 - access("JS"."EMPLID"=:B1)
filter("JS"."EFFDT"= (SELECT /*+ INDEX ("JS1" "PSAJOB") */ MAX("JS1"."EFFDT") FROM "PS_JOB" "JS1" WHERE
"JS1"."EFFDT"<=SYSDATE@! AND "JS1"."EMPL_RCD"=:B1 AND "JS1"."EMPLID"=:B2) AND "JS"."EFFSEQ"= (SELECT /*+ IND
("JS2" "PSAJOB") */ MAX("JS2"."EFFSEQ") FROM "PS_JOB" "JS2" WHERE "JS2"."EFFDT"=:B3 AND "JS2"."EMPL_RCD"=:B4
AND "JS2"."EMPLID"=:B5))
21 - access("JS1"."EMPLID"=:B1 AND "JS1"."EMPL_RCD"=:B2 AND "JS1"."EFFDT"<=SYSDATE@!)
24 - access("JS2"."EMPLID"=:B1 AND "JS2"."EMPL_RCD"=:B2 AND "JS2"."EFFDT"=:B3)
25 - filter("L"."EFF_STATUS"='A')
26 - access("L"."SETID"="J"."SETID_LOCATION" AND "L"."LOCATION"="J"."LOCATION")
filter("L"."EFFDT"= (SELECT /*+ INDEX ("L1" "PS_LOCATION_TBL") */ MAX("L1"."EFFDT") FROM
"PS_LOCATION_TBL" "L1" WHERE "L1"."EFFDT"<=:B1 AND "L1"."LOCATION"=:B2 AND "L1"."SETID"=:B3))
29 - access("L1"."SETID"=:B1 AND "L1"."LOCATION"=:B2 AND "L1"."EFFDT"<=:B3)
31 - access("C"."COUNTRY"="L"."COUNTRY")
2- Using SQL Profile
Plan hash value: 1175485146
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | UPDATE STATEMENT | | 48482 | 284K| | 54 (19)| 00:00:01 |
| 1 | UPDATE | PS_AB_PDI_CN_TAO_TMP | | | | | |
|* 2 | TABLE ACCESS FULL | PS_AB_PDI_CN_TAO_TMP | 48482 | 284K| | 54 (19)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 133 | | 17470 (4)| 00:03:30 |
| 4 | NESTED LOOPS | | 1 | 80 | | 8 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 73 | | 7 (0)| 00:00:01 |
| 6 | NESTED LOOPS | | 1 | 48 | | 5 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID | PSOPRDEFN | 1 | 15 | | 2 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | PS_PSOPRDEFN | 1 | | | 1 (0)| 00:00:01 |
| 9 | TABLE ACCESS BY INDEX ROWID | PS_JOB | 1 | 33 | | 3 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | PSAJOB | 1 | | | 2 (0)| 00:00:01 |
| 11 | SORT AGGREGATE | | 1 | 19 | | | |
| 12 | FIRST ROW | | 10 | 190 | | 3 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN (MIN/MAX)| PSAJOB | 10 | 190 | | 3 (0)| 00:00:01 |
| 14 | SORT AGGREGATE | | 1 | 115 | | | |
|* 15 | HASH JOIN | | 1 | 115 | | 10 (30)| 00:00:01 |
| 16 | NESTED LOOPS | | 1 | 75 | | 5 (20)| 00:00:01 |
| 17 | VIEW | VW_SQ_2 | 19 | 1007 | | 4 (25)| 00:00:01 |
| 18 | SORT GROUP BY | | 19 | 779 | | 4 (25)| 00:00:01 |
|* 19 | INDEX RANGE SCAN | PSAJOB | 19 | 779 | | 3 (0)| 00:00:01 |
|* 20 | INDEX UNIQUE SCAN | PS_JOB | 1 | 22 | | 1 (0)| 00:00:01 |
| 21 | VIEW | VW_SQ_1 | 19 | 760 | | 4 (25)| 00:00:01 |
| 22 | SORT GROUP BY | | 19 | 570 | | 4 (25)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | PSAJOB | 19 | 570 | | 3 (0)| 00:00:01 |
|* 24 | TABLE ACCESS BY INDEX ROWID | PS_LOCATION_TBL | 1 | 25 | | 2 (0)| 00:00:01 |
|* 25 | INDEX RANGE SCAN | PS_LOCATION_TBL | 1 | | | 1 (0)| 00:00:01 |
| 26 | SORT AGGREGATE | | 1 | 19 | | | |
| 27 | FIRST ROW | | 1 | 19 | | 2 (0)| 00:00:01 |
|* 28 | INDEX RANGE SCAN (MIN/MAX) | PS_LOCATION_TBL | 1 | 19 | | 2 (0)| 00:00:01 |
| 29 | TABLE ACCESS BY INDEX ROWID | PS_COUNTRY_TBL | 1 | 7 | | 1 (0)| 00:00:01 |
|* 30 | INDEX UNIQUE SCAN | PS_COUNTRY_TBL | 1 | | | 0 (0)| 00:00:01 |
|* 31 | VIEW | VW_SQ_3 | 1 | 53 | | 17462 (4)| 00:03:30 |
| 32 | SORT GROUP BY | | 3299K| 129M| 379M| 17462 (4)| 00:03:30 |
| 33 | INDEX FULL SCAN | PSAJOB | 3299K| 129M| | 17462 (4)| 00:03:30 |
Predicate Information (identified by operation id):
2 - filter("COUNTRY_2CHAR"=' ')
8 - access("O"."OPRID"=:B1)
10 - access("J"."EMPLID"="O"."EMPLID")
filter("J"."EFFDT"= (SELECT MAX("J1"."EFFDT") FROM "PS_JOB" "J1" WHERE "J1"."EFFDT"<=SYSDATE@! AND
"J1"."EMPL_RCD"=:B1 AND "J1"."EMPLID"=:B2) AND "J"."EMPL_RCD"= (SELECT MAX("JS"."EMPL_RCD") FROM "PS_JOB"
"JS", (SELECT MAX("JS1"."EFFDT") "VW_COL_1","JS1"."EMPLID" "EMPLID","JS1"."EMPL_RCD" "EMPL_RCD" FROM
"PS_JOB" "JS1" WHERE "JS1"."EMPLID"=:B3 AND "JS1"."EFFDT"<=SYSDATE@! GROUP BY
"JS1"."EMPLID","JS1"."EMPL_RCD") "VW_SQ_1", (SELECT MAX("JS2"."EFFSEQ") "VW_COL_1","JS2"."EMPLID"
"EMPLID","JS2"."EMPL_RCD" "EMPL_RCD","JS2"."EFFDT" "EFFDT" FROM "PS_JOB" "JS2" WHERE "JS2"."EMPLID"=:B4
GROUP BY "JS2"."EMPLID","JS2"."EMPL_RCD","JS2"."EFFDT") "VW_SQ_2" WHERE "EMPL_RCD"="JS"."EMPL_RCD" AND
"EMPLID"="JS"."EMPLID" AND "JS"."EFFDT"="VW_COL_1" AND "JS"."EFFSEQ"="VW_COL_1" AND "EFFDT"="JS"."EFFDT"
AND "EMPL_RCD"="JS"."EMPL_RCD" AND "EMPLID"="JS"."EMPLID" AND "JS"."EMPLID"=:B5))
13 - access("J1"."EMPLID"=:B1 AND "J1"."EMPL_RCD"=:B2 AND "J1"."EFFDT"<=SYSDATE@!)
15 - access("JS"."EFFDT"="VW_COL_1" AND "EMPLID"="JS"."EMPLID" AND "EMPL_RCD"="JS"."EMPL_RCD")
19 - access("JS2"."EMPLID"=:B1)
20 - access("EMPLID"="JS"."EMPLID" AND "EMPL_RCD"="JS"."EMPL_RCD" AND "EFFDT"="JS"."EFFDT" AND
"JS"."EFFSEQ"="VW_COL_1")
filter("JS"."EMPLID"=:B1)
23 - access("JS1"."EMPLID"=:B1 AND "JS1"."EFFDT"<=SYSDATE@!)
filter("JS1"."EFFDT"<=SYSDATE@!)
24 - filter("L"."EFF_STATUS"='A')
25 - access("L"."SETID"="J"."SETID_LOCATION" AND "L"."LOCATION"="J"."LOCATION")
filter("L"."EFFDT"= (SELECT MAX("L1"."EFFDT") FROM "PS_LOCATION_TBL" "L1" WHERE "L1"."EFFDT"<=:B1
AND "L1"."LOCATION"=:B2 AND "L1"."SETID"=:B3))
28 - access("L1"."SETID"=:B1 AND "L1"."LOCATION"=:B2 AND "L1"."EFFDT"<=:B3)
30 - access("C"."COUNTRY"="L"."COUNTRY")
31 - filter("J"."EFFSEQ"="VW_COL_1" AND "EMPLID"="J"."EMPLID" AND "EMPL_RCD"="J"."EMPL_RCD" AND
"EFFDT"="J"."EFFDT")
-------------------------------------------------------------------------------{code}
If I accept this new explain plan, the query is not improved, it run longer than expected, especially longer than the previous one (using only PSAJOB). -
dear friends!
I am working on 10g and i have very huge tables in my prod database. I have one table which have two indexes (one primary key and other is also unique key based index). I run a query every week for some very important reports. Most of time this query not use my important index. But when i calculate the stats for table and indexes then after that start to use it. I want its always use index without to calculate stats every time. any suggestioon ?
My query fire from application and which support has obsolete.
regards
irfan ahmadHere's an example of how to run the tuning advisor manually from sqlplus:
Let's say you have run a query and the SQL ID for that query is 1bzbd0r02z9qs
1. Create the tuning task
-- 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 => '1bzbd0r02z9qs',
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 60,
task_name => '1bzbd0r02z9qs_tuning_task',
description => 'Tuning task for statement 1bzbd0r02z9qs.');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
2. Run the tuning task
EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => '1bzbd0r02z9qs_tuning_task');
3. View the recommendations
SET LONG 10000;
SET PAGESIZE 1000
SET LINESIZE 200
SELECT DBMS_SQLTUNE.report_tuning_task('1bzbd0r02z9qs_tuning_task') AS recommendations FROM dual;
4. Drop the tuning task when you're done
EXEC DBMS_SQLTUNE.drop_tuning_task (task_name => '1bzbd0r02z9qs_tuning_task');
Good article and more info here:
http://www.oracle-base.com/articles/10g/AutomaticSQLTuning10g.php#sql_tuning_advisor
Hope that helps,
Andreas
Maybe you are looking for
-
I have a DeskjJet 9650 - When printing my resume button comes on and nothing is printed.
it goes thru the process but doesn't make it pass the intial phase and the resume light comes on and i have to disconnect the printer. i have tried removing the printer and reinstalling and no luck thus far
-
Empty line handling in sender fileadapter FCC
Hi Al, How do we ignore empty lines in the fixed length file by using FCC? In my input file,i would be having emply lines at last and as per my curect FCC configurations,it is reading that emplty line also and due to this,message got failed in mess
-
PL/SQL Library Reinitializes. WHY??
Forms [32 Bit] Version 6.0.8.16.1 (Production) Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production With the Partitioning option JServer Release 8.1.7.4.0 - Production I have a PL/SQL library that is attached to three forms. Form A and Form B i
-
Identifying Full Font Family Names from Acrobat "Properties"
I routinely update PDFs where the originator is unavailable to question about typography issues. The problem I'm having currently, and continue to have, is that Acrobat (on V8) identifies font names differently from say...the Adobe Store. For instanc
-
RoboHelp 7 HTML - Captivate Integration
Hello, I have a problem importing captivate projects into my RoboHelp 7 HTML projects. When I publish used to be able to import the [captivate project]_skin.swf and it would import all relevant swf files into the help files. When I attempt to do this