Re: Query tuning help
From: Ram K <lambu999_at_gmail.com>
Date: Wed, 6 Feb 2013 18:50:05 -0600
Message-ID: <CAAKoEZ8Sv=kGeDUKKwWxUuYDRu5VdX54+iyLjsjnRK+v1VSMMA_at_mail.gmail.com>
Thanks to everyone who responded.
I tried a few things:
After I ran the SQL in sqlplus:
SELECT /*+ GATHER_PLAN_STATISTICS */ A1.PERSONNUM,A1.FULLNM, A5.PPENDDATEDTM, A2.NAME, SUM(A7.DURATIONSECSQTY/3600) FROM TKCSOWNER.WFCTOTAL A7, TKCSOWNER.WTKEMPLOYEE A6, TKCSOWNER.MYPAYPERIOD A5 ,TKCSOWNER.LABORACCT A4, TKCSOWNER.PAYCODE1MMFLAT A3, TKCSOWNER.PAYCODE A2,TKCSOWNER.PERSON A1 WHERE
| Id | Operation | Name | Starts |
E-Rows | A-Rows | A-Time | Buffers |
| 0 | SELECT STATEMENT | | 1 |
17 - filter("A3"."EXPIRATIONDTM">"A7"."APPLYDTM") 18 - access("A3"."PAYCODEID"="A7"."PAYCODEID" AND "A3"."GRANDPAYCODEID"="A2"."PAYCODEID" AND
Date: Wed, 6 Feb 2013 18:50:05 -0600
Message-ID: <CAAKoEZ8Sv=kGeDUKKwWxUuYDRu5VdX54+iyLjsjnRK+v1VSMMA_at_mail.gmail.com>
Thanks to everyone who responded.
I tried a few things:
After I ran the SQL in sqlplus:
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
SQL_ID 2bbazrqwkr4um, child number 1
SELECT /*+ GATHER_PLAN_STATISTICS */ A1.PERSONNUM,A1.FULLNM, A5.PPENDDATEDTM, A2.NAME, SUM(A7.DURATIONSECSQTY/3600) FROM TKCSOWNER.WFCTOTAL A7, TKCSOWNER.WTKEMPLOYEE A6, TKCSOWNER.MYPAYPERIOD A5 ,TKCSOWNER.LABORACCT A4, TKCSOWNER.PAYCODE1MMFLAT A3, TKCSOWNER.PAYCODE A2,TKCSOWNER.PERSON A1 WHERE
A3.GRANDPAYCODEID=A2.PAYCODEID AND A6.EMPLOYEEID=A7.EMPLOYEEID AND A3.PAYCODEID=A7.PAYCODEID AND A3.EFFECTIVEDTM<=A7.APPLYDTM AND A3.EXPIRATIONDTM>A7.APPLYDTM AND A1.PERSONID=A6.PERSONID AND A7.LABORACCTID=A4.LABORACCTID AND A5.PAYRULEID=A6.PAYRULEID AND A2.TYPE='P' AND A7.NOTPAIDSW=0 AND A7.APPLYDTM>=A5.PPSTARTDATEDTM AND A7.APPLYDTM<=A5.PPENDDATEDTM AND A2.NAME='XXXX' GROUP BY A1.PERSONNUM,A1.FULLNM, A5.PPENDDATEDTM, A4.LABORLEV3NM,DECODE(A7.APPLYDTM-A7.ADJAPPLYDTM,0,' ','Y'), A2.NAME Plan hash value: 2356839483
| Id | Operation | Name | Starts |
E-Rows | A-Rows | A-Time | Buffers |
| 0 | SELECT STATEMENT | | 1 |
| 1 |00:09:48.22 | 300M|
| 1 | HASH GROUP BY | | 1 |
1 | 1 |00:09:48.22 | 300M|
| 2 | NESTED LOOPS | | 1 |
1 | 1 |00:19:59.99 | 300M|
| 3 | NESTED LOOPS | | 1 |
1 | 1 |00:19:59.99 | 300M|
| 4 | NESTED LOOPS | | 1 |
1 | 1 |00:19:59.99 | 300M|
| 5 | NESTED LOOPS | | 1 |
1 | 133K|00:42:12.51 | 300M| |* 6 | HASH JOIN | | 1 | 15945 | 15949 |00:00:00.49 | 129 |
| 7 | NESTED LOOPS | | 1 |
54 | 54 |00:00:00.01 | 30 | |* 8 | TABLE ACCESS BY INDEX ROWID| PAYCODE | 1 | 1 | 1 |00:00:00.01 | 2 | |* 9 | INDEX UNIQUE SCAN | XU1_PAYCODE | 1 | 1 | 1 |00:00:00.01 | 1 |
| 10 | TABLE ACCESS FULL | MYPAYPERIOD | 1 |
54 | 54 |00:00:00.01 | 28 |
| 11 | VIEW | index$_join$_002 | 1 |
15971 | 15975 |00:00:00.40 | 99 | |* 12 | HASH JOIN | | 1 | | 15975 |00:00:00.35 | 99 |
| 13 | INDEX FAST FULL SCAN | XU2_WTKEMPLOYEE | 1 |
15971 | 15975 |00:00:00.01 | 61 |
| 14 | INDEX FAST FULL SCAN | XU1_WTKEMPLOYEE | 1 |
15971 | 15975 |00:00:00.10 | 38 | |* 15 | TABLE ACCESS BY INDEX ROWID | WFCTOTAL | 15949 | 1 | 133K|00:40:28.38 | 300M| |* 16 | INDEX RANGE SCAN | X3_WFCTOTAL | 15949 | 1 | 2122M|00:13:45.07 | 12M| |* 17 | TABLE ACCESS BY INDEX ROWID | PAYCODE1MMFLAT | 133K| 1 | 1 |00:00:01.83 | 20590 | |* 18 | INDEX RANGE SCAN | PK_PAYCODE1MMFLAT | 133K| 1 | 1 |00:00:01.06 | 20589 |
| 19 | TABLE ACCESS BY INDEX ROWID | PERSON | 1 |
1 | 1 |00:00:00.01 | 3 | |* 20 | INDEX UNIQUE SCAN | PK_PERSON | 1 | 1 | 1 |00:00:00.01 | 2 | |* 21 | INDEX RANGE SCAN | ZZZZ_PK_LABORACCT | 1 | 1 | 1 |00:00:00.01 | 2 | ------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
6 - access("A5"."PAYRULEID"="A6"."PAYRULEID") 8 - filter("A2"."TYPE"=U'P') 9 - access("A2"."NAME"=U'STIIP-INDICATOR') 12 - access(ROWID=ROWID) 15 - filter(("A7"."NOTPAIDSW"=0 AND "A6"."EMPLOYEEID"="A7"."EMPLOYEEID")) 16 - access("A7"."APPLYDTM">="A5"."PPSTARTDATEDTM" AND "A7"."APPLYDTM"<="A5"."PPENDDATEDTM")
17 - filter("A3"."EXPIRATIONDTM">"A7"."APPLYDTM") 18 - access("A3"."PAYCODEID"="A7"."PAYCODEID" AND "A3"."GRANDPAYCODEID"="A2"."PAYCODEID" AND
"A3"."EFFECTIVEDTM"<="A7"."APPLYDTM") 20 - access("A1"."PERSONID"="A6"."PERSONID") 21 - access("A7"."LABORACCTID"="A4"."LABORACCTID")
Note
- cardinality feedback used for this statement
64 rows selected.
I have changed name predicate value and index name slightly in the above. As you guys have mentioned the A-rows is way off in line 16.
Index defn:
TABLE_NAME INDEX_NAME COLUMN_NAMECOLUMN_POSITION
--------------------- ------------------------------ ---------------------- --------------- WFCTOTAL X3_WFCTOTAL APPLYDTM 1 WFCTOTAL X3_WFCTOTAL PAYCODEID 2
I re analyzed the table at this point, including NOTPAIDSW column (only).
Column stats on the NOTPAIDSW column:
TABLE_NAME COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE ------------------------------ ------------------------------ ------------ -------------------- -------------------- DENSITY LAST_ANALYZED NUM_NULLS SAMPLE_SIZEHISTOGRAM
--------------------------------- ----------------- ---------- ----------- --------------- WFCTOTAL NOTPAIDSW 2 80 C102 .000000015890049501635600 06-FEB-13 05:11pm 0 31466233FREQUENCY select count(*), NOTPAIDSW from wfctotal group by NOTPAIDSW
COUNT(*) NOTPAIDSW
---------- ----------
18142 1 31449074 0
I dont get how the low and hi value are 80 and C102 in tab_cols while the querying the table shows something different
Parameters:
optimizer_capture_sql_plan_baselines boolean FALSE optimizer_dynamic_sampling integer 2 optimizer_features_enable string 11.2.0.1 optimizer_index_caching integer 0 optimizer_index_cost_adj integer 100 optimizer_mode string ALL_ROWS optimizer_secure_view_merging boolean TRUE optimizer_use_invisible_indexes boolean FALSE optimizer_use_pending_statistics boolean FALSE optimizer_use_sql_plan_baselines boolean TRUE ===============================================================================================================
OICaching and OICAdj recommended by the vendors, not us.
-- Thanks, Ram. -- http://www.freelists.org/webpage/oracle-lReceived on Thu Feb 07 2013 - 01:50:05 CET