Re: CBO - hash join vs nested loops

I'm missing somethink. I answered too quickly, without verifing the result. The 
NL access choosen does the same lio as the hash join and the hinted version is 
always different:


20:05:24 SQL> select count(distinct fdc.cbv_code)
20:05:33   2  from filtro_dati_catalogo fdc
inner join opt_vp vo on fdc.id_subcatalogo in (0)
and vo.codice_opt = 29 and fdc.pv_code = vo.pv_code20:05:33   3  20:05:33   4  ;

COUNT(DISTINCTFDC.CBV_CODE)
---------------------------
                         29

Elapsed: 00:00:00.93

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=409 Card=1 Bytes=46)
   1    0   SORT (GROUP BY)
   2    1     NESTED LOOPS (Cost=409 Card=2076 Bytes=95496)
   3    2       INDEX (FAST FULL SCAN) OF 'XIF01FILTRO_DATI_CATALOGO'
          (UNIQUE) (Cost=409 Card=424315 Bytes=11456505)

   4    2       INDEX (UNIQUE SCAN) OF 'SYS_IOT_TOP_14178' (UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       4276  consistent gets
          0  physical reads
          0  redo size
        510  bytes sent via SQL*Net to client
        655  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

20:05:35 SQL> select /*+ USE_NL(fdc vo) */ count(distinct fdc.cbv_code)
20:05:44   2  from filtro_dati_catalogo fdc
inner join opt_vp vo on fdc.id_subcatalogo in (0)
and vo.codice_opt = 29 and fdc.pv_code = vo.pv_code20:05:44   3  20:05:44   4  ;

COUNT(DISTINCTFDC.CBV_CODE)
---------------------------
                         29

Elapsed: 00:00:00.56

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=409 Card=1 Bytes=46)
   1    0   SORT (GROUP BY)
   2    1     NESTED LOOPS (Cost=409 Card=2076 Bytes=95496)
   3    2       INDEX (FAST FULL SCAN) OF 'XIF01FILTRO_DATI_CATALOGO'
          (UNIQUE) (Cost=409 Card=424315 Bytes=11456505)

   4    2       INDEX (UNIQUE SCAN) OF 'SYS_IOT_TOP_14178' (UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       3088  consistent gets
          0  physical reads
          0  redo size
        510  bytes sent via SQL*Net to client
        655  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

20:05:46 SQL> alter session set optimizer_index_caching=10;

Session altered.

Elapsed: 00:00:00.00
20:05:52 SQL> select count(distinct fdc.cbv_code)
20:06:05   2  from filtro_dati_catalogo fdc
inner join opt_vp vo on fdc.id_subcatalogo in (0)
and vo.codice_opt = 29 and fdc.pv_code = vo.pv_code20:06:05   3  20:06:05   4  ;

COUNT(DISTINCTFDC.CBV_CODE)
---------------------------
                         29

Elapsed: 00:00:00.94

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=409 Card=1 Bytes=46)
   1    0   SORT (GROUP BY)
   2    1     NESTED LOOPS (Cost=409 Card=2076 Bytes=95496)
   3    2       INDEX (FAST FULL SCAN) OF 'XIF01FILTRO_DATI_CATALOGO'
          (UNIQUE) (Cost=409 Card=424315 Bytes=11456505)

   4    2       INDEX (UNIQUE SCAN) OF 'SYS_IOT_TOP_14178' (UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       4276  consistent gets
          0  physical reads
          0  redo size
        510  bytes sent via SQL*Net to client
        655  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed



Regards,
Dimitre Radoulov

Other related posts: