<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.5730.11" name=GENERATOR></HEAD>
<BODY>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2><STRONG>Option #1 (ROLLUP/CUBE BY) </STRONG>is viable and 
useful. If there are differences between DBMS vendors in how they implement this 
support, let's stick to the letter of the SQL:2003 standard.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2>To implement option #1, someone will have to get their 
hands dirty understanding how cell requests are turned into SQL queries. The 
hardest part is to look at a collection of cell requests and figure out whether 
they can be satisfied using the same query.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2>Is there a chance that a ROLLUP query will compute 
exponentially more results than individual GROUP BY queries? If so, we will need 
to do a cost:benefit analysis before issuing a ROLLUP query.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2><STRONG>Option #2 (parallel query execution) </STRONG>is 
also viable, and is&nbsp;useful if option #1 is implemented, because certain 
queries, especially those on virtual cubes, may generate queries which are not a 
rollup of each other.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2>Implementing option #2 it requires a modest amount of 
coding, mainly introducing a multi-threaded request queue, and a significant 
amount of testing for threading issues.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2>A <STRONG>third option is to support rollup within 
cache</STRONG>. If mondrian notices that there is a request for 
([Time].[1997].[Q1], ... [Q4], [Product].[Beer]) and also a request for 
([Time].[1997], [Product].[Beer]) then it should execute request #1 then answer 
request #2 by rolling up the results of request #1.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2>ALL of these options will benefit mondrian and each offers 
something that the other two do not, so it's difficult to choose between them. 
My instinct is that </FONT></SPAN><SPAN class=503022400-13022007><FONT 
face=Verdana color=#000080 size=2>option #2 is slightly less work than option 
#1, but has less benefit. Take your pick!</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=503022400-13022007><FONT face=Verdana 
color=#000080 size=2>Julian</FONT></SPAN></DIV></BODY></HTML>