Java Mailing List Archive

http://www.dba.5341.com/

Home » Home (12/2007) » oracle-l »

Doing battle with the CBO in 9i (9.2.0.6)

Bobak, Mark

2007-07-10

Replies:

Hi,

 

Having a bit of a problem with the CBO on 9.2.0.6, and I wonder if anyone can offer any advice?

 

I have a query that looks like this:

SELECT FPGI.FPGI_ID L_FPGI_ID,

       FPGI.FPGI_UMI_PAGE_NUMBER DSP_FPGI_UMI_PAGE_NUMBER,

       FPGI.PC_ID DSP_PC_ID

  FROM FULL_PAGE_IMAGES FPGI

 WHERE ( ( :1='ENTER-QUERY')

    OR ( ( NOT :2='ENTER-QUERY')

   AND ( /* CG$MDTU_VWC_START DOC.FPGI */ (FPGI.PC_ID = :3) /* CG$MDTU_VWC_END DOC.FPGI */ ) ) );

 

As some of you may recognize, this query is generated by Oracle Forms, as part of an LOV population.  (That’s where all those parentheses and the ‘ENTER-QUERY’ business comes in.)  So, as this is generated, I have no control over the code, and can’t change it.

 

It’s doing a FULL TABLE SCAN on the table, rather than an INDEX RANGE SCAN on the index on the PC_ID column.  So, after playing with it a bit, it seems that the thing that’s screwing it up is those extra predicates that Forms is adding, regarding the query mode.  If I modify the query and remove those extraneous predicates, the query does the right thing (INDEX RANGE SCAN).  But, I can’t touch the query, cause it’s generated.

 

So, says I, I’ll use stored outlines, and no problem, be on my way…..

 

Well, after struggling to get stored outlines to work (what an awkward interface!  I can’t wait till 10g and SQL Profiles!), I see that I’ve in fact, created a larger problem.  The “fixed” plan is in place, via stored outline, and my performance is WORSE than the FTS!  After scratching my head for a while, I realized that, even with an INDEX hint correctly specified and correctly choosing the index, the reason that the performance is worse, is that the optimizer is choosing to do an INDEX FULL SCAN, followed by a TABLE ACCESS BY ROWID on every row in the  table, which is FAR worse than the FTS I started with!  The problem is that an INDEX hint specifies (correctly) which index to use, but it does NOT specify what type of scan operation (unique, range, or full) Oracle will do on said index!  It seems that in the presence of those aforementioned, extraneous predicates, forces the CBO into doing a full scan rather than range scan!  I did a 10053 trace, to try to get some insight, and found that there are no differences in the trace, up to the SINGLE TABLE ACCESS PATH.  At that point, they diverge significantly.  Here’s what I have in each trace file:

Problem query:

***************************************

SINGLE TABLE ACCESS PATH

Column:      PC_ID  Col#: 2      Table: FULL_PAGE_IMAGES   Alias: FPGI

    NDV: 2794406   NULLS: 0         DENS: 3.5786e-07 LO:  1  HI: 34817851

    NO HISTOGRAM: #BKT: 1 #VAL: 2

  TABLE: FULL_PAGE_IMAGES     ORIG CDN: 95463327  ROUNDED CDN: 954635  CMPTD CDN: 954635

  Access path: index (no sta/stp keys)

      Index: FPGI_INDX_FK01

  TABLE: FULL_PAGE_IMAGES

      RSC_CPU: 0   RSC_IO: 6964505

  IX_SEL:  1.0000e+00  TB_SEL:  1.0000e+00

  BEST_CST: 696451.00  PATH: 4  Degree:  1

***************************************

OPTIMIZER STATISTICS AND COMPUTATIONS

***********************

Join order[0]:  FULL_PAGE_IMAGES[FPGI]#0

Best so far: TABLE#: 0  CST:     696451  CDN:     954635  BYTES:   16228795

prefetching is on for FPGI_INDX_FK01

Final - All Rows Plan:

  JOIN ORDER: 0

  CST: 696451  CDN: 954635  RSC: 696450  RSP: 696450  BYTES: 16228795

  IO-RSC: 696450  IO-RSP: 696450  CPU-RSC: 0  CPU-RSP: 0

 

 

Good query (without extraneous predicates):

***************************************

SINGLE TABLE ACCESS PATH

Column:      PC_ID  Col#: 2      Table: FULL_PAGE_IMAGES   Alias: FPGI

    NDV: 2794406   NULLS: 0         DENS: 3.5786e-07 LO:  1  HI: 34817851

    NO HISTOGRAM: #BKT: 1 #VAL: 2

  TABLE: FULL_PAGE_IMAGES     ORIG CDN: 95463327  ROUNDED CDN: 34  CMPTD CDN: 34

  Access path: index (equal)

      Index: FPGI_INDX_FK01

  TABLE: FULL_PAGE_IMAGES

      RSC_CPU: 0   RSC_IO: 7

  IX_SEL:  0.0000e+00  TB_SEL:  3.5786e-07

  BEST_CST: 1.00  PATH: 4  Degree:  1

***************************************

OPTIMIZER STATISTICS AND COMPUTATIONS

***********************

Join order[0]:  FULL_PAGE_IMAGES[FPGI]#0

Best so far: TABLE#: 0  CST:          1  CDN:         34  BYTES:        578

Final - All Rows Plan:

  JOIN ORDER: 0

  CST: 1  CDN: 34  RSC: 1  RSP: 1  BYTES: 578

  IO-RSC: 1  IO-RSP: 1  CPU-RSC: 0  CPU-RSP: 0

 

 

Note the difference in access paths, “index(no sta/stp)”, which is the full scan, vs. “index (equal)” which is the range scan.

So, at this point, I’m stuck….anyone else faced something similar?  Without the ability to modify the SQL, what are my options?  Any ideas, anyone?

 

AdvThanksance,

 

-Mark

 

--
Mark J. Bobak

Senior Database Administrator, System & Product Technologies
ProQuest
789 E. Eisenhower, Parkway, P.O. Box 1346
Ann Arbor MI 48106-1346
734.997.4059  or 800.521.0600 x 4059
mark.bobak@il.proquest.com
www.proquest.com
www.csa.com

ProQuest...Start here.

 

©2008 dba.5341.com - Jax Systems, LLC, U.S.A.