| 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'
(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
![]() |
![]() |