Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> nested loop anti join vs hash anti join

nested loop anti join vs hash anti join

From: <dbaplusplus_at_hotmail.com>
Date: 27 Mar 2006 19:07:13 -0800
Message-ID: <1143515233.373501.206930@j33g2000cwa.googlegroups.com>


I am using Oracle 9.2.0.5 on HP UNIX 11i. I have a query which was taking 5 and half minutes. It uses not in sub query. Explain plan shows using NESTED LOOP ANTI JOIN. I could not undestand why it was takiing so nong. I added a HASH_AJ hint to not in subquery and my time reduced to 5 seconds (yes 5 seconds). It looks to me some kind of bug in netsed loop anti joins in 9.2.0.5. NL Anti joins are supposed to efficient but they appear to take too much time.

Query:
SELECT ALL os_packet_route_docs_only.r_object_id,

       os_packet_route_docs_only.r_modify_date     FROM os_packet_route_docs_only_sp os_packet_route_docs_only     WHERE os_packet_route_docs_only.subject = 'true'       AND NOT os_packet_route_docs_only.r_object_id IN (SELECT /*+ HASH_AJ */ ALL p.r_object_id

               FROM os_packet_route_docs_only_sp p, dmr_content_sp a,
                    dm_format_sp b
               WHERE a.r_object_id IN (SELECT r_object_id
                          FROM dmr_content_r
                          WHERE parent_id = p.r_object_id)
                 AND b.name = 'pdf'
                 AND a.format = b.r_object_id
                 AND p.i_has_folder = 1
                 AND p.i_is_deleted = 0)
      AND os_packet_route_docs_only.i_has_folder = 1
      AND os_packet_route_docs_only.i_is_deleted = 0;

!

Execution Plan


   0 SELECT STATEMENT Optimizer=CHOOSE (Cost=542 Card=1 Bytes=78)    1 0 HASH JOIN (ANTI) (Cost=542 Card=1 Bytes=78)

   2    1     NESTED LOOPS (Cost=269 Card=1 Bytes=68)
   3    2       NESTED LOOPS (Cost=3 Card=2660 Bytes=90440)
   4    3         INDEX (FULL SCAN) OF 'D_1F00C73D80003D13' (UNIQUE) (
          Cost=19 Card=2660 Bytes=45220)

   5    3         INDEX (UNIQUE SCAN) OF 'D_1F00C73D80003D05' (UNIQUE)
   6    2       TABLE ACCESS (BY INDEX ROWID) OF 'DM_SYSOBJECT_S' (Cos
          t=2 Card=1 Bytes=34)

   7    6         INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000108' (UNIQUE)
   8    1     VIEW OF 'VW_NSO_1' (Cost=272 Card=1 Bytes=10)
   9    8       NESTED LOOPS (Cost=272 Card=1 Bytes=150)
  10    9         NESTED LOOPS (Cost=271 Card=1 Bytes=125)
  11   10           NESTED LOOPS (Cost=270 Card=1 Bytes=91)
  12   11             NESTED LOOPS (Cost=269 Card=1 Bytes=57)
  13   12               NESTED LOOPS (Cost=3 Card=2660 Bytes=90440)
  14   13                 INDEX (FULL SCAN) OF 'D_1F00C73D80003D13' (U
          NIQUE) (Cost=19 Card=2660 Bytes=45220)

  15   13                 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80003D05'

(UNIQUE)
16 12 TABLE ACCESS (BY INDEX ROWID) OF 'DM_SYSOBJECT _S' (Cost=2 Card=1 Bytes=23) 17 16 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000108'
(UNIQUE)
18 11 TABLE ACCESS (BY INDEX ROWID) OF 'DMR_CONTENT_R' (Cost=2 Card=2 Bytes=68) 19 18 INDEX (RANGE SCAN) OF 'D_1F00C73D80000005' (NO N-UNIQUE) (Cost=1 Card=2) 20 10 TABLE ACCESS (BY INDEX ROWID) OF 'DMR_CONTENT_S' ( Cost=2 Card=1 Bytes=34) 21 20 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000159' (UNI QUE) 22 9 TABLE ACCESS (BY INDEX ROWID) OF 'DM_FORMAT_S' (Cost =2 Card=1 Bytes=25) 23 22 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000167' (UNIQU E) real 4.77 user 0.07 sys 0.07 Witout hint, it is using NL anti join: 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=541 Card=1 Bytes=78) 1 0 NESTED LOOPS (ANTI) (Cost=541 Card=1 Bytes=78) 2 1 NESTED LOOPS (Cost=269 Card=1 Bytes=68) 3 2 NESTED LOOPS (Cost=3 Card=2660 Bytes=90440) 4 3 INDEX (FULL SCAN) OF 'D_1F00C73D80003D13' (UNIQUE) ( Cost=19 Card=2660 Bytes=45220) 5 3 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80003D05' (UNIQUE) 6 2 TABLE ACCESS (BY INDEX ROWID) OF 'DM_SYSOBJECT_S' (Cos t=2 Card=1 Bytes=34) 7 6 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000108' (UNIQUE) 8 1 VIEW OF 'VW_NSO_1' (Cost=272 Card=1 Bytes=10) 9 8 NESTED LOOPS (Cost=272 Card=1 Bytes=150) 10 9 NESTED LOOPS (Cost=271 Card=1 Bytes=125) 11 10 NESTED LOOPS (Cost=270 Card=1 Bytes=91) 12 11 NESTED LOOPS (Cost=269 Card=1 Bytes=57) 13 12 NESTED LOOPS (Cost=3 Card=2660 Bytes=90440) 14 13 INDEX (FULL SCAN) OF 'D_1F00C73D80003D13' (U NIQUE) (Cost=19 Card=2660 Bytes=45220) 15 13 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80003D05'
(UNIQUE)
16 12 TABLE ACCESS (BY INDEX ROWID) OF 'DM_SYSOBJECT _S' (Cost=2 Card=1 Bytes=23) _S' (Cost=2 Card=1 Bytes=23) 17 16 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000108'
(UNIQUE)
18 11 TABLE ACCESS (BY INDEX ROWID) OF 'DMR_CONTENT_R' (Cost=2 Card=2 Bytes=68) 19 18 INDEX (RANGE SCAN) OF 'D_1F00C73D80000005' (NO N-UNIQUE) (Cost=1 Card=2) 20 10 TABLE ACCESS (BY INDEX ROWID) OF 'DMR_CONTENT_S' ( Cost=2 Card=1 Bytes=34) 21 20 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000159' (UNI QUE) 22 9 TABLE ACCESS (BY INDEX ROWID) OF 'DM_FORMAT_S' (Cost =2 Card=1 Bytes=25) 23 22 INDEX (UNIQUE SCAN) OF 'D_1F00C73D80000167' (UNIQU E) real 5:39.28 user 0.07 sys 0.05
Received on Mon Mar 27 2006 - 21:07:13 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US