| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: EXPLAIN PLAN : better with RULE!
"Jonathan Lewis" <jonathan_at_jlcomp.demon.co.uk> wrote in message
news:1027008539.1355.1.nnrp-01.9e984b29_at_news.demon.co.uk...
>
> Oh dear -
> I have to contradict you twice in one day.
>
> Having done a bit of stress-testing and generally
> having fun with the optimisers, I can tell you that
> one test involving 255 tables gave me an optimisation
> time of:
> Rule 45 minutes 22 seconds
> all_rows 3.04 seconds
> first_rows 3.04 seconds
>
>
> The CBO usually finds optimal paths in complex
> joins despite the best efforts of designers and
> dbas to confuse the issue with unsuitable indexing
> strategies, inappropriate statistics, and misleading
> resource definitions.
>
> --
> Jonathan Lewis
> http://www.jlcomp.demon.co.uk
Well, I'm still struggling to figure out why RBO typically beats CBO on our system. Below is a typical example. The query runs nicely with simple nested loops, but CBO never seems smart enough to figure that out.
In the example below, I've reversed the order of the tables in the FROM clause from RBO to CBO.
Some of my parameters are:
optimizer_index_cost_adj: 100
optimizer_index_caching: 0
db_file_multiblock_read_count: 32
db_block_size: 16384
Thanks for any insight.
--steve
company_24_at_dilbert>
company_24_at_dilbert> SELECT
2 count(*)
3 FROM
4 Ic_Product_Id ProdId,
5 Fc_Unit_Of_Measure UOM,
6 Ic_Product Prod,
7 Fc_Unit_Of_Measure PUOM,
8 Ic_Ps_Size PSize,
9 Ic_Product_Produce ProdP,
10 Fc_Name_Location Loc,
11 Ga_Lot Lot,
12 Ga_Block Block,
13 Ic_Tag Tag,
14 Ic_Warehouse,
15 Ic_Inventory IC,
16 Ar_Trx_Product IProd,
17 Ar_Trx_Detail IDtl,
18 Ar_Trx_Line IL,
19 AR_TRX_HEADER_SHIP,
20 Ar_Trx_Header
21 WHERE
22 IL.ArTrxLineTrxType = '1' AND
23 IL.LineType = '1' AND
24 IProd.FillType IN ('2','7') AND
25 IDtl.GLDELETECODE = 'N' AND
26 IDtl.ArTrxHdrIdx = IL.ArTrxHdrIdx AND
27 IDtl.ArTrxLineSeq = IL.ArTrxLineSeq AND
28 IDtl.ArTrxLineTrxType = IL.ArTrxLineTrxType AND
29 IProd.ArTrxHdrIdx = IDtl.ArTrxHdrIdx AND
30 IProd.ArTrxDtlSeq = IDtl.ArTrxDtlSeq AND
31 IDtl.ShipHdrIdx = AR_TRX_HEADER_SHIP.ShipHdrIdx AND
32 IC.ProductIdx = Prod.ProductIdx (+) AND
33 ProdId.ProductIdx = IC.ProductIdx AND
34 IC.ProductIdx = ProdP.ProductIdx (+) AND
35 ProdP.SizeIdx = PSize.SizeIdx (+) AND
36 UOM.UomIdx (+) = Prod.UomIdx AND
37 PUOM.UomIdx (+) = PSize.UomIdx AND
38 IProd.InventoryIdx = IC.InventoryIdx AND
39 IC.TagIdx = Tag.TagIdx AND
40 IC.WarehouseIdx = IC_WAREHOUSE.WarehouseIdx AND
41 IC_WAREHOUSE.NameIdx = Loc.NameIdx AND
42 IC_WAREHOUSE.NameLocationSeq = Loc.NameLocationSeq AND
43 IC.GaLotIdx = Lot.GaLotIdx (+) AND
44 IC.GaBlockIdx = Block.GaBlockIdx (+) AND
45 AR_TRX_HEADER_SHIP.artrxhdridx = AR_TRX_HEADER.artrxhdridx AND
46 IL.ArTrxHdrIdx = AR_TRX_HEADER.ArTrxHdrIdx AND
47 AR_TRX_HEADER.SOSTATUS >= '6' AND
48 ( AR_TRX_HEADER.SHIPDATETIME BETWEEN TO_DATE('02/01/2002 04:00:00',
'MM/DD/YYYY HH24:MI:SS') AND TO_DATE('02/28/2002 03:59:59', 'MM/DD/YYYY
HH24:MI:SS') ) AND
COUNT(*)
13286
Execution Plan
0 SELECT STATEMENT Optimizer=RULE 1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS
3 2 NESTED LOOPS (OUTER)
4 3 NESTED LOOPS (OUTER)
5 4 NESTED LOOPS (OUTER)
6 5 NESTED LOOPS (OUTER)
7 6 NESTED LOOPS (OUTER)
8 7 NESTED LOOPS
9 8 NESTED LOOPS (OUTER)
10 9 NESTED LOOPS (OUTER)
11 10 NESTED LOOPS
12 11 NESTED LOOPS
13 12 NESTED LOOPS
14 13 NESTED LOOPS
15 14 NESTED LOOPS
16 15 NESTED LOOPS
17 16 NESTED LOOPS
18 17 TABLE ACCESS (BY INDEX R
OWID) OF 'AR_TRX_HEADER'
19 18 INDEX (RANGE SCAN) OF
'XIE4AR_TRX_HEADER' (NON-UNIQUE)
20 17 TABLE ACCESS (BY INDEX R
OWID) OF 'AR_TRX_HEADER_SHIP'
21 20 INDEX (RANGE SCAN) OF
'XIF6902AR_TRX_HEADER_SHIP' (NON-UNIQUE)
22 16 TABLE ACCESS (BY INDEX ROW
ID) OF 'AR_TRX_LINE'
23 22 INDEX (RANGE SCAN) OF 'X
IF6095AR_TRX_LINE' (NON-UNIQUE)
24 15 TABLE ACCESS (BY INDEX ROWID
) OF 'AR_TRX_DETAIL'
25 24 INDEX (RANGE SCAN) OF 'XIF
6010AR_TRX_DETAIL' (NON-UNIQUE)
26 14 TABLE ACCESS (BY INDEX ROWID)
OF 'AR_TRX_PRODUCT'
27 26 INDEX (UNIQUE SCAN) OF 'XPKA
R_TRX_PRODUCT' (UNIQUE)
28 13 TABLE ACCESS (BY INDEX ROWID) OF
'IC_INVENTORY'
29 28 INDEX (UNIQUE SCAN) OF 'XPKIC_
INVENTORY' (UNIQUE)
30 12 TABLE ACCESS (BY INDEX ROWID) OF '
IC_WAREHOUSE'
31 30 INDEX (UNIQUE SCAN) OF 'XPKIC_WA
REHOUSE' (UNIQUE)
32 11 INDEX (UNIQUE SCAN) OF 'XPKIC_TAG' (
UNIQUE)
33 10 INDEX (UNIQUE SCAN) OF 'XPKGA_BLOCK' (
UNIQUE)
34 9 INDEX (UNIQUE SCAN) OF 'XPKGA_LOT' (UNIQ
UE)
35 8 INDEX (UNIQUE SCAN) OF 'XPKFC_NAME_LOCATIO
N' (UNIQUE)
36 7 TABLE ACCESS (BY INDEX ROWID) OF 'IC_PRODUCT
_PRODUCE'
37 36 INDEX (UNIQUE SCAN) OF 'XPKIC_PRODUCT_PROD
UCE' (UNIQUE)
38 6 TABLE ACCESS (BY INDEX ROWID) OF 'IC_PS_SIZE'
39 38 INDEX (UNIQUE SCAN) OF 'XPKIC_PS_SIZE' (UNIQ
UE)
40 5 INDEX (UNIQUE SCAN) OF 'XPKFC_UNIT_OF_MEASURE' (
UNIQUE)
41 4 TABLE ACCESS (BY INDEX ROWID) OF 'IC_PRODUCT'
42 41 INDEX (UNIQUE SCAN) OF 'XPKIC_PRODUCT' (UNIQUE)
43 3 INDEX (UNIQUE SCAN) OF 'XPKFC_UNIT_OF_MEASURE' (UNIQ
UE)
44 2 INDEX (UNIQUE SCAN) OF 'XPKIC_PRODUCT_ID' (UNIQUE)
Statistics
0 recursive calls
0 db block gets
1036744 consistent gets
0 physical reads
0 redo size
369 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
company_24_at_dilbert>
4 Ar_Trx_Header,
5 AR_TRX_HEADER_SHIP,
6 Ar_Trx_Line IL,
7 Ar_Trx_Detail IDtl,
8 Ar_Trx_Product IProd,
9 Ic_Inventory IC,
10 Ic_Warehouse,
11 Ic_Tag Tag,
12 Ga_Block Block,
13 Ga_Lot Lot,
14 Fc_Name_Location Loc,
15 Ic_Product_Produce ProdP,
16 Ic_Ps_Size PSize,
17 Fc_Unit_Of_Measure PUOM,
18 Ic_Product Prod,
19 Fc_Unit_Of_Measure UOM,
20 Ic_Product_Id ProdId
21 WHERE
22 IL.ArTrxLineTrxType = '1' AND
23 IL.LineType = '1' AND
24 IProd.FillType IN ('2','7') AND
25 IDtl.GLDELETECODE = 'N' AND
26 IDtl.ArTrxHdrIdx = IL.ArTrxHdrIdx AND
27 IDtl.ArTrxLineSeq = IL.ArTrxLineSeq AND
28 IDtl.ArTrxLineTrxType = IL.ArTrxLineTrxType AND
29 IProd.ArTrxHdrIdx = IDtl.ArTrxHdrIdx AND
30 IProd.ArTrxDtlSeq = IDtl.ArTrxDtlSeq AND
31 IDtl.ShipHdrIdx = AR_TRX_HEADER_SHIP.ShipHdrIdx AND
32 IC.ProductIdx = Prod.ProductIdx (+) AND
33 ProdId.ProductIdx = IC.ProductIdx AND
34 IC.ProductIdx = ProdP.ProductIdx (+) AND
35 ProdP.SizeIdx = PSize.SizeIdx (+) AND
36 UOM.UomIdx (+) = Prod.UomIdx AND
37 PUOM.UomIdx (+) = PSize.UomIdx AND
38 IProd.InventoryIdx = IC.InventoryIdx AND
39 IC.TagIdx = Tag.TagIdx AND
40 IC.WarehouseIdx = IC_WAREHOUSE.WarehouseIdx AND
41 IC_WAREHOUSE.NameIdx = Loc.NameIdx AND
42 IC_WAREHOUSE.NameLocationSeq = Loc.NameLocationSeq AND
43 IC.GaLotIdx = Lot.GaLotIdx (+) AND
44 IC.GaBlockIdx = Block.GaBlockIdx (+) AND
45 AR_TRX_HEADER_SHIP.artrxhdridx = AR_TRX_HEADER.artrxhdridx AND
46 IL.ArTrxHdrIdx = AR_TRX_HEADER.ArTrxHdrIdx AND
47 AR_TRX_HEADER.SOSTATUS >= '6' AND
48 ( AR_TRX_HEADER.SHIPDATETIME BETWEEN TO_DATE('02/01/2002 04:00:00',
'MM/DD/YYYY HH24:MI:SS') AND TO_DATE('02/28/2002 03:59:59', 'MM/DD/YYYY
HH24:MI:SS') ) AND
COUNT(*)
13286
Execution Plan
0 SELECT STATEMENT Optimizer=HINT: CHOOSE (Cost=9069 Card=1 By
tes=176)
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS (Cost=9069 Card=1 Bytes=176)
3 2 NESTED LOOPS (OUTER) (Cost=9069 Card=1 Bytes=171)
4 3 NESTED LOOPS (OUTER) (Cost=9069 Card=1 Bytes=168)
5 4 NESTED LOOPS (OUTER) (Cost=9068 Card=1 Bytes=161)
6 5 NESTED LOOPS (Cost=9067 Card=1 Bytes=153)
7 6 HASH JOIN (Cost=9062 Card=5 Bytes=715)
8 7 TABLE ACCESS (FULL) OF 'AR_TRX_HEADER' (Cost
=17 Card=310 Bytes=5270)
9 7 HASH JOIN (Cost=9043 Card=122 Bytes=15372)
10 9 TABLE ACCESS (FULL) OF 'AR_TRX_LINE' (Cost
=18 Card=9743 Bytes=116916)
11 9 MERGE JOIN (Cost=8856 Card=11541 Bytes=131
5674)
12 11 SORT (JOIN) (Cost=8036 Card=102703 Bytes
=9859488)
13 12 NESTED LOOPS (Cost=3295 Card=102703 By
tes=9859488)
14 13 MERGE JOIN (Cost=3295 Card=102703 By
tes=9448676)
15 14 SORT (JOIN) (Cost=2628 Card=68875
Bytes=5234500)
16 15 NESTED LOOPS (OUTER) (Cost=54 Ca
rd=68875 Bytes=5234500)
17 16 NESTED LOOPS (OUTER) (Cost=54
Card=68875 Bytes=4959000)
18 17 NESTED LOOPS (OUTER) (Cost=5
4 Card=68875 Bytes=4683500)
19 18 NESTED LOOPS (OUTER) (Cost
=54 Card=68875 Bytes=4476875)
20 19 HASH JOIN (Cost=54 Card=
68875 Bytes=2686125)
21 20 NESTED LOOPS (Cost=1 C
ard=28 Bytes=448)
22 21 TABLE ACCESS (FULL)
OF 'IC_WAREHOUSE' (Cost=1 Card=28 Bytes=252)
23 21 INDEX (UNIQUE SCAN)
OF 'XPKFC_NAME_LOCATION' (UNIQUE)
24 20 TABLE ACCESS (FULL) OF
'IC_INVENTORY' (Cost=19 Card=68875 Bytes=1584125)
25 19 TABLE ACCESS (BY INDEX R
OWID) OF 'IC_PRODUCT'
26 25 INDEX (UNIQUE SCAN) OF
'XPKIC_PRODUCT' (UNIQUE)
27 18 INDEX (UNIQUE SCAN) OF 'XP
KFC_UNIT_OF_MEASURE' (UNIQUE)
28 17 INDEX (UNIQUE SCAN) OF 'XPKG
A_BLOCK' (UNIQUE)
29 16 INDEX (UNIQUE SCAN) OF 'XPKGA_
LOT' (UNIQUE)
30 14 SORT (JOIN) (Cost=667 Card=74785 B
ytes=1196560)
31 30 TABLE ACCESS (FULL) OF 'AR_TRX_P
RODUCT' (Cost=27 Card=74785 Bytes=1196560)
32 13 INDEX (UNIQUE SCAN) OF 'XPKIC_PRODUC
T_ID' (UNIQUE)
33 11 SORT (JOIN) (Cost=821 Card=70293 Bytes=1
265274)
34 33 TABLE ACCESS (FULL) OF 'AR_TRX_DETAIL'
(Cost=174 Card=70293 Bytes=1265274)
35 6 TABLE ACCESS (BY INDEX ROWID) OF 'AR_TRX_HEADE
R_SHIP' (Cost=1 Card=18292 Bytes=182920)
36 35 INDEX (UNIQUE SCAN) OF 'XPKAR_TRX_HEADER_SHI
P' (UNIQUE)
37 5 TABLE ACCESS (BY INDEX ROWID) OF 'IC_PRODUCT_PRO
DUCE' (Cost=1 Card=4454 Bytes=35632)
38 37 INDEX (UNIQUE SCAN) OF 'XPKIC_PRODUCT_PRODUCE'
(UNIQUE)
39 4 TABLE ACCESS (BY INDEX ROWID) OF 'IC_PS_SIZE' (Cos
t=1 Card=1272 Bytes=8904)
40 39 INDEX (UNIQUE SCAN) OF 'XPKIC_PS_SIZE' (UNIQUE)
41 3 INDEX (UNIQUE SCAN) OF 'XPKFC_UNIT_OF_MEASURE' (UNIQ
UE)
42 2 INDEX (UNIQUE SCAN) OF 'XPKIC_TAG' (UNIQUE)
Statistics
40 recursive calls
1163 db block gets
443855 consistent gets
24159 physical reads
0 redo size
369 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
4 sorts (disk)
1 rows processed
company_24_at_dilbert> Received on Thu Jul 18 2002 - 17:18:07 CDT
![]() |
![]() |