AIX, oracle 8.1.7.2, all 3 tables compute statistics, first_rows optimizer_mode
 
a simple 3 table join, joined on the appropriate columns, works fine.
 
add a fixed constant to the mix and poof, 2 merge-join cartesian.
 
Here is first query w/o the fixed value:
 
select
  T1.EVENT# c1,
  count(distinct T1.CONCO#) c2,
  T2.EVDESC c3,
  T3.CATTYP c4 ,
  count(distinct T3.CATCO#) c5
from STAGING.BECONS T1,
     STAGING.EVMAST T2,
     STAGING.BECATD T3
where
      T1.EVENT# = T2.EVMBRN and
      T1.EVENT# = T3.EVENT#
group by T1.EVENT#, T2.EVDESC, T3.CATTYP
order by 1 asc, 3 asc, 4 asc;
 
Plan:
| SELECT STATEMENT                       |
|  SORT GROUP BY                         |
|   HASH JOIN                            |
|    HASH JOIN                           |
|     TABLE ACCESS FULL                  |EVMAST
|     TABLE ACCESS FULL                  |BECONS
|    TABLE ACCESS FULL                   |BECATD
 
Now add one line with a hardcoded value and it appears that oracle is totally ignoring the rest of the where clause(proven later):
select
  T1.EVENT# c1,
  count(distinct T1.CONCO#) c2,
  T2.EVDESC c3,
  T3.CATTYP c4 ,
  count(distinct T3.CATCO#) c5
from STAGING.BECONS T1,
     STAGING.EVMAST T2,
     STAGING.BECATD T3
where
      T1.EVENT# = T2.EVMBRN and
      T1.EVENT# = T3.EVENT#
and T1.EVENT#='EV000154'
group by T1.EVENT#, T2.EVDESC, T3.CATTYP
order by 1 asc, 3 asc, 4 asc;
plan: 
| SELECT STATEMENT                       |
|  SORT GROUP BY                         |
|   MERGE JOIN CARTESIAN                 |
|    MERGE JOIN CARTESIAN                |
|     TABLE ACCESS FULL                  |EVMAST
|     SORT JOIN                          |
|      TABLE ACCESS BY INDEX ROWID       |BECONS
|       INDEX RANGE SCAN                 |IDX01_BECONS
|    SORT JOIN                           |
|     TABLE ACCESS BY INDEX ROWID        |BECATD
|      INDEX RANGE SCAN                  |INDX01_BECATD
 
Now proven here is if i leave out the joins altogether, i get the close the the same execution plan as above :
select
  T1.EVENT# c1,
  count(distinct T1.CONCO#) c2,
  T2.EVDESC c3,
  T3.CATTYP c4 ,
  count(distinct T3.CATCO#) c5
from STAGING.BECONS T1,
     STAGING.EVMAST T2,
     STAGING.BECATD T3
where
T1.EVENT#='EV000154'
group by T1.EVENT#, T2.EVDESC, T3.CATTYP
order by 1 asc, 3 asc, 4 asc;
 
Plan:
| SELECT STATEMENT                       |
|  SORT GROUP BY                         |
|   MERGE JOIN CARTESIAN                 |
|    MERGE JOIN CARTESIAN                |
|     TABLE ACCESS BY INDEX ROWID        |BECONS
|      INDEX RANGE SCAN                  |IDX01_BECONS
|     SORT JOIN                          |
|      TABLE ACCESS FULL                 |EVMAST
|    SORT JOIN                           |
|     TABLE ACCESS FULL                  |BECATD
 
I'm looking for any ideas what the heck the CBO is doing or is this some bug of some sorts?
 
thanks, joe

 

Reply via email to