From: HansP on
Hi all,

I had a 10053 trace file generated of a Siebel query and I do not
understand the SINGLE TABLE ACCESS PATH part.
Below is a snippet of the tracefile.

It seems to calculate the costs of a full tablescan as 1988.76.
Then the different index access paths are calculated which are
calculated as 215.78 and 236.68 respectively.
At the end to my surprise it says "Best:: AccessPath: TableScan" with
cost 1988.76.

Can someone shed some light on this. Why is the TableScan chosen
whereas the index accesses have a lower cost.

Regards HansP

(Oracle version 10.2.0.4, optimizer_index_cost_adj = 10)

SINGLE TABLE ACCESS PATH
-----------------------------------------
BEGIN Single Table Cardinality Estimation
-----------------------------------------
Table: S_ORG_EXT_LSX Alias: T13
Card: Original: 784404 Rounded: 784404 Computed: 784404.00 Non
Adjusted: 784404.00
-----------------------------------------
END Single Table Cardinality Estimation
-----------------------------------------
Access Path: TableScan
Cost: 1988.76 Resp: 1988.76 Degree: 0
Cost_io: 1947.00 Cost_cpu: 817088980
Resp_io: 1947.00 Resp_cpu: 817088980
****** trying bitmap/domain indexes ******
Access Path: index (FullScan)
Index: S_ORG_EXT_LSX_P1
resc_io: 2149.00 resc_cpu: 171334375
ix_sel: 1 ix_sel_with_filters: 1
Cost: 215.78 Resp: 215.78 Degree: 0
Access Path: index (FullScan)
Index: S_ORG_EXT_LSX_U1
resc_io: 2358.00 resc_cpu: 172822756
ix_sel: 1 ix_sel_with_filters: 1
Cost: 236.68 Resp: 236.68 Degree: 0
****** finished trying bitmap/domain indexes ******
Best:: AccessPath: TableScan
Cost: 1988.76 Degree: 1 Resp: 1988.76 Card: 784404.00
Bytes: 0
From: Jonathan Lewis on

"HansP" <Hans-Peter.Sloot(a)atosorigin.com> wrote in message
news:b4ec3efd-18cd-4fa5-afbc-e97d127c856f(a)d20g2000yqh.googlegroups.com...
> Hi all,
>
> I had a 10053 trace file generated of a Siebel query and I do not
> understand the SINGLE TABLE ACCESS PATH part.
> Below is a snippet of the tracefile.
>
> It seems to calculate the costs of a full tablescan as 1988.76.
> Then the different index access paths are calculated which are
> calculated as 215.78 and 236.68 respectively.
> At the end to my surprise it says "Best:: AccessPath: TableScan" with
> cost 1988.76.
>
> Can someone shed some light on this. Why is the TableScan chosen
> whereas the index accesses have a lower cost.
>
> Regards HansP
>
> (Oracle version 10.2.0.4, optimizer_index_cost_adj = 10)
>
> SINGLE TABLE ACCESS PATH
> -----------------------------------------
> BEGIN Single Table Cardinality Estimation
> -----------------------------------------
> Table: S_ORG_EXT_LSX Alias: T13
> Card: Original: 784404 Rounded: 784404 Computed: 784404.00 Non
> Adjusted: 784404.00
> -----------------------------------------
> END Single Table Cardinality Estimation
> -----------------------------------------
> Access Path: TableScan
> Cost: 1988.76 Resp: 1988.76 Degree: 0
> Cost_io: 1947.00 Cost_cpu: 817088980
> Resp_io: 1947.00 Resp_cpu: 817088980
> ****** trying bitmap/domain indexes ******
> Access Path: index (FullScan)
> Index: S_ORG_EXT_LSX_P1
> resc_io: 2149.00 resc_cpu: 171334375
> ix_sel: 1 ix_sel_with_filters: 1
> Cost: 215.78 Resp: 215.78 Degree: 0
> Access Path: index (FullScan)
> Index: S_ORG_EXT_LSX_U1
> resc_io: 2358.00 resc_cpu: 172822756
> ix_sel: 1 ix_sel_with_filters: 1
> Cost: 236.68 Resp: 236.68 Degree: 0
> ****** finished trying bitmap/domain indexes ******
> Best:: AccessPath: TableScan
> Cost: 1988.76 Degree: 1 Resp: 1988.76 Card: 784404.00
> Bytes: 0


It's often necessary to investigate any odd case in detail,
version by version of Oracle.

In this case, you have optimizer_index_cost_adj = 10, and
you can see that your final index costs are 10% (approx)
of the initial resc_io for the index; and the tablescan cost is
less than the initial index costs. On top of this, the index
uses are both FULL SCAN. The selectivity, in the index
and at the table, is 1 - i.e. all the data. (And since it's Siebel,
I wouldn't be surprised if you've also got the optimizer mode
set to first_rows_10 .... and the first_rows_n optimsations
always add confusion).

Possibilities -

first_rows_n may have messed things up

full scans may be paths where Oracle ignores the
optimizer_index_cost_adj when making the final decision.

the selectivities of 1 throughout may cause Oracle
to ignore the optimizer_index_cost_adj when making
the final decision.

you've found a bug



--
Regards

Jonathan Lewis
http://jonathanlewis.wordpress.com


