Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> nested loop anti join vs hash anti join
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'Received on Mon Mar 27 2006 - 21:07:13 CST
(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