Re: UNION ALL with ROW_NUMBER vs UNION (WAS: "Wow - has anyone used ROW_NUMBER() to get around using a UNION statement when UNION ALL doesn't work??")

From: Greg Rahn <greg_at_structureddata.org>
Date: Fri, 12 Aug 2011 16:37:31 -0700
Message-ID: <CAGXkmismKwkdCmAwNtYZeDN01NZh8ZphQr6CYX=JPVkyFcb_Gg_at_mail.gmail.com>



Regardless of what is or is not happening with stats, the plans looks like they are getting poor cardinality estimates so that warrants further investigation.

WRT the UNION vs UNION ALL, sure, the stats, etc. are a constant input to the CBO but what is happening is the CBO in the UNION ALL is unnesting both uncorrelated subqueries in both braches (VW_NSO_1 & VW_NSO_2), but the UNION only in the second branch (VW_NSO_1) and not the first. Why that is happening is unknown -- maybe a bug, maybe costing, maybe edge condition. My point is here is that generalization of UNION vs UNION ALL assumes all the rest of the plan is the same -- and in this case it is not - for reasons not yet determined. At a high level, you are right, but the devil is in the details...

As a matter of debug & triage, you can get the full outline directive for both by using dbms_xplan.display_cursor('<sql_id>', null, 'outline') and find the hints that do the unnesting and try and force it in the UNION version. That won't give you the answer of why it's happening, but it's a good exercise in debugging plans. Ultimately the 10053 traces are probably needed to determine. If you want, grab the 10053 trace from both load them into a visual diff tool and see if you can track down a difference.

(took a break and thought more about this)

After looking at both branches there is an every so slight difference in those subqueries: the first branch has a DISTINCT which may be causing the issue (bug). There is no need to to have a DISTINCT in the first as IN either matches or not - it doesn't match multiple times (1 row on the left for 1 or more rows on the right). So try this - remove the DISTINCT and see if the UNION plan unnests both subqueries.

PL.ACTIVITY_ID IN (SELECT DISTINCT ING_VESSEL_ID... versus
DL2.ACTIVITY_ID IN (SELECT ING_VESSEL_ID... On Fri, Aug 12, 2011 at 2:57 PM, Taylor, Chris David <ChrisDavid.Taylor_at_ingrambarge.com> wrote:
> 10.2.0.4
>
> I collect stats every weekend using 100% sample size BUT given that this a Peoplesoft system, it is likely there are other stat commands being executed as part of App Engine programs.
>
> I will get the stats command this evening.
>
> I disagree with you on the generalization of UNION vs UNION ALL because BOTH operations are operating with the SAME information available to the optimizer (comparing #1 and #2).
>
> Sure, the row sources are different at different points precisely because Oracle did something different with the UNION prior to the final SORT UNIQUE.
>
> I believe I have a very solid stats strategy, though of course that may be my own pride :)
>
> Peoplesoft processing that includes stat gathering operations seldom cause problems but sometimes it does.
>

-- 
Regards,
Greg Rahn
http://structureddata.org
--
http://www.freelists.org/webpage/oracle-l
Received on Fri Aug 12 2011 - 18:37:31 CDT

Original text of this message