Re: optimizer_ ???
- From: "jaromir nemec" <jaromir@xxxxxxxxxxxx>
- To: <Christian.Antognini@xxxxxxxxxxxx>, "Peter Alteheld" <palteheld@xxxxxxxx>, "Niall Litchfield" <niall.litchfield@xxxxxxxxx>
- Date: Fri, 29 Apr 2005 00:28:27 +0200
Hi Chris,
nice example with a precise explanation. But the most important thing, as
you wrote..
> .. it's not a problem to show whatever you want...
So I have a small addendum to your example to illustrate the opposite side
of the problem.
It takes not too much effort to find an select where the same change of the
OIC has negative effect. The idea behind this is simple: assuming that index
access cost nearly nothing doesn't scale to infinity.
Note that I simple inverted your example (small table gets large, large
table small, index is chosen so that hash join is OK, the OIC change is
overkill).
Of course the ratio of elapsed time is not so sharp as in your example (both
select are not acceptable in OLTP) but in case of batch processing this
should be taken in account.
Regards,
Jaromir D.B. Nemec
-----
SQL> CREATE TABLE t1 (col1, col2) TABLESPACE lab1 AS
2 SELECT rownum*20, rownum FROM dual connect by 1= 1 and level <=
2000000;
Table created.
Elapsed: 00:00:18.68
SQL> CREATE TABLE t2 (col1, col2, col3) TABLESPACE lab1 PCTFREE 90 PCTUSED
2 10 AS
3 SELECT mod(floor(rownum/2),25000), mod(floor(rownum/2),25000),
4 rpad('-',50,'-')
5 FROM dual connect by 1= 1 and level <= 160000;
Table created.
Elapsed: 00:00:22.35
SQL> --
SQL> CREATE INDEX large_i ON t2 (col1, col2) TABLESPACE lab1 COMPRESS;
Index created.
Elapsed: 00:00:26.30
SQL> --
SQL> exec dbms_stats.gather_table_stats(ownname=>user, tabname=>'T1');
PL/SQL procedure successfully completed.
Elapsed: 00:00:45.60
SQL> exec dbms_stats.gather_table_stats(ownname=>user,
tabname=>'T2',cascade=>TRUE);
PL/SQL procedure successfully completed.
Elapsed: 00:00:21.23
SQL> ---
SQL> set autotrace on
SQL> ALTER SESSION SET OPTIMIZER_INDEX_CACHING=0;
Session altered.
Elapsed: 00:00:00.02
SQL> SELECT count(s.col2), count(l.col1)
2 FROM t1 s, t2 l
3 WHERE s.col1 = l.col1(+) AND l.col2(+) = 50;
COUNT(S.COL2) COUNT(L.COL1)
------------- -------------
2000000 0
Elapsed: 00:00:18.37
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1416 Card=1 Bytes=21
)
1 0 SORT (AGGREGATE)
2 1 HASH JOIN (OUTER) (Cost=1416 Card=2000000 Bytes=42000000
)
3 2 TABLE ACCESS (FULL) OF 'T1' (Cost=249 Card=2000000 Byt
es=22000000)
4 2 INDEX (FAST FULL SCAN) OF 'LARGE_I' (NON-UNIQUE) (Cost
=18 Card=6 Bytes=60)
Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
2390 consistent gets
4598 physical reads
0 redo size
447 bytes sent via SQL*Net to client
499 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> ALTER SESSION SET OPTIMIZER_INDEX_CACHING=90;
Session altered.
Elapsed: 00:00:00.00
SQL> SELECT count(s.col2), count(l.col1)
2 FROM t1 s, t2 l
3 WHERE s.col1 = l.col1(+) AND l.col2(+) = 50;
COUNT(S.COL2) COUNT(L.COL1)
------------- -------------
2000000 0
Elapsed: 00:00:28.02
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=435 Card=1 Bytes=21)
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS (OUTER) (Cost=435 Card=2000000 Bytes=420000
00)
3 2 TABLE ACCESS (FULL) OF 'T1' (Cost=249 Card=2000000 Byt
es=22000000)
4 2 INDEX (RANGE SCAN) OF 'LARGE_I' (NON-UNIQUE) (Cost=1 C
ard=1 Bytes=10)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2002235 consistent gets
2199 physical reads
0 redo size
447 bytes sent via SQL*Net to client
499 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> quit;
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production
----- Original Message -----
From: "Christian Antognini" <Christian.Antognini@xxxxxxxxxxxx>
To: "Peter Alteheld" <palteheld@xxxxxxxx>; "Niall Litchfield"
<niall.litchfield@xxxxxxxxx>
Cc: <oracle-l@xxxxxxxxxxxxx>
Sent: Wednesday, April 27, 2005 11:47 PM
Subject: RE: optimizer_ ???
--
http://www.freelists.org/webpage/oracle-l
- References:
- RE: optimizer_ ???
- From: Christian Antognini
Other related posts:
- » optimizer_ ???
- » RE: optimizer_ ???
- » Re: optimizer_ ???
- » Re: optimizer_ ???
- » RE: optimizer_ ???
- » Re: optimizer_ ???
- » Re: optimizer_ ???
- » RE: optimizer_ ???
- » RE: optimizer_ ???
- » RE: optimizer_ ???
- » RE: optimizer_ ???
- » Re: optimizer_ ???
- » Re: optimizer_ ???
- » RE: optimizer_ ???
- » Re: optimizer_ ???
- » Re: optimizer_ ???
- » Re: optimizer_ ???
- » RE: optimizer_ ???
- » RE: optimizer_ ???
- » Re: optimizer_ ???
- » RE: optimizer_ ???
- » RE: optimizer_ ???
- » Re: optimizer_ ???
- RE: optimizer_ ???
- From: Christian Antognini