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" ,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'))), '98','INVALID/UNKNOWN COUNTIES' ,DECODE(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'))), '99','OUT-OF-STATE RESIDENTS' ,T3."LMA_REGION")) "c7", '2003' "c8" from "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 on T1."CLAIM_SSN"=T5."SSN" and T1."CLAIM_EFF_DT"=T5."EFDT" where T5."PERSON_KEY"=T2."PERSON_KEY" and T3."LMA_FIPS"=T2."COUNTY_FIPS" and ----------------------------------- LITERAL VALUES CHANGED BELOW T4."YEAR"='2004' and T1."TRAN_DATE_KEY" between 20040101 and 99999999 ----------------------------------- LITERAL VALUES CHANGED ABOVE T1."TRAN_DATE_KEY" between T4."REF_BEG_TRANS" and T4."REF_END_TRANS" and T1."ER_NUMBER" not in ('0000471020', '0000471021', '0000471022', '0000471023') and T1."AMOUNT">0 and T1."TRAN_CODE" in ('43', '47', '50') and T4."REF_STAT_WEEK"=T1."STAT_WEEK" and group by 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'))), DECODE(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'))),'98','INVALID/UNKNOWN COUNTIES' , DECODE(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'))),'99','OUT-OF-STATE RESIDENTS' , T3."LMA_REGION")), 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 , SUBSTR(T4."MONTH",1 ,3) order by "c2" asc, "c7" asc, "c4" asc, "c5" asc ; 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)| | | ---------------------------------------------------------------------------- ------------------------ PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------- ------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 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 ---------------------------------------------------------------------------- ------------------------ ---------------------------------------------------------------------------- ------------------------ | Id | Operation | 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. ---------------------------------------------------------------- Please see the official ORACLE-L FAQ: http://www.orafaq.com ---------------------------------------------------------------- To unsubscribe send email to: oracle-l-request@xxxxxxxxxxxxx put 'unsubscribe' in the subject line. -- Archives are at //www.freelists.org/archives/oracle-l/ FAQ is at //www.freelists.org/help/fom-serve/cache/1.html -----------------------------------------------------------------