From: HansP on
On 10 dec, 23:15, "Jonathan Lewis" <jonat...(a)jlcomp.demon.co.uk>
wrote:
> "HansP" <Hans-Peter.Sl...(a)atosorigin.com> wrote in message
>
> news:b4ec3efd-18cd-4fa5-afbc-e97d127c856f(a)d20g2000yqh.googlegroups.com...
>
>
>
> > Hi all,
>
> > I had a 10053 trace file generated of a Siebel query and I do not
> > understand the SINGLE TABLE ACCESS PATH part.
> > Below is a snippet of the tracefile.
>
> > It seems to calculate the costs of a full tablescan as 1988.76.
> > Then the different index access paths are calculated which are
> > calculated as 215.78 and 236.68 respectively.
> > At the end to my surprise it says "Best:: AccessPath: TableScan" with
> > cost 1988.76.
>
> > Can someone shed some light on this. Why is the TableScan chosen
> > whereas the index accesses have a lower cost.
>
> > Regards HansP
>
> > (Oracle version 10.2.0.4, optimizer_index_cost_adj = 10)
>
> > SINGLE TABLE ACCESS PATH
> >  -----------------------------------------
> >  BEGIN Single Table Cardinality Estimation
> >  -----------------------------------------
> >  Table: S_ORG_EXT_LSX  Alias: T13
> >    Card: Original: 784404  Rounded: 784404  Computed: 784404.00  Non
> > Adjusted: 784404.00
> >  -----------------------------------------
> >  END   Single Table Cardinality Estimation
> >  -----------------------------------------
> >  Access Path: TableScan
> >    Cost:  1988.76  Resp: 1988.76  Degree: 0
> >      Cost_io: 1947.00  Cost_cpu: 817088980
> >      Resp_io: 1947.00  Resp_cpu: 817088980
> >  ****** trying bitmap/domain indexes ******
> >  Access Path: index (FullScan)
> >    Index: S_ORG_EXT_LSX_P1
> >    resc_io: 2149.00  resc_cpu: 171334375
> >    ix_sel: 1  ix_sel_with_filters: 1
> >    Cost: 215.78  Resp: 215.78  Degree: 0
> >  Access Path: index (FullScan)
> >    Index: S_ORG_EXT_LSX_U1
> >    resc_io: 2358.00  resc_cpu: 172822756
> >    ix_sel: 1  ix_sel_with_filters: 1
> >    Cost: 236.68  Resp: 236.68  Degree: 0
> >  ****** finished trying bitmap/domain indexes ******
> >  Best:: AccessPath: TableScan
> >         Cost: 1988.76  Degree: 1  Resp: 1988.76  Card: 784404.00
> > Bytes: 0
>
> It's often necessary to investigate any odd case in detail,
> version by version of Oracle.
>
> In this case, you have optimizer_index_cost_adj = 10, and
> you can see that your final index costs are 10% (approx)
> of the initial resc_io for the index; and the tablescan cost is
> less than the initial index costs. On top of this, the index
> uses are both FULL SCAN.  The selectivity, in the index
> and at the table, is 1 - i.e. all the data. (And since it's Siebel,
> I wouldn't be surprised if you've also got the optimizer mode
> set to first_rows_10 .... and the first_rows_n optimsations
> always add confusion).
>
> Possibilities -
>
>     first_rows_n may have messed things up
>
>     full scans may be paths where Oracle ignores the
>     optimizer_index_cost_adj when making the final decision.
>
>     the selectivities of 1 throughout may cause Oracle
>     to ignore the optimizer_index_cost_adj when making
>     the final decision.
>
>     you've found a bug
>
> --
> Regards
>
> Jonathan Lewishttp://jonathanlewis.wordpress.com

Thanks for your answer Jonathan,

Well the optimizer_mode of the database is all_rows.
But Siebel sets the optimizer_mode for the sessions to first_rows_10.
That is really messing up the query plan.
It is a 17 table join with a lot of outer joins.

For every table involved it calculates with the cardinality of 11.

Best so far: Table#: 1 cost: 2.0006 card: 11.0000 bytes: 539
Table#: 0 cost: 3.1010 card: 11.0000 bytes: 2783
Table#: 2 cost: 5.1010 card: 11.0000 bytes: 7458
Table#: 3 cost: 7.3020 card: 11.0000 bytes: 7711
Table#: 4 cost: 10.6033 card: 11.0000 bytes: 8382
Table#: 5 cost: 12.8046 card: 10.8637 bytes: 20592
Table#: 6 cost: 13.8046 card: 10.8637 bytes: 20790
Table#: 7 cost: 14.8046 card: 10.8637 bytes: 20988
Table#: 8 cost: 18.1059 card: 10.8637 bytes: 21351
Table#: 9 cost: 20.3068 card: 9.8761 bytes: 19610
Table#:10 cost: 21.3073 card: 9.8761 bytes: 19720
Table#:11 cost: 23.3082 card: 9.8761 bytes: 20500
Table#:12 cost: 24.3091 card: 9.8761 bytes: 21280
Table#:13 cost: 27.3102 card: 9.8761 bytes: 21590
Table#:14 cost: 30.3114 card: 9.8761 bytes: 21880
Table#:15 cost: 31.3119 card: 9.8761 bytes: 22010
Table#:16 cost: 32.3123 card: 9.8761 bytes: 22120

But wanting to have the first 10 rows does not mean that you only need
10 rows from every table involved.
Really anoying.
In this case the query takes about 20 hours with the first_rows_10
optimizer mode and is sub second
without.

Thanks