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

Popular posts from this blog

c# - Update a combobox from a presenter (MVP) -

How to understand 2 main() functions after using uftrace to profile the C++ program? -

How to put a lock and transaction on table using spring 4 or above using jdbcTemplate and annotations like @Transactional? -