Re: Native Hash Full Join and Pagination Query 11g

  • From: Dion Cho <ukja.dion@xxxxxxxxx>
  • To: Stalin <stalinsk@xxxxxxxxx>
  • Date: Wed, 4 Nov 2009 09:18:18 +0900

Your traditional full outer join(I mean, union all) consists of 2 parts.
part1: nested loops outer join - which is good for pagination
part2: merge anti join - which is bad for pagination

I think that converting the part2 into nested loops anti join would meet
your requirement - pagination.

1. Would you try first_rows(10) hint with native full outer hash join
disabled?

2. When above try fails, could you post the outline of your execution plan?
select * from table(dbms_xplan.display(...., 'outline'));
This would show the query block name of the part2 and with that name you can
control the plan with the appropriate hints.


================================
Dion Cho - Oracle Performance Storyteller

http://dioncho.wordpress.com (english)
http://ukja.tistory.com (korean)
http://dioncho.blogspot.com (japanese)
http://ask.ex-em.com (q&a)
================================


2009/11/4 Stalin <stalinsk@xxxxxxxxx>

> No Luck there. Here is the revised Plan.
>
> SELECT * FROM (
>   SELECT tmp.*, rownum rnum FROM (
>       SELECT /*+ opt_param('_optimizer_native_full_outer_join', 'off')
> use_nl no_native_full_outer_join */ c.customerId, subscriberId, name,
> city, phone1, email1, a.actId
>      FROM Accounts a FULL JOIN Customer c ON a.customerid =
> c.customerid ORDER BY c.name, a.actId
>    ) tmp WHERE rownum <= 10
> ) WHERE rnum >= 1
>
>
> -----------------------------------------------------------------------------------------------------------------
> | Id  | Operation                          | Name               | Rows
>  | Bytes |TempSpc| Cost (%CPU)| Time     |
>
> -----------------------------------------------------------------------------------------------------------------
> |   0 | SELECT STATEMENT                   |                    |
>  |       |       |   547K(100)|          |
> |*  1 |  VIEW                              |                    |
> 30 | 22230 |       |   547K  (1)| 01:49:36 |
> |*  2 |   COUNT STOPKEY                    |                    |
>  |       |       |            |          |
> |   3 |    VIEW                            |                    |
> 2940K|  2041M|       |   547K  (1)| 01:49:36 |
> |*  4 |     SORT ORDER BY STOPKEY          |                    |
> 2940K|  2439M|  2552M|   547K  (1)| 01:49:36 |
> |   5 |      VIEW                          |                    |
> 2940K|  2439M|       |  8147   (7)| 00:01:38 |
> |   6 |       UNION-ALL                    |                    |
>  |       |       |            |          |
> |   7 |        NESTED LOOPS OUTER          |                    |
> 2940K|  1777M|       |  8146   (7)| 00:01:38 |
> |   8 |         TABLE ACCESS FULL          | ACCOUNTS           |
> 2940K|   187M|       |  8146   (7)| 00:01:38 |
> |   9 |         TABLE ACCESS BY INDEX ROWID| CUSTOMER           |
> 1 |   567 |       |     0   (0)|          |
> |* 10 |          INDEX UNIQUE SCAN         | CT_CUSTOMER_PK     |
> 1 |       |       |     0   (0)|          |
> |  11 |        MERGE JOIN ANTI             |                    |
> 1 |   580 |       |     1 (100)| 00:00:01 |
> |  12 |         TABLE ACCESS BY INDEX ROWID| CUSTOMER           |
> 1 |   567 |       |     0   (0)|          |
> |  13 |          INDEX FULL SCAN           | CT_CUSTOMER_PK     |
> 1 |       |       |     0   (0)|          |
> |* 14 |         SORT UNIQUE                |                    |
> 1 |    13 |       |     1 (100)| 00:00:01 |
> |* 15 |          INDEX FULL SCAN           | IX_ACCT_CUSTOMER   |
> 1 |    13 |       |     0   (0)|          |
>
> -----------------------------------------------------------------------------------------------------------------
>
> Predicate Information (identified by operation id):
> ---------------------------------------------------
>
>   1 - filter("RNUM">=1)
>   2 - filter(ROWNUM<=10)
>    4 - filter(ROWNUM<=10)
>  10 - access("A"."CUSTOMERID"="C"."CUSTOMERID")
>  14 - access("A"."CUSTOMERID"="C"."CUSTOMERID")
>       filter("A"."CUSTOMERID"="C"."CUSTOMERID")
>  15 - filter("A"."CUSTOMERID" IS NOT NULL)
>

Other related posts: