OJNK? Your term Larry? Or do I need to RTFM?
Didn't realize this had a name. Jared On Wednesday 26 June 2002 18:48, Larry Elkins wrote: > Greg, > > When the situation is appropriate, and I don't want a correlated approach, > I will typically use the hash aj as illustrated by your second example, the > NOT IN using a hash aj. That's my preference, when correlation is not > appropriate. And I work with some DB's where always_anti_join is set to > hash and don't even have to use the HASH_AJ hint, *if* the conditions for > using a hash aj are met. > > And that's where the beauty of the first approach comes in. Suppose the > query is such that you *don't* want it correlated, and the conditions for > using a hash aj *can't* be met, you can use the first approach, and force a > hash join (outer) if required. You will often times get similar performance > as the hash aj. For example, if you forced a hash join via hints in your > first example, the OJNK approach (outer join null key, pronounced "O Junk", > no need for a GNU discussion) might provide very similar results as the > hash aj approach. And that's when I use the OJNK approach, when I want a > hash type of join, but the conditions for using a hash aj can't be met. > That is its real strength. I avoid the OJNK approach otherwise simply > because some will be confused by the coding, not realizing an anti-join is > being performed. And yes, you can include comments saying so, but some > folks will still mistake its purpose ;-) > > Anyway, here is an example similar to yours, but I forced a hash join when > using the OJNK approach. But I'm with you, I lean towards using the > HASH_AJ, when appropriate, over the OJNK approach, but mileage varies, not > one size fits all, fill in your favorite cliché here. Just wanted to point > out that the OJNK approach can be a *savior* when the conditions for a hash > aj being used can't be met and a correlated approach is the wrong way to > go. The numbers: > > select count(*) > from code_master > where code not in (select /*+ HASH_AJ */ code from code_detail) > > call count cpu elapsed disk query current > rows > ------- ------ -------- ---------- ---------- ---------- ---------- > ------ ---- > Parse 1 0.03 0.03 0 0 0 > 0 > Execute 2 0.00 0.00 0 0 0 > 0 > Fetch 1 2.33 53.23 5855 859 144 > 1 > ------- ------ -------- ---------- ---------- ---------- ---------- > ------ ---- > total 4 2.36 53.26 5855 859 144 > 1 > > Rows Row Source Operation > ------- --------------------------------------------------- > 1 SORT AGGREGATE > 100 HASH JOIN ANTI > 100000 INDEX FAST FULL SCAN (object id 67350) > 299600 VIEW VW_NSO_1 > 299600 INDEX FAST FULL SCAN (object id 69013) > > *************************************************************************** >* **** > > select /*+ ORDERED USE_HASH(cd) */ count(*) > from code_master cm, code_detail cd > where cm.code = cd.code (+) > and cd.code is null > > call count cpu elapsed disk query current > rows > ------- ------ -------- ---------- ---------- ---------- ---------- > ------ ---- > Parse 1 0.03 0.03 0 0 0 > 0 > Execute 2 0.00 0.00 0 0 0 > 0 > Fetch 1 2.39 57.47 5855 859 144 > 1 > ------- ------ -------- ---------- ---------- ---------- ---------- > ------ ---- > total 4 2.42 57.50 5855 859 144 > 1 > > Rows Row Source Operation > ------- --------------------------------------------------- > 1 SORT AGGREGATE > 100 FILTER > 299700 HASH JOIN OUTER > 100000 INDEX FAST FULL SCAN (object id 67350) > 299600 INDEX FAST FULL SCAN (object id 69013) > > And you don't want to see the numbers for the correlated nested loops > approach, more than an hour. > > Okay, OJNK a little slower in this case, but if a hash aj *couldn't* be > used, and a correlated approach was *not* the way to go, the OJNK approach > can save the day and be a nice alternative if you utilize a hash join. > > Regards, > > Larry G. Elkins > [EMAIL PROTECTED] > 214.954.1781 > -----Original Message----- > Sent: Wednesday, June 26, 2002 5:44 PM > To: Multiple recipients of list ORACLE-L > > > 2 versions of SQL + TKPROF excerpts > > 8.1.6, Solaris > > ---------------------------- > SQL version #1 > ---------------------------- > > select count(*) > from customers c > , sales s > where c.customer_id = s.customer_id(+) > and s.customer_id is null > > count cpu elapsed disk query current rows > > total 4 7.33 7.36 1 200352 4 1 > > Rows Row Source Operation > ------- ---------------------------------------- > 1 SORT AGGREGATE > 99105 FILTER > 169049 NESTED LOOPS OUTER > 100000 INDEX FAST FULL SCAN (object id 22199) > 69944 INDEX RANGE SCAN (object id 22232) > > ---------------------------- > SQL version #2 > ---------------------------- > > select count(*) > from customers c > where c.customer_id not in ( > select /*+ hash_aj */ > s.customer_id > from sales s ) > > count cpu elapsed disk query current rows > > total 5 1.17 1.94 159 356 8 1 > > Rows Row Source Operation > ------- ------------------------------------------ > 1 SORT AGGREGATE > 99105 HASH JOIN ANTI > 99999 INDEX FAST FULL SCAN (object id 22199) > 69945 VIEW VW_NSO_1 > 69945 INDEX FAST FULL SCAN (object id 22232) -- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: Jared Still INET: [EMAIL PROTECTED] Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing Lists -------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).