Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> why rule based optimizer performs better than cost based?
Oracle 8173 on Sun Solaris 2.8
All application tables and indexes have been analyzed using:
execute DBMS_STATS.GATHER_TABLE_STATS('MT','TABLE_NAME',cascade => FALSE); execute DBMS_STATS.GATHER_INDEX_STATS('MT','INDEX_NAME');
I found one query that runs faster when hint /*+ rule */ is added. It basically uses indexes on table diseasemodels and observationdetails. When cost based (default) optimizer is used, oracle does full table scan on these two tables, which make the query run slower (from Elapsed time measurement). I am curious why here the "rule based" optimizer performas better than "cost based".
TIA. Guang
Here are the query (with results) and the definition of the tables:
select /*+ rule */
distinct name, evidence, seeflag, referenceid, category2gene.id cid, d.mnemonic meshid
NAME
- - ----------- ---------- ---------------- Cataract E N 58814 843529 D002386 Cataract E N 58814 843532 D002386
Elapsed: 00:00:00.43
Execution Plan
0 SELECT STATEMENT Optimizer=HINT: RULE 1 0 SORT (UNIQUE)
2 1 FILTER 3 2 NESTED LOOPS (OUTER) 4 3 NESTED LOOPS 5 4 NESTED LOOPS 6 5 TABLE ACCESS (BY INDEX ROWID) OF 'CATEGORY2GENE' 7 6 INDEX (RANGE SCAN) OF 'CATEGORY2GENE_GENEID_IN DEX' (NON-UNIQUE) 8 5 TABLE ACCESS (BY INDEX ROWID) OF 'OBSERVATIONDET AILS' 9 8 INDEX (RANGE SCAN) OF 'OBSDETAILS_C2GID_INDEX' (NON-UNIQUE) 10 4 TABLE ACCESS (BY INDEX ROWID) OF 'DISEASEMODELS' 11 10 INDEX (RANGE SCAN) OF 'DMODELS_PDID_INDEX' (NON- UNIQUE) 12 3 TABLE ACCESS (BY INDEX ROWID) OF 'CATEGORY' 13 12 INDEX (RANGE SCAN) OF 'CATEGORY_STRING_INDEX' (NON -UNIQUE)
Statistics
0 recursive calls 0 db block gets 78 consistent gets 0 physical reads 0 redo size 752 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 2 rows processed
select
distinct name, evidence, seeflag, referenceid, category2gene.id cid, d.mnemonic meshid
NAME
- - ----------- ---------- ---------------- Cataract E N 58814 843529 D002386 Cataract E N 58814 843532 D002386
Elapsed: 00:00:00.64
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=153 Card=5 Bytes=665 ) 1 0 SORT (UNIQUE) (Cost=100 Card=5 Bytes=665) 2 1 FILTER 3 2 NESTED LOOPS (OUTER) 4 3 HASH JOIN (Cost=32 Card=5 Bytes=250) 5 4 TABLE ACCESS (BY INDEX ROWID) OF 'CATEGORY2GENE' ( Cost=11 Card=13 Bytes=247) 6 5 INDEX (RANGE SCAN) OF 'CATEGORY2GENE_GENEID_INDE X' (NON-UNIQUE) (Cost=3 Card=13) 7 4 HASH JOIN (Cost=20 Card=16107 Bytes=499317) 8 7 TABLE ACCESS (FULL) OF 'DISEASEMODELS' (Cost=4 C ard=5765 Bytes=132595) 9 7 TABLE ACCESS (FULL) OF 'OBSERVATIONDETAILS' (Cos t=14 Card=42946 Bytes=343568) 10 3 TABLE ACCESS (BY INDEX ROWID) OF 'CATEGORY' (Cost=3 Card=75859 Bytes=6296297) 11 10 INDEX (RANGE SCAN) OF 'CATEGORY_STRING_INDEX' (NON -UNIQUE) (Cost=2 Card=75859)
Statistics
0 recursive calls 8 db block gets 140 consistent gets 0 physical reads 0 redo size 752 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 2 rows processed MT_at_max-SQL> desc diseasemodels Name Null? Type ----------------------------------------- -------- ------------------------
----
PHENOTYPEDETAILSID NOT NULL NUMBER NAME VARCHAR2(2000) MT_at_max-SQL> desc observationdetails; Name Null? Type ----------------------------------------- -------- ------------------------
----
CATEGORY2GENEID NOT NULL NUMBER PHENOTYPEDETAILSID NOT NULL NUMBER MT_at_max-SQL> desc category2gene Name Null? Type ----------------------------------------- -------- ------------------------
----
ID NOT NULL NUMBER CATEGORYID NOT NULL NUMBER GENEID NOT NULL NUMBER CURID NOT NULL NUMBER NOTFLAG CHAR(1) CCOMMENT VARCHAR2(300) EVIDENCE CHAR(1) SEEFLAG NOT NULL CHAR(1) REFERENCEID NUMBER METHOD VARCHAR2(128) SEQTABID NUMBER PROPDATE DATE MT_at_max-SQL> desc category; Name Null? Type ----------------------------------------- -------- ------------------------
----
ID NOT NULL NUMBER STATUS NOT NULL VARCHAR2(16) CATEGORYTYPE NOT NULL VARCHAR2(16) STRING VARCHAR2(240) MNEMONIC VARCHAR2(16) NUMERIC NUMBER
-- Archives are at http://www.freelists.org/archives/oracle-l/ FAQ is at http://www.freelists.org/help/fom-serve/cache/1.htmlReceived on Fri Jun 25 2004 - 09:53:05 CDT
-----------------------------------------------------------------
![]() |
![]() |