Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.tools -> Re: UNUSED INDEX on CHAR fields

Re: UNUSED INDEX on CHAR fields

From: Thomas J. Kyte <tkyte_at_us.oracle.com>
Date: 2000/06/29
Message-ID: <8jg61f$npg$1@nnrp1.deja.com>#1/1

In article <8jf7es$vh0$1_at_nnrp1.deja.com>,   sklusmann_at_my-deja.com wrote:
> Thank you Thomas for your explanation before ...
>
> > given the query:
> > SELECT MAX(a.v_adr + a.v_size * b.pc_size) max_size
> > FROM varlist a, v_btypen b
> > WHERE a.v_typ = b.name;
> >
> > the table access full must be expected on either varlist of
 v_btypen.
> > You have NO predicates, only a single join. The plan is showing
 that
> > we are :
> >
> > full scanning v_btypen
> > for each row we find
> > do an index lookup into varlist
> >
>
> ... you may suspect me correctly to be not deeply engaged with SQL,
 but
> how then can I persuade the ORACLE-Server to do it vice versa, that
> means:
>
> full scanning varlist
> for each row we find
> do an index lookup into v_btypen
>
> That would come much closer to what I want it to do! Is that done by
> defining something like "varlist.v_typ is a foreign key on
> v_btypen.name" ?
>

if you are using RBO (if not, use the /*+ RULE */ hint to do so), simply reverse the tables in the from clause:

ops$tkyte_at_8i> set autotrace on explain
ops$tkyte_at_8i> SELECT MAX(a.v_adr + a.v_size * b.pc_size) max_size

  2    FROM     varlist a, v_btypen b
  3   WHERE     a.v_typ = b.name;

  MAX_SIZE


Execution Plan


   0 SELECT STATEMENT Optimizer=CHOOSE    1 0 SORT (AGGREGATE)

   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'V_BTYPEN'
   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'VARLIST'
   5    4         INDEX (RANGE SCAN) OF 'VARLIST_IDX' (NON-UNIQUE)



ops$tkyte_at_8i>
ops$tkyte_at_8i> SELECT MAX(a.v_adr + a.v_size * b.pc_size) max_size

  2    FROM     v_btypen b, varlist a
  3   WHERE     a.v_typ = b.name;

  MAX_SIZE


Execution Plan


   0 SELECT STATEMENT Optimizer=CHOOSE    1 0 SORT (AGGREGATE)

   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'VARLIST'
   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'V_BTYPEN'
   5    4         INDEX (RANGE SCAN) OF 'V_BTYPEN_IDX' (NON-UNIQUE)



> In article <8jd02c$96q$1_at_nnrp1.deja.com>,
> Thomas J. Kyte <tkyte_at_us.oracle.com> wrote:
> > In article <8jcika$vir$1_at_nnrp1.deja.com>,
> > sklusmann_at_my-deja.com wrote:
> > > I am currently trying to tune my queries and I saw
> > > with help from "EXPLAIN PLAN" that sometimes (not always)
> > > indexes on char fields are not used, e.g.:
> > >
> > > SELECT MAX(a.v_adr + a.v_size * b.pc_size) max_size
> > > FROM varlist a, v_btypen b
> > > WHERE a.v_typ = b.name;
> > >
> > > OPERATION OPTIONS
> > > OBJECT_NAME OBJECT_TYPE
> > > ------------------------------ ------------------------------
> > > SORT
> > > AGGREGATE
> > >
> > > NESTED
> > > LOOPS
> > >
> > > TABLE ACCESS FULL
> > > V_BTYPEN
> > > TABLE ACCESS BY INDEX ROWID
> > > VARLIST
> > > INDEX RANGE SCAN
> > > BAUTEIL_V_TYP NON-UNIQUE
> > > SELECT
> > > STATEMENT
> > >
> > > 6 Zeilen ausgewählt
> > >
> > > TABLE ACCESS FULL for V_BTYPEN is strange, because the
 field "name"
 of
> > > this table (char(16)) is indexed even unique and the compared
 field
> > > v_typ is of the same type and size.
> > >
> >
> > given the query:
> > SELECT MAX(a.v_adr + a.v_size * b.pc_size) max_size
> > FROM varlist a, v_btypen b
> > WHERE a.v_typ = b.name;
> >
> > the table access full must be expected on either varlist of
 v_btypen.
> > You have NO predicates, only a single join. The plan is showing
 that
> > we are :
> >
> > full scanning v_btypen
> > for each row we find
> > do an index lookup into varlist
> >
> > It is using the only index that makes sense right now. If you had a
> > predicate such as:
> >
> > SELECT MAX(a.v_adr + a.v_size * b.pc_size) max_size
> > FROM varlist a, v_btypen b
> > WHERE a.v_typ = b.name
> > AND b.name = 'FOO';
> >
> > I would expect it to use an INDEX on v_btypen to find the row(s) and
> > then an indexed read into varlist.
> >
> > As it is -- every single row in v_btypen must be processed -- why
 use
> > an index? an index is used when we need to find a few of the
 rows...
> >
> > > Thanks for any explanation in advance
> > >
> > > Stefan
> > >
> > > Sent via Deja.com http://www.deja.com/
> > > Before you buy.
> > >
> >
> > --
> > Thomas Kyte (tkyte_at_us.oracle.com) Oracle Service Industries
> > Howtos and such: http://osi.oracle.com/~tkyte/index.html
> > Oracle Magazine: http://www.oracle.com/oramag
> > Opinions are mine and do not necessarily reflect those of Oracle
 Corp
> >
> > Sent via Deja.com http://www.deja.com/
> > Before you buy.
> >
>
> Sent via Deja.com http://www.deja.com/
> Before you buy.
>

--
Thomas Kyte (tkyte_at_us.oracle.com) Oracle Service Industries
Howtos and such: http://osi.oracle.com/~tkyte/index.html
Oracle Magazine: http://www.oracle.com/oramag
Opinions are mine and do not necessarily reflect those of Oracle Corp


Sent via Deja.com http://www.deja.com/
Before you buy.
Received on Thu Jun 29 2000 - 00:00:00 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US