May 04 2010

Native Full Outer Join Officially Available in 10.2.0.5

Tag: 10gR2, Query OptimizerChristian Antognini @ 12:25 pm

Today I installed for the first time the patchset 10.2.0.5. While reading the README file, I noticed the following piece of information.

To enable a new native full outer join implementation in the database, a user has to set the following underscore parameter:

_optimizer_native_full_outer_join =force

You can set this parameter for the system or for a specific session.

Besides dramatically improving the performance of a full outer join, the new implementation fixes a variety of issues, for examples a variety of ORA-942 (table or view doesn’t exists) and ORA-4331 (unable to allocate string bytes of shared memory) errors.

This issue is tracked with Oracle bug 6322672.

Great! At last we can officially take advantage of native full outer join also in 10.2 (the feature was officially introduced in 11.1, but was already “available” in 10.2.0.3).

Here is an example:

  • By default native full outer joins are disabled (notice the implementation with the UNION ALL operation):

SQL> SELECT * FROM emp FULL OUTER JOIN dept USING (deptno);

Execution Plan
----------------------------------------------------------
Plan hash value: 2291915024

---------------------------------------------
| Id  | Operation            | Name         |
---------------------------------------------
|   0 | SELECT STATEMENT     |              |
|   1 |  VIEW                |              |
|   2 |   UNION-ALL          |              |
|*  3 |    HASH JOIN OUTER   |              |
|   4 |     TABLE ACCESS FULL| EMP          |
|   5 |     TABLE ACCESS FULL| DEPT         |
|   6 |    NESTED LOOPS ANTI |              |
|   7 |     TABLE ACCESS FULL| DEPT         |
|*  8 |     INDEX RANGE SCAN | EMP_DEPTNO_I |
---------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("EMP"."DEPTNO"="DEPT"."DEPTNO"(+))
   8 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

  • As suggested by the README file, the feature can be enabled at the session level:

SQL> ALTER SESSION SET "_optimizer_native_full_outer_join" = force;

SQL> SELECT * FROM emp FULL OUTER JOIN dept USING (deptno);

Execution Plan
----------------------------------------------------------
Plan hash value: 51889263

------------------------------------------
| Id  | Operation             | Name     |
------------------------------------------
|   0 | SELECT STATEMENT      |          |
|   1 |  VIEW                 | VW_FOJ_0 |
|*  2 |   HASH JOIN FULL OUTER|          |
|   3 |    TABLE ACCESS FULL  | DEPT     |
|   4 |    TABLE ACCESS FULL  | EMP      |
------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

4 Responses to “Native Full Outer Join Officially Available in 10.2.0.5”

  1. Comment: Timur Akhmadeev

    Hi Christian,
    >the feature was officially introduced in 11.1, but was already “available” in 10.2.0.4
    It was 10.2.0.3 (can be confirmed using v$sql_hint in 11g)

  2. Comment: Christian Antognini

    Hi Timur

    Thank you for the feedback. For some reasons I was sure that it was 10.2.0.4… Anyway, I modified the post.

    Cheers,
    Chris

  3. Pingback: Log Buffer #189, A Carnival of the Vanities for DBAs « So Many Oracle Manuals, So Little Time

    [...] Christian Antognini pored over the 10.2.0.5 liner notes and discovered that it comes with a native implementation of FULL OUTER JOIN that does not require an inefficient UNION operation. Is that one more reason to stick with Oracle [...]

  4. Pingback: Plan Stability Through Upgrade-Why is my plan changed?-new optimizer parameters « Coskan’s Approach to Oracle

    [...] again (another “invalid dba exception”, should have done before ) and it reminded me Christian Antognini’s post about native full outer join support (Being a blog reader is good thing !!!) then I checked the parameter and immediatelly realized that [...]

Leave a Reply

All comments are filtered by Akismet and then moderated by me. So, it should be no surprise that spam and anything wholly inappropriate has no chance of making it onto the site. To send questions or comments not related to this blog post please use the contact form.

Your name (required)

Your email (will not be published) (required)

Your website

Your message (please wrap code examples in <pre> tags)