Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> Strange 9.2.0.5 Optimizer Decisions.
All,
First, Oracle 9.2.0.5 on Sun.
I have a query against our data warehouse that, when we change a literal value for the year in the where clause, generates two different explain plans. The query below shows where we change this value. When we quwery against the year 2003, we get the first explain plan below. When we query against the year 2004, we get the second explain plan. The difference is the use of one index or the other. The table is question (Ledger_Fact) is partitioned by year (Tran_Date_Key which is a valued of yyyymmdd). The table has four populated partitions for the 2003 year, but only threee populated partitions for the 2004 year - the fourth quarter has no records in it yet. Statistics are current for all tables and indexes.
The problem is that the 2003 query completes in about 25 minutes, while the 2004 query was still running after more than an hour.
My guess is that the optimizer is taking a separate path because the 4th 2004 partition has no records in it. Does this make sense to anyone?
My apologies for the format of the query and the length of the question. The query is generated by Cognos - so we have little or no control over it.
Thanks for any help.
Tom Mercadante
Oracle Certified Professional
Query:
select count(distinct T1."CLAIM_SSN") "c1",
DECODE(T2."STATE_FIPS",NULL,DECODE(T2."COUNTY_FIPS",NULL,'98' ,
DECODE(T2."STATE_FIPS",NULL,T3."LMA_REGION"
,DECODE(T2."STATE_FIPS",'36',T3."LMA_REGION" ,NULL,T3."LMA_REGION",'99')))
,
DECODE(T2."STATE_FIPS",NULL,T3."LMA_REGION" ,DECODE(T2."STATE_FIPS",'36',
T3."LMA_REGION" ,NULL,T3."LMA_REGION",'99')))
"c2", '2003' "c3", case when
DECODE(T2."STATE_FIPS",NULL,DECODE(T2."COUNTY_FIPS",NULL,'98' ,
DECODE(T2."STATE_FIPS",NULL,T3."LMA_REGION"
,DECODE(T2."STATE_FIPS",'36',T3."LMA_REGION" ,NULL,T3."LMA_REGION",'99')))
,
DECODE(T2."STATE_FIPS",NULL,T3."LMA_REGION"
,DECODE(T2."STATE_FIPS",'36',T3."LMA_REGION" ,NULL,T3."LMA_REGION",'99')))
not in ('98', '99') then
DECODE(T3."LMA_FIPS",T2."COUNTY_FIPS",T2."COUNTY_DESC" ) else NULL end
"c4",
SUBSTR(T4."MONTH",1 ,3) "c5", '2003' "c6", DECODE(DECODE(T2."STATE_FIPS",NULL,DECODE(T2."COUNTY_FIPS",NULL,'98' , DECODE(T2."STATE_FIPS",NULL,T3."LMA_REGION"
"DWOWN"."PERSON_DIM" T2, "DWOWN"."LABOR_MARKET_AREAS" T3, "DWOWN"."MIDWEEK_DATE_REF" T4, "DWOWN"."LEDGER_FACT" T1 LEFT OUTER JOIN "DWOWN"."CLAIM_FACT" T5 onT1."CLAIM_SSN"=T5."SSN" and
----------------------------------- LITERAL VALUES CHANGED BELOWT4."YEAR"='2004' and
----------------------------------- LITERAL VALUES CHANGED ABOVET1."TRAN_DATE_KEY" between T4."REF_BEG_TRANS" and T4."REF_END_TRANS" and T1."ER_NUMBER" not in ('0000471020', '0000471021', '0000471022', '0000471023') and
Year 2003 Explain Plan
PLAN_TABLE_OUTPUT
| Id | Operation | Name| Rows | Bytes | Cost (%CPU)| Pstart| Pstop |
| 0 | SELECT STATEMENT | | 1 | 136 | 1801 (2)| | | | 1 | SORT GROUP BY | | 1 | 136 | 1801 (2)| | | |* 2 | HASH JOIN | | 1 | 136 | 1800 (2)| | | | 3 | NESTED LOOPS | | 3 | 360 | 1797 (2)| | | | 4 | NESTED LOOPS OUTER | | 3 | 297 | 1794 (2)| | | | 5 | NESTED LOOPS | | 3 | 225 | 851 (2)| | | |* 6 | TABLE ACCESS FULL | MIDWEEK_DATE_REF | 3 | 78 | 3 (34)| | | | 7 | PARTITION RANGE ITERATOR | | | | | KEY | KEY | |* 8 | TABLE ACCESS BY LOCAL INDEX ROWID | LEDGER_FACT | 1 | 49 | 851 (2)| KEY | | 9 | BITMAP CONVERSION TO ROWIDS | | | | | | | | 10 | BITMAP AND | | | | | | | |* 11 | BITMAP INDEX SINGLE VALUE | BMX_LEDGER_STAT_WEEK | | | | KEY | | | 12 | BITMAP MERGE | | | | | | | |* 13 | BITMAP INDEX RANGE SCAN | BMX_LEDGER_TRAN_DATE_KEY | | | | KEY | | 14 | PARTITION RANGE ITERATOR | | | | | KEY | KEY | |* 15 | TABLE ACCESS BY LOCAL INDEX ROWID | CLAIM_FACT | 1 | 24 | 1794 (2)| KEY | | 16 | BITMAP CONVERSION TO ROWIDS | | | | | | | |* 17 | BITMAP INDEX SINGLE VALUE | BMX_CLAIM_SSN | | | | KEY | KEY | | 18 | TABLE ACCESS BY GLOBAL INDEX ROWID | PERSON_DIM | 1 | 21 | 2 (50)| ROWID | RO |* 19 | INDEX UNIQUE SCAN | PK_PERSON_DIM | 1 | | | | | | 20 | TABLE ACCESS FULL | LABOR_MARKET_AREAS | 62 | 992 | 3 (34)| | | ---------------------------------------------------------------------------- ------------------------
2 - access("T3"."LMA_FIPS"="T2"."COUNTY_FIPS") 6 - filter("T4"."REF_END_TRANS">=20030101 AND "T4"."YEAR"='2003' AND "T4"."REF_BEG_TRANS"<=999999 8 - filter("T1"."AMOUNT">0 AND ("T1"."TRAN_CODE"='43' OR "T1"."TRAN_CODE"='47' OR "T1"."TRAN_CODE "T1"."ER_NUMBER"<>'0000471020' AND "T1"."ER_NUMBER"<>'0000471021' AND "T1"."ER_NUMBER"<>'0000 "T1"."ER_NUMBER"<>'0000471023') 11 - access("T4"."REF_STAT_WEEK"="T1"."STAT_WEEK") 13 - access("T1"."TRAN_DATE_KEY">="T4"."REF_BEG_TRANS" AND "T1"."TRAN_DATE_KEY"<="T4"."REF_END_TRA filter("T1"."TRAN_DATE_KEY"<=99999999 AND "T1"."TRAN_DATE_KEY">=20030101) 15 - filter("T1"."CLAIM_EFF_DT"="T5"."EFDT"(+))17 - access("T1"."CLAIM_SSN"="T5"."SSN"(+)) 19 - access("T5"."PERSON_KEY"="T2"."PERSON_KEY")
41 rows selected.
Year 2004 Explain Plan
PLAN_TABLE_OUTPUT
| Name | Rows | Bytes | Cost (%CPU)| Pstart| ---------------------------------------------------------------------------- ------------------------ | 0 | SELECT STATEMENT | | 1 | 136 | 1776 (10)| | | 1 | SORT GROUP BY | | 1 | 136 | 1776 (10)| | | 2 | SORT GROUP BY | | 1 | 136 | 1776 (10)| | | 3 | SORT GROUP BY | | 1 | 136 | 1776 (10)| | |* 4 | HASH JOIN | | 1 | 136 | 1775 (10)| | | 5 | NESTED LOOPS | | 1 | 120 | 1768 (10)| | | 6 | NESTED LOOPS OUTER | | 1 | 99 | 1767 (10)| | | 7 | NESTED LOOPS | | 1 | 75 | 923 (2)| | |* 8 | TABLE ACCESS FULL | MIDWEEK_DATE_REF | 2 | 52 | 3 (34)| | | 9 | PARTITION RANGE ITERATOR | | | | | KEY | |* 10 | TABLE ACCESS BY LOCAL INDEX ROWID | LEDGER_FACT | 1 | 49 | 923 (2)| KEY | | 11 | BITMAP CONVERSION TO ROWIDS | | | | | | | 12 | BITMAP AND | | | | | | |* 13 | BITMAP INDEX SINGLE VALUE | BMX_LEDGER_STAT_WEEK | | | | KEY | | 14 | BITMAP OR | | | | | | |* 15 | BITMAP INDEX SINGLE VALUE | BMX_LEDGER_TRANCODE | | | | KEY |* 16 | BITMAP INDEX SINGLE VALUE | BMX_LEDGER_TRANCODE | | | | KEY |* 17 | BITMAP INDEX SINGLE VALUE | BMX_LEDGER_TRANCODE | | | | KEY | 18 | BITMAP MERGE | | | | | | |* 19 | BITMAP INDEX RANGE SCAN | BMX_LEDGER_TRAN_DATE_KEY | | | | KEY | | 20 | PARTITION RANGE ITERATOR | | | | | KEY | |* 21 | TABLE ACCESS FULL | CLAIM_FACT | 1 | 24 | 845 (19) | 22 | TABLE ACCESS BY GLOBAL INDEX ROWID | PERSON_DIM | 1 | 21 | 2 (50)| |* 23 | INDEX UNIQUE SCAN | PK_PERSON_DIM | 1 | | | | | 24 | TABLE ACCESS FULL | LABOR_MARKET_AREAS | 62 | 992 | 3 (34)| | ---------------------------------------------------------------------------- ------------------------
Predicate Information (identified by operation id):
4 - access("T3"."LMA_FIPS"="T2"."COUNTY_FIPS") 8 - filter("T4"."REF_END_TRANS">=20040101 AND "T4"."YEAR"='2004' AND "T4"."REF_BEG_TRANS"<=999999 10 - filter("T1"."AMOUNT">0 AND ("T1"."TRAN_CODE"='43' OR "T1"."TRAN_CODE"='47' OR "T1"."TRAN_CODE "T1"."ER_NUMBER"<>'0000471020' AND "T1"."ER_NUMBER"<>'0000471021' AND "T1"."ER_NUMBER"<>'0000 "T1"."ER_NUMBER"<>'0000471023') 13 - access("T4"."REF_STAT_WEEK"="T1"."STAT_WEEK") 15 - access("T1"."TRAN_CODE"='43') 16 - access("T1"."TRAN_CODE"='47') 17 - access("T1"."TRAN_CODE"='50') 19 - access("T1"."TRAN_DATE_KEY">="T4"."REF_BEG_TRANS" AND "T1"."TRAN_DATE_KEY"<="T4"."REF_END_TRA filter("T1"."TRAN_DATE_KEY"<=99999999 AND"T1"."TRAN_DATE_KEY">=20040101)
21 - filter("T1"."CLAIM_EFF_DT"="T5"."EFDT"(+) AND "T1"."CLAIM_SSN"="T5"."SSN"(+)) 23 - access("T5"."PERSON_KEY"="T2"."PERSON_KEY")
47 rows selected.
-- Archives are at http://www.freelists.org/archives/oracle-l/ FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html -----------------------------------------------------------------Received on Wed Aug 11 2004 - 08:02:05 CDT
![]() |
![]() |