union - Fast MDX query for one row per-hierarchy on shared dimension -
working on ssas multidimensional cube includes usergroups dimension made of multiple hierarchies. each hierarchy classifies users belonging particular group or not. users can belong more 1 group.
trying generate table 1 row each hierarchy in dimension. best approach have come following:
with member [measures].[group name] case when [usergroups].[group a].currentmember.membervalue <> 'all' "group a" when [usergroups].[group b].currentmember.membervalue <> 'all' "group b" -- more user groups... when [usergroups].[group t].currentmember.membervalue <> 'all' "group t" else "error" end select {[members].[group name], [measures].[user count], [measures].[revenue]} on 0, order( union( [usergroups].[group a].&[true] * {[usergroups].[group b].[all]} * -- more user groups... {[usergroups].[group t].[all]}, [usergroups].[group a].[all] * {[usergroups].[group b].&[true]} * -- more user groups... {[usergroups].[group t].[all]}, -- bunch more blocks there 1 each row. [usergroups].[group a].[all] * {[usergroups].[group b].[all]} * -- more user groups... {[usergroups].[group t].&[true]} ), ) on 1 [finances]; this succeeds in generating expected table:
group name user count revenue ... true group t 90 1800 ... ... ... ... ... ... ... true ... group b 20 400 true ... group 10 100 however, query slow. given row can calculated in isolation in 30 seconds. when combining rows using union statement, each additional row seems result in exponential increase in computation time rather desired linear increase in computation time.
- why increase in time observed?
- is there way instruct underlying engine compute each row in isolation?
- is there better way issue query?
i guess you've experimented rearranging query - if take union(...) out of select , make named set in clause help?
with set [rowset] union( [usergroups].[group a].&[true] * {[usergroups].[group b].[all]} * -- more user groups... {[usergroups].[group t].[all]}, [usergroups].[group a].[all] * {[usergroups].[group b].&[true]} * -- more user groups... {[usergroups].[group t].[all]}, -- bunch more blocks there 1 each row. [usergroups].[group a].[all] * {[usergroups].[group b].[all]} * -- more user groups... {[usergroups].[group t].&[true]} ) member [measures].[group name] case when [usergroups].[group a].currentmember.membervalue <> 'all' "group a" when [usergroups].[group b].currentmember.membervalue <> 'all' "group b" -- more user groups... when [usergroups].[group t].currentmember.membervalue <> 'all' "group t" else "error" end select {[members].[group name], [measures].[user count], [measures].[revenue]} on 0, order( [rowset], ) on 1 [finances]; what purpose of order function? cannot see ordering by?
again shot in dark think i've noticed differences in efficiency between using union , using + operator - option:
with set [rowset] { [usergroups].[group a].&[true] * {[usergroups].[group b].[all]} * -- more user groups... {[usergroups].[group t].[all]} } + { [usergroups].[group a].[all] * {[usergroups].[group b].&[true]} * -- more user groups... {[usergroups].[group t].[all]} } -- bunch more blocks there 1 each row. + { [usergroups].[group a].[all] * {[usergroups].[group b].[all]} * -- more user groups... {[usergroups].[group t].&[true]} } member [measures].[group name] ... ... apologies don't have definites - above options might lucky!! best discuss in detail can greg able give solid advise on possible amendments cube design.
Comments
Post a Comment