| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Rollup Aggregation Tuning
DA Morgan napisal(a):
> Pawel wrote:
> > Hi,
> >
> > I'm working on a data warehouse solution for fact data aggregation.
> > Short description:
> >
> > there's base level fact table:
> >
> > TIME_ID, GEO_ID, PROD_ID, AMOUNT1, AMOUNT2....
> >
> > Fact data is 3-dimensional with, say ~500 nodes in each of the
> > hierarchies lowest level (input data).
> > Rows are distinct. So there's 500^3 rows, with low cardinality for each
> > separate dimension column.
> >
> > I also have a flattened time hierarchy with 3 levels.
> > Flattened with this procedure:
> > When graph is (text-mode compliant :)...
> >
> > X (year)
> > / \
> > / \
> > P Q (halfs)
> > / \ \
> > / \ \
> > A B C (lowest level)
> >
> > ...HIER table rows look like this:
> >
> > Lvl1, Lvl2, Lvl3
> > ----------------
> > X P A
> > X P B
> > X Q C
> >
> > FACT table is joined with HIER (WHERE TIME_ID = Lvl3)
> > Then ROLLUP(Lvl1, Lvl2, Lvl3) is used for full aggregation on time
> > dimension.
> > [The lowest level (Lvl3) might be skipped and gotten from FACT table -
> > it's written here for clarity.]
> >
> > I'd like to know your opinions about the best way to tune the
> > performance of this query - or even rewrite it to leverage other Oracle
> > features (e.g. Dimension objects).
> > Fact table needs to be FULLy ACCESSed, but when GROUPing, there's
> > sorting needed as far as I know, so what about bitmap indexes? Or
> > concatenated bitmap index?
> > Then PARALLEL - will Oracle use it's advantages here?
> > Would partitioning help?
> >
> > Thanks,
> > Pawel
>
>
Hi,
I enclose the query and the explain plan below. It's a bit complicated :) ..
What it comes down to is the idea beyond tuning ROLLUP in general - it's the major operation in this particular query. As I wrote the core schema it quite simple - 3-dimensional facts connected with a flattened hierarchy and rolled-up..
WITH -- view of the input assoc (child-parent)
assocview AS (SELECT UNIQUE dsend_id AS kid, parnt_id AS papa
FROM time_perd_assoc_dnorm_254_vm
WHERE net_lvl = 1),
keepview AS (SELECT dsend_id AS keep_id
FROM time_perd_assoc_dnorm_254_vm
WHERE dsend_id = parnt_id
AND dsend_keep_flag = 'Y'),
-- view of the assoc (with null-child LEAFs and LEAFKID flag rows
added)
lhassoc AS (SELECT kid, papa, NULL AS leaflag
FROM assocview
UNION
SELECT NULL AS kid, kid AS papa, 'Y' AS leaflag
FROM assocview a
WHERE NOT EXISTS (SELECT 1 FROM assocview b
WHERE a.kid = b.papa)),
-- all distinct nodes with LEVELs
lnodes AS (SELECT papa AS node_id, 4 - MAX(LEVEL) AS lvl
FROM lhassoc
START WITH leaflag = 'Y'
CONNECT BY PRIOR papa = kid
GROUP BY papa),
-- all connections between levels 1 and 2
l2conn AS (SELECT papa AS l1, kid AS l2, NULL AS l3
FROM lhassoc
WHERE papa IN (SELECT node_id FROM lnodes WHERE lvl =
1)
AND kid IN (SELECT node_id FROM lnodes WHERE lvl =
2)),
-- all connections between levels 1 and 3
l3conn AS (SELECT papa AS l1, kid AS l2, kid AS l3
FROM lhassoc
WHERE papa IN (SELECT node_id FROM lnodes WHERE lvl =
1)
AND kid IN (SELECT node_id FROM lnodes WHERE lvl =
3)
UNION ALL
SELECT NULL AS l1, papa AS l2, kid AS l3
FROM lhassoc
WHERE papa IN (SELECT node_id FROM lnodes WHERE lvl =
2)
AND kid IN (SELECT node_id FROM lnodes WHERE lvl =
3)),
-- all levels connections joined and denormalized
hier AS (SELECT COALESCE(a.l1, b.l1, l2) AS l1, l2, a.l3
FROM l3conn a LEFT OUTER JOIN l2conn b USING (l2)
UNION
SELECT COALESCE(b.l1, a.l1) AS l1, l2, COALESCE(a.l3,
l2) AS l3
FROM l3conn a RIGHT OUTER JOIN l2conn b USING (l2)),
-- aggregation
aggfact AS (SELECT DECODE(GROUPING_ID(h.l1, h.l2), 0, h.l2, 1,
h.l1, NULL) AS time_perd_id,
captl_id, cust_id, demnd_plan_cust_grp_code,
due_perd, fact_type_code, func_id,
geo_id, iso_crncy_code_char, legal_ent_id,
lyout_id, measr_id, mm_hybrd_id,
org_id, prod_id, proft_ctr_id, site_id,
srce_sys_id, trade_chanl_id,
SUM(f.fact_amt_1) AS fact_amt_1,
SUM(f.fact_amt_2) AS fact_amt_2,
AVG(f.fact_amt_12) AS fact_amt_12,
AVG(f.fact_amt_13) AS fact_amt_13,
DECODE(MAX(DECODE(f.fact_amt_14, 4, -1, 8, -1,
f.fact_amt_14)),
-1, MIN(f.fact_amt_14),
MAX(f.fact_amt_14)) AS fact_amt_14,
SUM(f.fact_amt_28) AS fact_amt_28,
SUM(f.fact_amt_29) AS fact_amt_29,
MAX(f.fact_amt_36) AS fact_amt_36
FROM mm_agg_view_vm f,
hier h
WHERE f.time_perd_id = h.l3
GROUP BY ROLLUP(h.l1, h.l2),
captl_id, cust_id, demnd_plan_cust_grp_code,
due_perd, fact_type_code, func_id,
geo_id, iso_crncy_code_char, legal_ent_id,
lyout_id, measr_id, mm_hybrd_id,
org_id, prod_id, proft_ctr_id, site_id,
srce_sys_id, trade_chanl_id
UNION ALL
SELECT time_perd_id,
captl_id, cust_id, demnd_plan_cust_grp_code,
due_perd, fact_type_code, func_id,
geo_id, iso_crncy_code_char, legal_ent_id,
lyout_id, measr_id, mm_hybrd_id,
org_id, prod_id, proft_ctr_id, site_id,
srce_sys_id, trade_chanl_id,
fact_amt_1,fact_amt_2,fact_amt_12,fact_amt_13,fact_amt_14,fact_amt_28,fact_amt_29,fact_amt_36
FROM mm_agg_view_vm),
daggfact AS (SELECT ROW_NUMBER() OVER (PARTITION BY time_perd_id,
geo_id, prod_id
ORDER BY time_perd_id)
AS oragg_duplicate,
time_perd_id,
captl_id, cust_id, demnd_plan_cust_grp_code,
due_perd, fact_type_code, func_id,
geo_id, iso_crncy_code_char, legal_ent_id,
lyout_id, measr_id, mm_hybrd_id,
org_id, prod_id, proft_ctr_id, site_id,
srce_sys_id, trade_chanl_id,
fact_amt_1,fact_amt_2,fact_amt_12,fact_amt_13,fact_amt_14,fact_amt_28,fact_amt_29,fact_amt_36
FROM aggfact
WHERE time_perd_id IN (SELECT * FROM keepview))
SELECT time_perd_id,
captl_id, cust_id, demnd_plan_cust_grp_code, due_perd,
fact_type_code, func_id,
geo_id, iso_crncy_code_char, legal_ent_id, lyout_id, measr_id,
mm_hybrd_id,
org_id, prod_id, proft_ctr_id, site_id, srce_sys_id,
trade_chanl_id,
fact_amt_1,fact_amt_2,fact_amt_12,fact_amt_13,fact_amt_14,fact_amt_28,fact_amt_29,fact_amt_36
FROM daggfact
WHERE oragg_duplicate = 1
Operation Object Name
Rows Bytes Cost Object Node In/Out
PStart PStop
SELECT STATEMENT Optimizer Mode=CHOOSE
1 M 257 M
RECURSIVE EXECUTION .SYS_LE_6_0
RECURSIVE EXECUTION .SYS_LE_6_1
RECURSIVE EXECUTION .SYS_LE_6_2
RECURSIVE EXECUTION .SYS_LE_6_3
RECURSIVE EXECUTION .SYS_LE_6_4
TEMP TABLE TRANSFORMATION VIEW
1 M 298 M 257 M
WINDOW SORT PUSHED RANK
1 M 294 M 257 M
HASH JOIN
1 M 294 M 257 M
VIEW
SYS.VW_NSO_1 10 90 48
SORT UNIQUE
10 210 48
VIEW
IDWGQ5.TIME_PERD_ASSOC_DNORM_254_VM 10 210 38
SORT UNIQUE
10 520 38
UNION-ALL
HASH JOIN
9 468 9
PARTITION RANGE SINGLE
KEY KEY
TABLE ACCESS FULL
IDWGQ5.TIME_PERD_ASSOC_DNORM 1 30 1
KEY KEY
TABLE ACCESS FULL
IDWGQ5.REF_CTRL 1 33 1
TABLE ACCESS FULL
IDWGQ5.TIME_PERD 915 19 K 7
SORT AGGREGATE
1 8
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 2 M 20 M 1712
1 1
FILTER
HASH JOIN
1 52 9
PARTITION RANGE SINGLE
KEY KEY
TABLE ACCESS FULL
IDWGQ5.TIME_PERD_ASSOC_DNORM 1 30 1
KEY KEY
TABLE ACCESS FULL
IDWGQ5.REF_CTRL 1 33 1
TABLE ACCESS FULL
IDWGQ5.TIME_PERD 27 594 7
SORT AGGREGATE
1 8
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 2 M 20 M 1712
1 1
VIEW
11 M 2G 257 M
UNION-ALL
SORT GROUP BY ROLLUP
15 K 2 M 257 M
HASH JOIN
6 G 1105G 18382
VIEW
75 K 1 M 607
SORT UNIQUE
75 K 3 M 607
UNION-ALL
HASH JOIN OUTER
50 K 2 M 23
VIEW
50 K 1 M 4
TABLE ACCESS FULL
SYS.SYS_TEMP_0FD9D68F1_33A540CE 50 K 879 K 4
VIEW
25 K 439 K 2
TABLE ACCESS FULL
SYS.SYS_TEMP_0FD9D68F0_33A540CE 25 K 439 K 2
HASH JOIN OUTER
25 K 1 M 14
VIEW
25 K 439 K 2
TABLE ACCESS FULL
SYS.SYS_TEMP_0FD9D68F0_33A540CE 25 K 439 K 2
VIEW
50 K 1 M 4
TABLE ACCESS FULL
SYS.SYS_TEMP_0FD9D68F1_33A540CE 50 K 879 K 4
HASH JOIN
11 M 1G 11660
PARTITION RANGE SINGLE
KEY KEY
INDEX RANGE SCAN
IDWGQ5.PROD_ASSOC_DNORM_IDX3 10 K 306 K 135
KEY KEY
SORT AGGREGATE
1 33
TABLE ACCESS FULL
IDWGQ5.REF_CTRL 1 33 1
HASH JOIN OUTER
10 M 1G 10757
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 2 M 279 M 1712
1 1
VIEW
146 K 3 M 5940
SORT GROUP BY
146 K 7 M 5940
HASH JOIN
285 K 14 M 3444
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 10 K 255 K 1712
1 1
TABLE ACCESS BY INDEX ROWID
IDWGQ5.MM_BUS_PRCSS_CTRL 147 2 K 32
INDEX RANGE SCAN
IDWGQ5.MM_BUS_PRCSS_CTRL_PK 147 2
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 1 M 27 M 1712
1 1
HASH JOIN
11 M 1G 11708
PARTITION RANGE SINGLE
KEY KEY
INDEX RANGE SCAN
IDWGQ5.PROD_ASSOC_DNORM_IDX3 10 K 306 K 135
KEY KEY
SORT AGGREGATE
1 33
TABLE ACCESS FULL
IDWGQ5.REF_CTRL 1 33 1
HASH JOIN OUTER
10 M 1G 10794
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 2 M 279 M 1712
1 1
VIEW
146 K 3 M 5940
SORT GROUP BY
146 K 7 M 5940
HASH JOIN
285 K 14 M 3444
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 10 K 255 K 1712
1 1
TABLE ACCESS BY INDEX ROWID
IDWGQ5.MM_BUS_PRCSS_CTRL 147 2 K 32
INDEX RANGE SCAN
IDWGQ5.MM_BUS_PRCSS_CTRL_PK 147 2
TABLE ACCESS FULL
IDWGQ5.WK_AGG_FACT_291 1 M 27 M 1712
1 1
---------------------------
cheers
Pawel
Received on Tue Oct 18 2005 - 18:54:07 CDT
![]() |
![]() |