Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.tools -> Is this an bug in Oracle's SQL compiler
Server 8.1.6.2
We have an SQL statement that returns a row using the rule based optimiser but not with the cost based optimiser (IMO that's a bug). Below is the SQL and the explain. It should return a row.
It seems to be related to the FIRST ROW RANGE SCAN MAX/MIN in the explain.
Has anyone come across this problem or had a similar experience?
SQL> SELECT min(clientn)
2 FROM clf_client_ref cr1
3 WHERE refn = 'G24G039440'
4 AND ref_type = 'G '
5 AND clientn IN (
6 SELECT clientn
7 FROM clf_client_ref cr2
8 /* WHERE clientn in ('C24D034037','C24D034037','C24J039440') */
9 WHERE clientn = cr1.clientn
10 AND ( ref_type = 'SO'
11 OR ( ref_type = 'PH'
12 AND not exists ( 13 SELECT ROWID 14 FROM clf_client_ref 15 WHERE ref_type = 'SO' 16 AND clientn = cr2.clientn 17 ) 18 )
MIN(CLIENT
SQL> set autot trace explain
SQL> /
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=1 Bytes=34) 1 0 SORT (AGGREGATE)
2 1 FILTER 3 2 NESTED LOOPS (Cost=8 Card=1 Bytes=34) 4 3 TABLE ACCESS (BY INDEX ROWID) OF 'CLIENT_REF' (Cost= 1 Card=21 Bytes=462) 5 4 INDEX (RANGE SCAN) OF 'CLIENT_REF_IDX1' (NON-UNIQU E) (Cost=3 Card=21) 6 3 FIRST ROW (Cost=3 Card=534607 Bytes=6415284) 7 6 INDEX (RANGE SCAN (MIN/MAX)) OF 'PK_CLIENT_REF' (U NIQUE) (Cost=3 Card=534607) 8 2 INDEX (RANGE SCAN) OF 'PK_CLIENT_REF' (UNIQUE) (Cost=3 Card=1 Bytes=12)
SQL> SELECT /*+rule */ min(clientn)
2 FROM clf_client_ref cr1
3 WHERE refn = 'G24G039440'
4 AND ref_type = 'G '
5 AND clientn IN (
6 SELECT clientn
7 FROM clf_client_ref cr2
8 /* WHERE clientn in ('C24D034037','C24D034037','C24J039440') */
9 WHERE clientn = cr1.clientn
10 AND ( ref_type = 'SO'
11 OR ( ref_type = 'PH'
12 AND not exists ( 13 SELECT ROWID 14 FROM clf_client_ref 15 WHERE ref_type = 'SO' 16 AND clientn = cr2.clientn 17 ) 18 )
Execution Plan
0 SELECT STATEMENT Optimizer=HINT: RULE 1 0 SORT (AGGREGATE)
2 1 FILTER 3 2 NESTED LOOPS 4 3 TABLE ACCESS (BY INDEX ROWID) OF 'CLIENT_REF' 5 4 INDEX (RANGE SCAN) OF 'CLIENT_REF_IDX1' (NON-UNIQU E) 6 3 INDEX (RANGE SCAN) OF 'PK_CLIENT_REF' (UNIQUE) 7 2 INDEX (RANGE SCAN) OF 'PK_CLIENT_REF' (UNIQUE)
SQL> set autot off
SQL> /
MIN(CLIENT