<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3820031471524503731</id><updated>2011-12-30T05:34:40.573-08:00</updated><category term='VPD'/><category term='Tuning'/><category term='Dimensions'/><category term='Database Machine'/><category term='OpenWorld'/><category term='Workshop'/><category term='Exadata'/><category term='OLAP API'/><category term='Diagnostics'/><category term='Hierarchies'/><category term='Vlamis'/><category term='AWM'/><category term='White Paper'/><category term='OBIEE'/><category term='Oracle'/><category term='10g'/><category term='Discoverer for OLAP'/><category term='Best Practice'/><category term='Videos'/><category term='SAP'/><category term='materialized view'/><category term='RAC'/><category term='MindMapping'/><category term='RESUMABLE_TIMEOUT'/><category term='Business Objects'/><category term='Oracle University'/><category term='11g'/><category term='Voyager'/><category term='OLAP Newsletter'/><category term='OLAP 11g'/><category term='Levels'/><category term='recyclebin'/><category term='News'/><category term='Write-back'/><category term='patch'/><category term='11.1.0.7'/><category term='undelete'/><category term='XML_LOAD_LOG'/><category term='Demonstration'/><category term='summary management'/><category term='Microsoft Office'/><category term='OLAP'/><category term='Simba'/><category term='Larry Ellison'/><category term='cube'/><category term='Calculated Measures'/><category term='Oracle OLAP Option'/><category term='query rewrite'/><category term='SQL Access'/><category term='OTN'/><category term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category term='APEX (Application Express)'/><category term='BI Tools'/><category term='Database'/><category term='OLAP DML'/><category term='BI Beans'/><category term='connectivity'/><category term='Wiki'/><category term='Customer References'/><category term='Cubes'/><category term='Training'/><category term='MDX'/><category term='Cognos'/><category term='Excel'/><title type='text'>Oracle OLAP</title><subtitle type='html'>The most powerful, open Analytic Engine</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brian Macdonald</name><uri>http://www.blogger.com/profile/18408740222558531436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8787736347809589495</id><published>2011-01-17T07:06:00.000-08:00</published><updated>2011-01-17T07:24:41.547-08:00</updated><title type='text'>Script for  Time Dimension Table</title><content type='html'>One of the more common requests I get is a script for creating time dimension tables for Oracle OLAP.  The following script will create a time dimension table for a standard calendar.  It starts by creating a table with dimension members and labels.  The second part of the script fills in end date and time span attributes.  The section that creates end date and time span can be easily adapted for completing other calendars (e.g., fiscal) where the members have already been filled in.&lt;br /&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormalCxSpMiddle"&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;"&gt;--&lt;br /&gt;-- Create time dimension table for a standard calendar year (day, month,&lt;br /&gt;-- quarter and year).&lt;br /&gt;--&lt;br /&gt;-- Drop table.&lt;br /&gt;--&lt;br /&gt;--DROP TABLE time_calendar_dim;&lt;br /&gt;--&lt;br /&gt;-- Create time dimension table for calendar year.&lt;br /&gt;--&lt;br /&gt;-- First day if the next day after TO_DATE('31/12/2010','DD/MM/YYYY').&lt;br /&gt;-- Number of days is set in CONNECT BY level &lt;= 365.&lt;br /&gt;--&lt;br /&gt;-- Values for end date and time span attributes are place holders.&lt;span style=""&gt;  &lt;/span&gt;They need&lt;br /&gt;-- to be filled in correctly later in this script.&lt;br /&gt;--&lt;br /&gt;CREATE TABLE time_calendar_dim AS&lt;br /&gt;SELECT CurrDate AS Day_ID,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;1 AS Day_Time_Span,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;CurrDate AS Day_End_Date,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_CHAR(CurrDate,'Day') AS Week_Day_Full,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_CHAR(CurrDate,'DY') AS Week_Day_Short,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_NUMBER(TRIM(leading '0' FROM TO_CHAR(CurrDate,'D'))) AS Day_Num_of_Week,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_NUMBER(TRIM(leading '0'&lt;span style=""&gt;  &lt;/span&gt;FROM TO_CHAR(CurrDate,'DD'))) AS Day_Num_of_Month,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_NUMBER(TRIM(leading '0'&lt;span style=""&gt;  &lt;/span&gt;FROM TO_CHAR(CurrDate,'DDD'))) AS Day_Num_of_Year,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;UPPER(TO_CHAR(CurrDate,'Mon') || '-' || TO_CHAR(CurrDate,'YYYY')) AS Month_ID,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;31 AS Month_Time_Span,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;to_date('31-JAN-2010','DD-MON-YYYY') AS Month_End_Date,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_CHAR(CurrDate,'Mon') || ' ' || TO_CHAR(CurrDate,'YYYY') AS Month_Short_Desc,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;RTRIM(TO_CHAR(CurrDate,'Month')) || ' ' || TO_CHAR(CurrDate,'YYYY') AS Month_Long_Desc,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_CHAR(CurrDate,'Mon') AS Month_Short,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_CHAR(CurrDate,'Month') AS Month_Long,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_NUMBER(TRIM(leading '0'FROM TO_CHAR(CurrDate,'MM'))) AS Month_Num_of_Year,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;'Q' || UPPER(TO_CHAR(CurrDate,'Q') || '-' || TO_CHAR(CurrDate,'YYYY')) AS Quarter_ID,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;31 AS Quarter_Time_Span,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;to_date('31-JAN-2010','DD-MON-YYYY') AS Quarter_End_Date,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_NUMBER(TO_CHAR(CurrDate,'Q')) AS Quarter_Num_of_Year,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;TO_CHAR(CurrDate,'YYYY') AS Year_ID,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;31 AS Year_Time_Span,&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;to_date('31-JAN-2010','DD-MON-YYYY') AS Year_End_Date&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT level n,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;-- Calendar starts at the day after this date.&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;TO_DATE('31/12/2010','DD/MM/YYYY') + NUMTODSINTERVAL(level,'day') CurrDate&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM dual&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;-- Change for the number of days to be added to the table.&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;CONNECT BY level &lt;= 365);&lt;br /&gt;--&lt;br /&gt;-- Month end date and time span attributes.&lt;br /&gt;--&lt;br /&gt;UPDATE time_calendar_dim a&lt;br /&gt;SET month_time_span =&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;(SELECT ts&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT DISTINCT month_id,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;SUM(day_time_span) AS ts&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM time_calendar_dim&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;GROUP BY month_id&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;) b&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;WHERE a.month_id = b.month_id&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;br /&gt;--&lt;br /&gt;UPDATE time_calendar_dim a&lt;br /&gt;SET month_end_date =&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;(SELECT ed&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT DISTINCT month_id,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;MAX(day_id) AS ed&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM time_calendar_dim&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;GROUP BY month_id&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;) b&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;WHERE a.month_id = b.month_id&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;br /&gt;--&lt;br /&gt;-- Quarter end date and time span attributes.&lt;br /&gt;--&lt;br /&gt;UPDATE time_calendar_dim a&lt;br /&gt;SET quarter_time_span =&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;(SELECT ts&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT DISTINCT quarter_id,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;SUM(day_time_span) AS ts&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM time_calendar_dim&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;GROUP BY quarter_id&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;) b&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;WHERE a.quarter_id = b.quarter_id&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;br /&gt;--&lt;br /&gt;UPDATE time_calendar_dim a&lt;br /&gt;SET quarter_end_date =&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;(SELECT ed&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT DISTINCT quarter_id,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;MAX(day_id) AS ed&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM time_calendar_dim&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;GROUP BY quarter_id&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;) b&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;WHERE a.quarter_id = b.quarter_id&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;br /&gt;--&lt;br /&gt;-- Year end date and time span attributes.&lt;br /&gt;--&lt;br /&gt;UPDATE time_calendar_dim a&lt;br /&gt;SET year_time_span =&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;(SELECT ts&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT DISTINCT year_id,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;SUM(day_time_span) AS ts&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM time_calendar_dim&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=""&gt;  &lt;/span&gt;GROUP BY year_id&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;) b&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;WHERE a.year_id = b.year_id&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;br /&gt;--&lt;br /&gt;UPDATE time_calendar_dim a&lt;br /&gt;SET year_end_date =&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;(SELECT ed&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;FROM&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;(SELECT DISTINCT year_id,&lt;br /&gt;&lt;span style=""&gt;      &lt;/span&gt;MAX(day_id) AS ed&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;FROM time_calendar_dim&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;GROUP BY year_id&lt;br /&gt;&lt;span style=""&gt;    &lt;/span&gt;) b&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;WHERE a.year_id = b.year_id&lt;br /&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;br /&gt;--&lt;br /&gt;COMMIT;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8787736347809589495?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8787736347809589495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8787736347809589495' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8787736347809589495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8787736347809589495'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2011/01/script-for-time-dimension-table.html' title='Script for  Time Dimension Table'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8142733355496033780</id><published>2010-12-02T04:26:00.000-08:00</published><updated>2010-12-02T05:28:29.166-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Discoverer for OLAP'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX (Application Express)'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Cognos'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><category scheme='http://www.blogger.com/atom/ns#' term='connectivity'/><category scheme='http://www.blogger.com/atom/ns#' term='Simba'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='BI Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft Office'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='OBIEE'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Simba previews Cognos8 Analysis Studio accessing Oracle Database OLAP Option cubes</title><content type='html'>Hot on the heels of support for BusinessObjects Voyager, and in addition to the native Excel 2003/2007/2010 pivot table access, Simba are previewing the same connectivity for Cognos8 Analysis Studio  - the dimensionally aware UI in the Cognos BI suite.   &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Together with the unique SQL access to the same multidimensional data &amp;amp; calculations in Oracle Database OLAP cubes &lt;i&gt;(meaning that *any* tool or application capable of connecting to Oracle and issuing simple SQL can leverage the power of Database OLAP - like Oracle Application Express &lt;a href="http://oracleolap.blogspot.com/2009/02/new-tutorial-creating-interactive-apex.html"&gt;for example&lt;/a&gt;)&lt;/i&gt;, &lt;b&gt;plus&lt;/b&gt; the existing support for Oracle's own BI tools including &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Oracle BIEE 10g and 11g (see &lt;a href="http://oracleolap.blogspot.com/2010/07/first-look-at-obiee-11g-with-oracle.html"&gt;http://oracleolap.blogspot.com/2010/07/first-look-at-obiee-11g-with-oracle.html&lt;/a&gt;  ) and &lt;/li&gt;&lt;li&gt;Oracle BI Discoverer Plus OLAP (see &lt;a href="http://oracleolap.blogspot.com/2010/08/discoverer-olap-is-certified-with-olap.html"&gt;http://oracleolap.blogspot.com/2010/08/discoverer-olap-is-certified-with-olap.html&lt;/a&gt; ), &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;together with the big functionality and performance improvements in 11g , there is now every reason to move to Oracle Database 11gR2 and to fully exploit the OLAP Option - whatever your choice of front end tool(s). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For Cognos fans: Here is the Video on YouTube:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;iframe width="480" height="295" src="http://www.youtube.com/v/ykMnttc9SNU?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999"&gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/param&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;param name="allowFullScreen" value="true" frameborder="0"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More information, see the Simba website : &lt;a href="http://www.simba.com/MDX-Provider-for-Oracle-OLAP.htm"&gt;http://www.simba.com/MDX-Provider-for-Oracle-OLAP.htm&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8142733355496033780?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8142733355496033780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8142733355496033780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8142733355496033780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8142733355496033780'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/12/simba-previews-cognos8-analysis-studio.html' title='Simba previews Cognos8 Analysis Studio accessing Oracle Database OLAP Option cubes'/><author><name>Kevin Lancaster</name><uri>http://www.blogger.com/profile/06742628997065141834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-870397653644012690</id><published>2010-11-16T13:39:00.000-08:00</published><updated>2010-11-16T13:55:28.297-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simba'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Objects'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>Simba previews Oracle OLAP MDX Provider connectivity to SAP BusinessObjects Voyager</title><content type='html'>Simba technologies have released a short video to preview 'Using MDX Provider for Oracle OLAP to directly connect SAP BusinessObjects Voyager to Oracle Database OLAP Option'&lt;br /&gt;&lt;br /&gt;This will be a great capability for users of both Oracle OLAP and BusinessObjects and will futher extend the reach of Oracle database embedded OLAP cubes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="390"&gt;&lt;param name="movie" value="http://www.youtube.com/v/J4Vg655zbbQ&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/J4Vg655zbbQ&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="390"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can get more details on the &lt;a href="http://www.simba.com/MDX-Provider-for-Oracle-OLAP-FAQ-support-SAP-BusinessObjects-Voyager.htm"&gt;Simba website&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-870397653644012690?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/870397653644012690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=870397653644012690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/870397653644012690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/870397653644012690'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/11/simba-previews-oracle-olap-mdx-provider.html' title='Simba previews Oracle OLAP MDX Provider connectivity to SAP BusinessObjects Voyager'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-5473365035861773203</id><published>2010-11-04T13:30:00.000-07:00</published><updated>2010-12-02T05:06:16.657-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='connectivity'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Objects'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft Office'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Voyager'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Microsoft Certifies Simba’s MDX Provider for Oracle OLAP as “Compatible with Windows 7”</title><content type='html'>Simba announced today that Microsoft has certified its MDX Provider for Oracle Database OLAP Option for Windows 7.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The press release is here : &lt;a href="http://www.simba.com/news/MDX-Provider-for-Oracle-OLAP-Certified-for-Windows-7.htm"&gt;http://www.simba.com/news/MDX-Provider-for-Oracle-OLAP-Certified-for-Windows-7.htm&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is great news for MS Office connectivity to your Database OLAP cubes.  Already supported was Excel 2010 with its cool new BI features, as well as 2007 and 2003 versions.   With Windows 7 support too, even the most up-to-date PCs are in good shape to exploit the OLAP Option.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Remember - via the native Excel pivot table connectivity, other features of MS-Office can also leverage the power, performance and calculation functionality of Oracle OLAP.  So for example, your Powerpoint presentation to the senior management team, or the one you use when talking to suppliers or key customers can now contain live charts onto the latest information available in the Oracle Database cubes.  Instead of spending time cutting and pasting static images into your slide shows each day, week or period-end you can be focusing on the news in the data and doing a better analysis of the results.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the perfect complement to your use of Oracle BI Enterprise Edition (10g or 11g) onto the exact same cubes for the broader BI use-case.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In addition to Microsoft Excel,  Simba is gradually certifying other MDX front ends for the OLAP Option MDX Provider - with SAP-BusinessObjects Voyager already available and others due soon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can learn all about it on the Simba web site : &lt;a href="http://www.simba.com/MDX-Provider-for-Oracle-OLAP.htm"&gt;http://www.simba.com/MDX-Provider-for-Oracle-OLAP.htm&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Connectivity into Oracle Database OLAP 11g is market leading: with the same cubes and calculations being accessible via MDX as well as a huge range of SQL based tools and applications, it has never been easier to deploy multidimensional analytics to the masses.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-5473365035861773203?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/5473365035861773203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=5473365035861773203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5473365035861773203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5473365035861773203'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/11/microsoft-certifies-simbas-mdx-provider.html' title='Microsoft Certifies Simba’s MDX Provider for Oracle OLAP as “Compatible with Windows 7”'/><author><name>Kevin Lancaster</name><uri>http://www.blogger.com/profile/06742628997065141834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8242072980323803978</id><published>2010-10-22T08:03:00.000-07:00</published><updated>2010-10-22T08:49:14.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Write-back'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP API'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle OLAP Option'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP DML'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Cell level write-back via PL/SQL</title><content type='html'>A topic of conversation that regularly comes up when I talk to customers and developers about the OLAP Option is write-back to OLAP cubes.  The most frustrating of these conversations usually involves someone saying 'but... the OLAP Option doesn't support write-back'.  This is not the case and never has been.&lt;br /&gt;&lt;br /&gt;Since the first OLAP Option release in 9i it has always been possible to write-back to cubes via the Java OLAP API and OLAP DML.  But in recent releases, a new PL/SQL package based API has been developed.  My thanks go to the ever-excellent David Greenfield of the Oracle OLAP product development group for bringing this to my attention.&lt;br /&gt;&lt;br /&gt;At the most simple level, it is possible to write to a qualified cell:&lt;br /&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-GB&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} &lt;/style&gt; &lt;![endif]--&gt;&lt;span style=";font-family:&amp;quot;;font-size:12pt;color:black;"   &gt;&lt;/span&gt;dbms_cube.build(&lt;br /&gt; 'PRICE_COST_CUBE USING (&lt;br /&gt;   SET PRICE_COST_CUBE.PRICE["TIME" = ''24'', PRODUCT = ''26''] = 711.61, SOLVE)')&lt;br /&gt;&lt;br /&gt;In the example above, a cube solve is executed after the cell write.  The objects are referenced by their logical (ie. AWM) names.&lt;br /&gt;&lt;br /&gt;This approach is very flexible.  For example you can qualify only some dimensions, in this case the assignment is for all products:&lt;br /&gt;&lt;br /&gt;dbms_cube.build(&lt;br /&gt; 'PRICE_COST_CUBE USING (&lt;br /&gt;   SET PRICE_COST_CUBE.PRICE["TIME" = ''24''] = 711.61, SOLVE)')&lt;br /&gt;&lt;br /&gt;You can also skip the aggregation:&lt;br /&gt;&lt;br /&gt;dbms_cube.build(&lt;br /&gt; 'PRICE_COST_CUBE USING (&lt;br /&gt;   SET PRICE_COST_CUBE.PRICE["TIME" = ''24'', PRODUCT = ''26''] = 711.61)')&lt;br /&gt;&lt;br /&gt;or run multiple cell updates in one call:&lt;br /&gt;&lt;br /&gt;dbms_cube.build(&lt;br /&gt; 'PRICE_COST_CUBE USING (&lt;br /&gt;   SET PRICE_COST_CUBE.PRICE["TIME" = ''24'', PRODUCT = ''26''] = 711.61,&lt;br /&gt;   SET PRICE_COST_CUBE.PRICE["TIME" = ''27'', PRODUCT = ''27''] = 86.82,&lt;br /&gt;   SOLVE)');&lt;br /&gt;&lt;br /&gt;You can also copy from one measure to another.&lt;br /&gt;&lt;br /&gt;dbms_cube.build('UNITS_CUBE USING (SET LOCAL_CUBE.UNITS = UNITS_CUBE.UNITS'));&lt;br /&gt;&lt;br /&gt;This will copy everything from the UNITS measure in UNITS_CUBE to the UNITS measure in the LOCAL_CUBE.   You can put fairly arbitrary expressions on the right hand side and the code will attempt to loop the appropriate composite.   You can also control status.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For more details, take a look at the &lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_cube.htm#CHDFCJBF"&gt;PL/SQL reference documentation&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8242072980323803978?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8242072980323803978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8242072980323803978' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8242072980323803978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8242072980323803978'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/10/cell-level-write-back-via-plsql.html' title='Cell level write-back via PL/SQL'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8561537083165329208</id><published>2010-10-07T08:11:00.001-07:00</published><updated>2010-10-07T08:46:31.174-07:00</updated><title type='text'>Incremental Refresh of Oracle Cubes</title><content type='html'>One of the more common questions I get is about how cubes are processed, in particular how and when Oracle cubes are processed incrementally. Here is a short summary of how the cube refresh process works, a few scenarios and some suggestions on being smart about solutions.&lt;br /&gt;&lt;br /&gt;- The cube will load all data from the source table.&lt;br /&gt;&lt;br /&gt;- You can limit the data loaded into the cube by a) presenting new/changed data only via a staging table or filtered view or b) making the cube refreshable using the materialized view refresh system and using a materialized view log table.&lt;br /&gt;&lt;br /&gt;- The cube will understand if data has been loaded into a partition.  If data has not been loaded into a partition, it will not be processed (aggregated).&lt;br /&gt;&lt;br /&gt;- If a partition has had data loaded into it, it will processed (aggregated).&lt;br /&gt;&lt;br /&gt;- The cube will understand if a loaded value is new, changed or existing and unchanged.  Only new or changed values are processed (the cube attempts to aggregate only new and changed cells and their ancestors).&lt;br /&gt;&lt;br /&gt;- Changing parentage of a member in a non-partitioned dimension will trigger a full solve of the cube (across all partitions).&lt;br /&gt;&lt;br /&gt;- If a member is added to a non-partitioned dimension, the cube will attempt an incremental aggregation of that dimension (that is, the new member and ancestors only).&lt;br /&gt;&lt;br /&gt;Here are two scenarios that illustrate how this works.&lt;br /&gt;&lt;br /&gt;1) How to trigger a lot of processing in the cube during a refresh:&lt;br /&gt;&lt;br /&gt;- Load from the full fact table rather than a staging table, filtered view or MV log table.  The full table will be loaded into the cube.&lt;br /&gt;&lt;br /&gt;- Load data into many partitions.  Each partition will need to be processed. For example, load data for the last 36 months when the cube is partitioned by time.&lt;br /&gt;&lt;br /&gt;- Load data into large partitions.  For example, partition by year or quarter rather than quarter or month.  Smaller partitions will process more quickly.&lt;br /&gt;&lt;br /&gt;- Make frequent hierarchy (parentage) changes in dimensions.  For example, realign customers with new regions or reorganize the product dimension during the daily cube refresh.  This will trigger a full cube refresh.&lt;br /&gt;&lt;br /&gt;2) How to efficiently manage a daily cube refresh:&lt;br /&gt;&lt;br /&gt;- Load from staging tables, filtered views or MV log tables where the tables/views contain only new or updated fact data.  This will reduce the load step of the build.   This becomes more important the larger the fact table is.&lt;br /&gt;&lt;br /&gt;- Use as fine grained partitioning strategy as possible.  This will result in smaller partitions, which process more efficiently (full or incremental refresh) and offer more opportunity for parallel processing.  Also, it is likely that fewer partitions will be processed.&lt;br /&gt;&lt;br /&gt;There can be a trade off with query performance.  Typically, query performance is better when partitions are at a higher level (e.g., quarter rather than week) because there may be fewer partitions to access and less dynamic aggregation might be required.  That said, the gain in refresh performance is typically much greater than the loss in query performance.  Building a cube twice as fast is often more important than a small slowdown in query performance.&lt;br /&gt;&lt;br /&gt;- Only add new data into the partitioned dimension.  For example if the cube is partitioned by time, add data only for new time periods.  Only the partitions with those time periods will be refreshed.&lt;br /&gt;&lt;br /&gt;Clearly, there are many cases where data must be added to the non-partitioned dimensions.  For example, new customers might be added daily.  This is ok because a) new members are processed incrementally and b) new customers will likely affect only more recent partitions.&lt;br /&gt;&lt;br /&gt;Schedule hierarchy realignments (e.g., changing parentage in product, geography and account type dimensions) weekly instead of daily. This will limit the number of times a full refresh is required.  It might also allow you to scheduled  the full refresh for a time where the availability of system resources is high and/or the query load is low.&lt;br /&gt;&lt;br /&gt;The above scenarios help you understand how to most efficiently refresh a single cube.  Also consider business requirements and how model the overall solution  Two scenarios follow.&lt;br /&gt;&lt;br /&gt;1)  Data is available at the day, item and store levels in the fact table.  The business requirements are such that all data must be available for query, but in practice most queries (e.g., 95% or more) are at the week, item and store levels.&lt;br /&gt;&lt;br /&gt;Consider a solution where data is loaded in the cube at the week, item and city levels and more detailed data (day, item and store levels) are made available by drilling through to the table.  This is very easy to do in a product such as Oracle Business Intelligence (OBIEE) or any other tool that has federated query capabilities and will be transparent to the business user.&lt;br /&gt;&lt;br /&gt;In this case, the cube is simply smaller and will process more quickly.  The compromise is that calculations defined in the cube are only available at the week, item and city levels.  This is often a reasonable trade off for faster processing (and perhaps more frequent updates).&lt;br /&gt;&lt;br /&gt;2)  Data is available at the day, item and store levels in the fact table.  The business requirements are such that all data must be available for query, but in practice:&lt;br /&gt;&lt;br /&gt;- Longer term trending (e.g., year over year) is done at the week level or higher.&lt;br /&gt;&lt;br /&gt;- Analysis of daily data (e.g., same day, week or month ago) is only done for the most recent 90 days.&lt;br /&gt;&lt;br /&gt;In this scenario, consider a two cube solution:&lt;br /&gt;&lt;br /&gt;- Cube A contains data at the week, item and store levels for all history (e.g., the past 36 months).  This might be partitioned at the week level and aggregated to the month, quarter and year levels.  Depending on reporting requirements, it might only be refreshed at the end of the week when the full week of data is available.&lt;br /&gt;&lt;br /&gt;- Cube B contains data only at the day level for the most recent 90 days.  It is not aggregated to the week, month, quarter and year levels (aggregates are serviced by Cube A).  This cube is used for the daily sales analysis. This might be partitioned at the day level so that a) any full build of the cube can be highly parallelized and b) the daily update processes only a single and relatively small partition.&lt;br /&gt;&lt;br /&gt;Using a tool such as Oracle Business Intelligence, which has federated query capabilities, a single business model can be created that accesses data from both cubes and the table transparently to the business user.  When ever the user is querying at the week level or above, data OBIEE queries Cube A.  If data is queried at the day level within the most recent 90 days, OBIEE queries Cube B.  If data at the day level that is older than 90 days is access, OBIEE queries the table.  Again, this can all be transparent to the user in a tool such as Oracle Business Intelligence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8561537083165329208?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8561537083165329208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8561537083165329208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8561537083165329208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8561537083165329208'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/10/incremental-refresh-of-oracle-cubes.html' title='Incremental Refresh of Oracle Cubes'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-740811084021382689</id><published>2010-09-18T10:16:00.000-07:00</published><updated>2010-09-18T10:33:57.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenWorld'/><title type='text'>Simba Technologies and Vlamis Software Solutions hosting special reception at OpenWorld 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT3VJen-MI/AAAAAAAAAX0/GqXeUa8j1FE/s1600/image003.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 332px; height: 400px;" src="http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT3VJen-MI/AAAAAAAAAX0/GqXeUa8j1FE/s400/image003.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5518307386129381570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please join &lt;b&gt;Simba Technologies&lt;/b&gt; and &lt;b&gt;Vlamis Software Solutions&lt;/b&gt; at a special OpenWorld 2010 reception for current and prospective &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;Oracle&lt;/span&gt;&lt;/b&gt; OLAP users.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cocktails and hors d’oeuvres will be served.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Time&lt;/b&gt;:     Tuesday, September 21st, 2010 - 5pm – 7pm&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;b&gt;Location&lt;/b&gt;: &lt;i&gt;walking distance from Moscone Center.  Please RSVP for location&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By Invitation Only. RSVP to &lt;a href="mailto:events@simba.com"&gt;events@simba.com&lt;/a&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT09zqMssI/AAAAAAAAAXk/ORncFKOLptg/s1600/image005.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 80px; height: 92px;" src="http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT09zqMssI/AAAAAAAAAXk/ORncFKOLptg/s400/image005.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5518304786112099010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT1RXc6Y0I/AAAAAAAAAXs/RPMD0RpnhVs/s1600/image009.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 163px; height: 68px;" src="http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT1RXc6Y0I/AAAAAAAAAXs/RPMD0RpnhVs/s400/image009.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5518305122137563970" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-740811084021382689?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/740811084021382689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=740811084021382689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/740811084021382689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/740811084021382689'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/09/simba-technologies-and-vlamis-software.html' title='Simba Technologies and Vlamis Software Solutions hosting special reception at OpenWorld 2010'/><author><name>keith laker</name><uri>http://www.blogger.com/profile/13350994132294695189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_5ecFmVOLrwo/R6HKVXSqHjI/AAAAAAAAAQM/Qm7-vRHTn1o/S220/Me2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5ecFmVOLrwo/TJT3VJen-MI/AAAAAAAAAX0/GqXeUa8j1FE/s72-c/image003.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-5885217883669565169</id><published>2010-09-17T08:35:00.000-07:00</published><updated>2010-09-17T08:40:50.012-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simba'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenWorld'/><category scheme='http://www.blogger.com/atom/ns#' term='Vlamis'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle OLAP Option'/><title type='text'>Special OpenWorld 2010 Cocktail Reception</title><content type='html'>Join us! Simba Technologies and Vlamis Software Solutions are celebrating Oracle OLAP with a reception for current and prospective users. Please contact &lt;a href="mailto:events@simba.com"&gt;events@simba.com&lt;/a&gt; for exact location. Tuesday September 21, 2010 from 5-7PM. Walking distance from Moscone.&lt;br /&gt;&lt;br /&gt;Simba product managers will also be available at the Oracle OLAP pod in Moscone West to answer questions you might have about Excel Pivot Tables and the MDX Provider for Oracle OLAP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-5885217883669565169?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/5885217883669565169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=5885217883669565169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5885217883669565169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5885217883669565169'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/09/special-openworld-2010-cocktail.html' title='Special OpenWorld 2010 Cocktail Reception'/><author><name>Jameson White</name><uri>http://www.blogger.com/profile/04697460456284466583</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://2.bp.blogspot.com/_X9IIIlqnGNs/TA06AFHyU2I/AAAAAAAAAKE/0w_ino9R4MU/S220/jameson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-4436446776000949435</id><published>2010-08-10T04:02:00.000-07:00</published><updated>2010-09-09T07:58:33.443-07:00</updated><title type='text'>Discoverer OLAP is certified with OLAP 11g</title><content type='html'>A few people have asked me recently when an updated version of Discoverer OLAP will be released that supports the 11g OLAP Option.&lt;span style=""&gt;    &lt;/span&gt;The answer is simple - it has already been released!!   (but I guess that many people missed it because it was bundled as part of a broader patchset and not widely announced)&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dg4JGcRB6lM/TGE2fEuw4aI/AAAAAAAAACw/1ZvX0CPspKo/s1600/sshot.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_dg4JGcRB6lM/TGE2fEuw4aI/AAAAAAAAACw/1ZvX0CPspKo/s400/sshot.jpg" alt="" id="BLOGGER_PHOTO_ID_5503740127097184674" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;If you are interested, you can download it from OTN under &lt;a href="http://www.oracle.com/technetwork/middleware/downloads/fmw-11-download-092893.html"&gt;&lt;span class="boldbodycopy"&gt;Portal,                    Forms, Reports and Discoverer (11.1.1.3.0)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;An updated version of the BI Spreadsheet add-in has been released too and can also be downloaded from &lt;a href="http://www.oracle.com/technetwork/middleware/bi-foundation/downloads/download-088181.html"&gt;OTN&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-4436446776000949435?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/4436446776000949435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=4436446776000949435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4436446776000949435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4436446776000949435'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/08/discoverer-olap-is-certified-with-olap.html' title='Discoverer OLAP is certified with OLAP 11g'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dg4JGcRB6lM/TGE2fEuw4aI/AAAAAAAAACw/1ZvX0CPspKo/s72-c/sshot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-5469506668689693035</id><published>2010-07-20T14:53:00.000-07:00</published><updated>2010-08-16T02:05:28.448-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OBIEE'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Access'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>A first look at OBIEE 11g with Oracle OLAP</title><content type='html'>For those who missed it, the global launch for &lt;a href="http://www.oracle.com/oms/businessintelligence11g/index.html"&gt;the 11g release of the Oracle Business Intelligence Enterprise Edition suite (OBIEE)&lt;/a&gt; took place in London on July 7th.&lt;br /&gt;&lt;br /&gt;And the fantastic news for Oracle OLAP customers is that OBIEE 11g will work out-of-the-box with Oracle OLAP in almost exactly the same way as OBIEE 10g does - with just one additional configuration step required to enable the new OLAP-style front-end functionality.&lt;br /&gt;&lt;br /&gt;Of course, there are other features that are relevant such as the WebLogic application server, and the new security model, but these have already been well blogged elsewhere so the focus of this posting will be Oracle OLAP integration.&lt;br /&gt;&lt;br /&gt;To illustrate how easy it is, I will use a trusted old friend as a starting point - the &lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/samples/schemas/global_11g_schema.zip"&gt;11g Global sample schema&lt;/a&gt;.  I have installed this in an Oracle 11.2 database instance, created an Oracle OLAP Analytic Workspace, and then refreshed this AW so that the dimensions and cubes are built.&lt;br /&gt;&lt;br /&gt;With an AW in place, the next step is to use &lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/awm_plugin/biee/awm_plugin_biee.html"&gt;the OBIEE plug-in for AWM&lt;/a&gt; to generate the metadata required for the OBIEE Server.  For those who have not used the plug-in before, check out this &lt;a href="http://download.oracle.com/otndocs/products/warehouse/olap/videos/obiee_plug_in_for_awm/OBIEE_Plugin.html"&gt;excellent demonstration of how it works&lt;/a&gt;.  While this particular version of the plug-in was originally released to work with OBIEE 10g, and presumably an updated version will be released in due course, it can be used in exactly the same way in OBIEE 11g to import metadata into the Administration tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dg4JGcRB6lM/TEYvTTYIP_I/AAAAAAAAABo/sdS9YlvPCpE/s1600/sshot1.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 208px;" src="http://2.bp.blogspot.com/_dg4JGcRB6lM/TEYvTTYIP_I/AAAAAAAAABo/sdS9YlvPCpE/s400/sshot1.JPG" alt="" id="BLOGGER_PHOTO_ID_5496132403917766642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And at first glance, aside from a few updated icons, this version of the Administration tool looks very similar, but the biggest change related to the administration of OLAP data sources (relational or MOLAP) is the ability to map hierarchy objects right through into the presentation layer.&lt;br /&gt;&lt;br /&gt;Here is the Metadata generated by the plug-in for the Channel Dimension in both the Business Model and Presentation layers&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dg4JGcRB6lM/TEcnnIFtcuI/AAAAAAAAACA/lQTmQJZgp4U/s1600/sshot2.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 195px;" src="http://3.bp.blogspot.com/_dg4JGcRB6lM/TEcnnIFtcuI/AAAAAAAAACA/lQTmQJZgp4U/s400/sshot2.jpg" alt="" id="BLOGGER_PHOTO_ID_5496405423368794850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The new 11g OLAP-style front-end functionality is enabled by adding these hierarchies into the Presentation layer too.  This can be achieved by a simple click-and-drag for each hierarchy like the following which is again for the Channel Dimension&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dg4JGcRB6lM/TEco_C60doI/AAAAAAAAACI/762tYjcq85I/s1600/sshot3.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 193px;" src="http://2.bp.blogspot.com/_dg4JGcRB6lM/TEco_C60doI/AAAAAAAAACI/762tYjcq85I/s320/sshot3.jpg" alt="" id="BLOGGER_PHOTO_ID_5496406933809428098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hopefully, the next release of the plug-in will handle this additional step automatically (and also provide support for value-based hierarchies which were not supported by the front-end in OBIEE 10g) but in the meantime it really is just a simple click-and-drag for each dimension.&lt;br /&gt;&lt;br /&gt;Once all the hierarchies are mapped through into the Presentation Layer, the cube is ready to query.   I can log into the OBIEE 11g home page and create a new analysis based upon my Oracle OLAP subject area.  The new hierarchies are available for selection when I construct a query&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dg4JGcRB6lM/TEhqJGty1DI/AAAAAAAAACQ/08YKEwA3-kQ/s1600/sshot4.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 319px;" src="http://1.bp.blogspot.com/_dg4JGcRB6lM/TEhqJGty1DI/AAAAAAAAACQ/08YKEwA3-kQ/s400/sshot4.jpg" alt="" id="BLOGGER_PHOTO_ID_5496760049859744818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I can then select all of the 'columns' I need for my query and view the results as a pivot table.  Here is a really simple example showing Sales by Time.  I have also added some calculated measures which have been created inside the AW and derive really useful analytics from the Sales measure.  This is a classic reason for using the OLAP Option in the first place - it facilitates the easy creation of calculations that are difficult (or often impossible) to express in SQL.  And by having them embedded in the cube, the only thing that the SQL tool (in this case OBIEE) needs to do is select the calculation as a field in a view.  How easy is that?!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dg4JGcRB6lM/TEmq58zyvSI/AAAAAAAAACg/uf8lu1xeMtE/s1600/sshot6.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 230px;" src="http://1.bp.blogspot.com/_dg4JGcRB6lM/TEmq58zyvSI/AAAAAAAAACg/uf8lu1xeMtE/s400/sshot6.jpg" alt="" id="BLOGGER_PHOTO_ID_5497112732735028514" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_dg4JGcRB6lM/TEhs6epXDuI/AAAAAAAAACY/Fgvi18zXqlE/s1600/sshot5.jpg"&gt;&lt;br /&gt;&lt;/a&gt;Once a pivot table with Hierarchy-based columns has been created, this is where the new front-end features really come into play.  Some highlights include Calculated Items (derived Dimension members) and a new Selector (which allows dimension selections to be built up as a series of steps based upon add/keep/remove logic):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dg4JGcRB6lM/TE8GxlNyu4I/AAAAAAAAACo/O0Tc7brInHY/s1600/sshot7.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 278px;" src="http://2.bp.blogspot.com/_dg4JGcRB6lM/TE8GxlNyu4I/AAAAAAAAACo/O0Tc7brInHY/s400/sshot7.jpg" alt="" id="BLOGGER_PHOTO_ID_5498621118915984258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;For those familiar with Discoverer OLAP, or Sales Analyzer, Financial Analyzer and Express Objects/Analyzer, these aren't exactly revolutionary features, but combined with all the other great features of the OBIEE suite, this is now a very compelling platform for your Oracle OLAP data.&lt;br /&gt;&lt;br /&gt;Finally, I would guess that there are probably thousands of old Oracle Express/OLAP systems that have been waiting for a BI platform like this.  If you work on one, what are you waiting for?&lt;br /&gt;&lt;br /&gt;***&lt;a href="http://www.oracle.com/technetwork/middleware/bi-enterprise-edition/downloads/index.html"&gt;OBIEE 11g can now be downloaded from OTN&lt;/a&gt;***&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-5469506668689693035?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/5469506668689693035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=5469506668689693035' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5469506668689693035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5469506668689693035'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/07/first-look-at-obiee-11g-with-oracle.html' title='A first look at OBIEE 11g with Oracle OLAP'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_dg4JGcRB6lM/TEYvTTYIP_I/AAAAAAAAABo/sdS9YlvPCpE/s72-c/sshot1.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-7440117532382846400</id><published>2010-06-18T07:56:00.000-07:00</published><updated>2010-06-18T08:54:28.463-07:00</updated><title type='text'>Bissantz DeltaMaster - Cool Tool for OLAP</title><content type='html'>&lt;p&gt;I recently returned from a trip to Germany where visted a Bissantz, a relatively small company in Nürnburg that develops and markets an interesting reporting and data visualization tool named DeltaMaster that works with Oracle OLAP (and other data sources). I was very impressed with this tool. There are few things that I really liked about it:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It's very good at displaying a lot of information within a single report. One of the ways that it does this is by mixing graphical representations of data with numerical representation (they are very big on something called 'Sparklines'). This makes it very easy to create a single report that includes data on, for example, sales for the current quarter but also provides indications of sales trends and shares.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The presentation of data is very clean. While the reports themselves are very sophisticated, the developers have done a terrific job of presenting them to users. The presentation tends to be more functional than fluffy, but it's done very well. It is easy on the eyes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;DeltaMaster goes way beyond basic cross tabs and charts. There are prebuilt reports / analysis templates for rankings, concentration analysis, portfolio analysis, etc. There's quite a few different types of pre-built analysis and I won't try to do justice to them here. See for yourself.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It works better on OLAP than tables. I'm obviously biased when it comes to this topic, but for the end user this means more analytic power and flexibility.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Below is a concentration analysis report. This is along the lines of a Pareto chart. There are many different types of built-in analysis, but this one looks nice in the confined space of this blog's page.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/TBuQsElrdZI/AAAAAAAAAE8/SpvBb7S9orA/s1600/dm1.JPG"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 271px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5484136058074133906" border="0" alt="" src="http://1.bp.blogspot.com/_2lLO4bE4a8Y/TBuQsElrdZI/AAAAAAAAAE8/SpvBb7S9orA/s400/dm1.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some links:&lt;/p&gt;&lt;p&gt;The DeltaMaster page at Bissantz: &lt;a href="http://www.bissantz.com/products/"&gt;http://www.bissantz.com/products/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A clever blog by Bella, the Bissantz company dog: &lt;a href="http://www.bella-consults.com/"&gt;http://www.bella-consults.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Bella, if you happen to find your way to this blog, here's a 'hello' from Henry (the OLAP product manager's dog).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/TBuVgnolNnI/AAAAAAAAAFM/vvG4O7pQXCY/s1600/henry2.bmp"&gt;&lt;img style="WIDTH: 255px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5484141358881257074" border="0" alt="" src="http://1.bp.blogspot.com/_2lLO4bE4a8Y/TBuVgnolNnI/AAAAAAAAAFM/vvG4O7pQXCY/s400/henry2.bmp" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-7440117532382846400?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/7440117532382846400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=7440117532382846400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7440117532382846400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7440117532382846400'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/06/bissantz-deltamaster-cool-tool-for-olap.html' title='Bissantz DeltaMaster - Cool Tool for OLAP'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2lLO4bE4a8Y/TBuQsElrdZI/AAAAAAAAAE8/SpvBb7S9orA/s72-c/dm1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-4912536049763027567</id><published>2010-05-06T06:26:00.000-07:00</published><updated>2010-05-06T08:02:34.092-07:00</updated><title type='text'>Time Dimensions with Hourly Time Periods</title><content type='html'>I was working on an application last week that required time series analysis at Hour, Day, Month, Quarter and Year levels.  Two interesting things came out of this application.&lt;br /&gt;&lt;br /&gt;First, a little implementation detail.  The data was supplied in the fact and dimension tables at the Hour level with a TIMESTAMP data type.  As you might expect then, there were time periods at the hour level such as:&lt;br /&gt;&lt;br /&gt;02-JAN-10 10.00.00.000000000 AM&lt;br /&gt;02-JAN-10 11.00.00.000000000 AM&lt;br /&gt;02-JAN-10 12.00.00.000000000 PM&lt;br /&gt;02-JAN-10 01.00.00.000000000 PM&lt;br /&gt;02-JAN-10 02.00.00.000000000 PM&lt;br /&gt;&lt;br /&gt;In my first attempt at building the time dimension I loaded hours directly from TIMESTAMP data type.  In that case, the members at Hour level were loaded into the dimension stripped of the hour (e.g., 02-JAN-10).  Since this isn't what I wanted, I converted the hours into a CHAR as follows:&lt;br /&gt;&lt;br /&gt;CREATE VIEW time_dim_view AS&lt;br /&gt;SELECT&lt;br /&gt;   TO_CHAR(hour_id, 'DD-MON-YYYY HH24') AS hour_id,&lt;br /&gt;   TO_CHAR(hour_id, 'DD-MON-YYYY HH24') AS hour_desc,&lt;br /&gt;   hour_time_span,&lt;br /&gt;   hour_id AS hour_end_date,&lt;br /&gt;   .. and so on.&lt;br /&gt;&lt;br /&gt;This gave me dimension members at hour as follows:&lt;br /&gt;&lt;br /&gt;01-JAN-2010 00&lt;br /&gt;01-JAN-2010 01&lt;br /&gt;01-JAN-2010 02&lt;br /&gt;01-JAN-2010 03&lt;br /&gt;01-JAN-2010 04&lt;br /&gt;&lt;br /&gt;That worked just fine. I did the same for the descriptions (so that they would be more easily readable by end users) and added a corresponding column to a fact view so that the time view and fact view joined correctly on the TO_CHAR(...) columns.&lt;br /&gt;&lt;br /&gt;For the TIME SPAN attribute, I used a fractional value of DAY  (0.041667, which is 1/24th of a day).  I read the DATETIME into the END DATE attribute as is (no conversion required).  From there on, everything worked perfectly (cube builds, time series calculations, etc).&lt;br /&gt;&lt;br /&gt;If you happen to look at the END DATE attribute from the OLAP DML side, be sure to wrap the END_DATE object in a TO_CHAR function so that you see the hours.  Otherwise, you will see only the day in most cases (it depends on the NLS_DATE_FORMAT setting for the session).  For example:&lt;br /&gt;&lt;br /&gt;REPORT DOWN TIME TO_CHAR(TIME_END_DATE 'DD_MON_YYYY HH24')&lt;br /&gt;&lt;br /&gt;The other thing that was interesting has more to do with the application design.  As so often happens, the customer was inclined to build one cube with all history at the hour level (two years of history).  When examining the reporting requirements, however, it turned out that hour level analysis very rarely occurs more than 2 month back.  Almost all of the reporting looking back over the two years was at the day level or higher (that is, not hourly level reporting).&lt;br /&gt;&lt;br /&gt;We could have built the one cube (two years, hour and higher), but most of the processing of hour level data would have been a waste because users don't look at the older data at that level.  Instead, we built a very efficient application with two cubes.  One cube contained only three months of data at the hour, day, month, quarter and year levels.  Another cube contained two years of history starting at the day level.&lt;br /&gt;&lt;br /&gt;Presentation of the data is mostly done using Oracle Business Intelligence Enterprise Edition(via SQL to the cube).  Some reports examine hourly level data.  Other reports examine more aggregate data over longer time periods.  Time series calculations (e.g., period to date, moving average, etc.) were added to both cubes and made available in the OBIEE reports.&lt;br /&gt;&lt;br /&gt;Occasionally, a user will want to drill from day to hour more than three months back.  To support this, OBIEE was set up to drill from day (in the two year cube) to hour in the fact table.  The only compromise was that the time series calculations of the cube were not available when drilling to hour in the fact table.  That didn't matter to these users.&lt;br /&gt;&lt;br /&gt;From the end user perspective, the fact that there were two cubes instead of one (as well as a fact table) was completely irrelevant since OBIEE presented all data in reports in a single dashboard.  From a processing perspective, the system was much more efficient and manageable as compared to the single big cube approach.&lt;br /&gt;&lt;br /&gt;It is very worthwhile to keep this lesson in mind when you design your applications.  Pay careful attention to reporting requirements and build cubes that meet those requirements.  You can tie multiple cubes together in a tool such as OBIEE.  This approach is often much better then building a single cube every level of detail.&lt;br /&gt;&lt;br /&gt;In this case, the example is about what level of detail is in which cube.  The same concept applies to dimensions.  You might find it much more efficient to build Cube 1 with dimensions A, B, C and D and Cube 2 with dimensions A, B, E and F rather than one big cube with all dimensions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-4912536049763027567?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/4912536049763027567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=4912536049763027567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4912536049763027567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4912536049763027567'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/05/time-dimensions-with-hourly-time.html' title='Time Dimensions with Hourly Time Periods'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-4122703568284010908</id><published>2010-03-16T11:44:00.000-07:00</published><updated>2010-03-16T12:37:16.706-07:00</updated><title type='text'>Parallel Execution of OLAP DML</title><content type='html'>While I was teaching a workshop in Moscow recently a student asked about parallel execution of OLAP DML. Their cube processing included the usual loading and aggregation, which are automatically parallelized, but they also have some assignments into the cube which are done using an OLAP DML program. They noted that this was slow because it was single threaded on one CPU. I told the student that Oracle OLAP supports a multi-write attach mode that can be used to update multiple objects in parallel using separate sessions. I checked the documentation, but didn't find a clear explanation of how this works in the context of processing partitions of a cube in parallel.&lt;br /&gt;&lt;br /&gt;Here's a code sample that illustrates how to process partitions of a cube in parallel. For this example, assume that the cube has four dimensions: time, product, geography and channel. The cube is partitioned on the time dimension at the retail year level. An OLAP DML program is used to assign data into the cube at the day level (it will be aggregated later).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;" Attach the AW&lt;br /&gt;AW ATTACH global_business multi&lt;br /&gt;&lt;br /&gt;" Set status of time to match the partition. In this example, the partition is 'P3'&lt;br /&gt;LIMIT time TO PARTITION(sales_prt_template) EQ 'P3'&lt;br /&gt;&lt;br /&gt;" Keep data at the day level.&lt;br /&gt;LIMIT time KEEP time_levelrel 'DAY'&lt;br /&gt;&lt;br /&gt;" Set status of other dimensions.&lt;br /&gt;LIMIT product TO product_levelrel 'ITEM'&lt;br /&gt;LIMIT geography TO geography_levelrel 'STATE_PROVINCE'&lt;br /&gt;LIMIT store TO store_levelrel 'STORE'&lt;br /&gt;&lt;br /&gt;" Acquire the partition for write.&lt;br /&gt;ACQUIRE RESYNC sales_stored_stored (PARTITION p3)&lt;br /&gt;&lt;br /&gt;" OLAP DML assignments.&lt;br /&gt;sales_stored(sales_measure_dim 'DOLLAR_SALES') = sales_stored(sales_measure_dim 'QUANTITY') * price_stored(price_measure_dim 'PRICE') across sales_stored_prt_template&lt;br /&gt;&lt;br /&gt;" Update and commit to save work.&lt;br /&gt;UPDATE multi&lt;br /&gt;COMMIT&lt;br /&gt;&lt;br /&gt;" Release the partition.&lt;br /&gt;RELEASE sales_stored (partition p3)&lt;br /&gt;&lt;br /&gt;" Detach the AW&lt;br /&gt;AW DETACH global_business&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The important points are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The attach mode is MULTI&lt;/li&gt;&lt;li&gt;Use ACQUIRE to attach the appropriate partition.&lt;/li&gt;&lt;li&gt;The PARTITION function can be used to set status of the partitioned dimension to the dimension members in the partition.&lt;/li&gt;&lt;li&gt;Use the MULTI keyword with UPDATE.&lt;/li&gt;&lt;li&gt;RELEASE the partition.&lt;/li&gt;&lt;li&gt;While it doesn't have anything to do with running this in parallel, "across sales_stored_prt_template" will cause the OLAP DML to loop the local composite index of the partition rather than loop over the base dimensions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Repeat this code (or use parameters) for each partition. To run in parallel, run these commands in seperate database sessions for each partition. The above code sample is pure OLAP DML. In practice, it makes sense to execute this in the context of PL/SQL that you can call in separate SQL Plus sessions. E.g., &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;BEGIN&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Attach the AW in multi-write model.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('AW ATTACH global_business multi');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Set status of time to match the partition.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('LIMIT time TO PARTITION sales_prt_template) EQ ''P1''');&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('LIMIT time KEEP time_levelrel ''DAY'''); &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Set status of other dimensions.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('LIMIT product TO product_levelrel ''ITEM''');&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('LIMIT geography TO geography_levelrel ''STATE_PROVINCE''');&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('LIMIT store TO store_levelrel ''STORE''');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Aquire the partition for write.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('ACQUIRE RESYNC sales_stored_stored (PARTITION p1)');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- OLAP DML assigment.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('sales_stored(sales_measure_dim ''DOLLAR_SALES'') = sales_stored(sales_measure_dim ''QUANTITY'') * price_stored(price_measure_dim ''PRICE'') across sales_prt_template'); &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Update to save work.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('UPDATE multi');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Release the partition.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dbms_aw.execute('RELEASE sales_stored_stored (partition p1)');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;-- Detach the AW&lt;br /&gt;dbms_aw.execute('AW DETACH global_business');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;END;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;COMMIT;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If this is done with PL/SQL, then you can run a shell script such as this to run all partitions in parallel.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;sqlplus olaptrain/***** @set_sales_cost_p1.sql &amp;amp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sqlplus olaptrain/***** @set_sales_cost_p2.sql &amp;amp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sqlplus olaptrain/***** @set_sales_cost_p3.sql &amp;amp;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;sqlplus olaptrain/***** @set_sales_cost_p4.sql &amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-4122703568284010908?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/4122703568284010908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=4122703568284010908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4122703568284010908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4122703568284010908'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/03/parallel-execution-of-olap-dml.html' title='Parallel Execution of OLAP DML'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1116549216187576359</id><published>2010-02-23T06:41:00.001-08:00</published><updated>2010-02-23T07:08:46.323-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simba'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Cubes'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>Excel and Oracle OLAP - Reporting No-Agg Measures</title><content type='html'>I've run into this a few times recently, so here's a quick tip related to using Excel with Oracle OLAP (via the Simba MDX Provider for Oracle OLAP, of course).&lt;br /&gt;&lt;br /&gt;Here's a situation that's been reported as a bug, but you really just need to know the right Excel Pivot Table option to choose. Consider a cube that has measures that do not aggregate but is dimensioned by a dimension with a hierarchy. In this case, there is a cube with a Store dimension with levels Store &gt; Store Type &gt; All Stores. The stores are located in different countries and sell in local currencies. There is a Local Currency measure, with sales reported in whatever the local currencies might be (Euros, Dollars, Yen, etc.) and a Dollar Sales measure with the U.S. Dollar conversation. As a common currency, Dollars can be aggregated. Local currencies can't be aggregated.&lt;br /&gt;&lt;br /&gt;Here's a sample report in Excel.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/S4Pr2lP0W1I/AAAAAAAAAEU/ljLWdgfvqnc/s1600-h/EXCEL_1.JPG"&gt;&lt;img style="WIDTH: 316px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441452097737612114" border="0" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/S4Pr2lP0W1I/AAAAAAAAAEU/ljLWdgfvqnc/s400/EXCEL_1.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that Dollar Sales is reported for Direct and Indirect but Local Sales is not. That's correct because Local Sales doesn't aggregate.&lt;br /&gt;&lt;br /&gt;But what if I happen to select only Local Sales (which is null at the aggregate members Direct and Indirect). By default, Excel will display the report as shown below.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/S4PsocC1oNI/AAAAAAAAAEc/OWZg3dYxhbQ/s1600-h/excel_2.JPG"&gt;&lt;img style="WIDTH: 279px; HEIGHT: 308px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441452954260709586" border="0" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/S4PsocC1oNI/AAAAAAAAAEc/OWZg3dYxhbQ/s400/excel_2.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This isn't very useful because I can't drill down on the Direct member to get at the stores. The solution is simple, but a lot of people seem to miss it. Just choose the Show items with no data in rows PivotTable option.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_2lLO4bE4a8Y/S4PtRcGnOFI/AAAAAAAAAEk/8buqwEjmcwY/s1600-h/excel_3.JPG"&gt;&lt;img style="WIDTH: 385px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441453658651179090" border="0" alt="" src="http://2.bp.blogspot.com/_2lLO4bE4a8Y/S4PtRcGnOFI/AAAAAAAAAEk/8buqwEjmcwY/s400/excel_3.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you will be able to see the Direct and Indirect members, allowing you to drill to stores.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_2lLO4bE4a8Y/S4PtzZX3E_I/AAAAAAAAAEs/G1YNdZgKY-4/s1600-h/excel_4.JPG"&gt;&lt;img style="WIDTH: 288px; HEIGHT: 337px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441454242033767410" border="0" alt="" src="http://2.bp.blogspot.com/_2lLO4bE4a8Y/S4PtzZX3E_I/AAAAAAAAAEs/G1YNdZgKY-4/s400/excel_4.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, after the drill.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_2lLO4bE4a8Y/S4PuJheq3WI/AAAAAAAAAE0/ckitnXfOHZE/s1600-h/excel_5.JPG"&gt;&lt;img style="WIDTH: 279px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441454622166932834" border="0" alt="" src="http://2.bp.blogspot.com/_2lLO4bE4a8Y/S4PuJheq3WI/AAAAAAAAAE0/ckitnXfOHZE/s400/excel_5.JPG" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1116549216187576359?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1116549216187576359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1116549216187576359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1116549216187576359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1116549216187576359'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/02/excel-and-oracle-olap-reporting-no-agg.html' title='Excel and Oracle OLAP - Reporting No-Agg Measures'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2lLO4bE4a8Y/S4Pr2lP0W1I/AAAAAAAAAEU/ljLWdgfvqnc/s72-c/EXCEL_1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8377593873889946760</id><published>2010-02-11T08:03:00.000-08:00</published><updated>2010-02-11T08:08:26.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><category scheme='http://www.blogger.com/atom/ns#' term='Exadata'/><title type='text'>Oracle Exadata: A Single Source of Truth (New Video)</title><content type='html'>&lt;p style="clear: both"&gt;Over the last 6-9 months we have been releasing a series of videos on YouTube under the banner of "DBA2.0" (a quick search on YouTube will list all these videos). These videos follow the work of a dedicated team of DBAs and business users as they try to get their jobs done in an environment that just keeps throwing up new challenges. Fortunately, Oracle is there to save the day...&lt;/p&gt;&lt;p style="clear: both"&gt;This latest scenario deals with data warehousing and specifically Exadata. It is in two parts and the first installment has just been released - "&lt;strong&gt;&lt;em&gt;Oracle Exadata: A Single Source of Truth&lt;/em&gt;&lt;/strong&gt;". Here is the story so far:&lt;/p&gt;&lt;blockquote style="clear: both"&gt;&lt;p&gt;&lt;i&gt;A stroll through the halls of your IT department may reveal that there is no love lost between the DBAs and business analysts they support. In today's hyper competitive environment, business analysts need to perform more and more predictive analytics and they want the answers yesterday, but managing separate BI and OLAP servers and ensuring fast query performance can be a challenge for DBAs.&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="clear: both"&gt;Watch this short video to see how the dynamic DBA duo address this challenge using Oracle Exadata, forging a truce with their new business analyst and even getting her to crack a smile - sort of.&lt;/p&gt;&lt;p style="clear: both"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=WgVSu-4Mizs"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 308px;" src="http://2.bp.blogspot.com/_5ecFmVOLrwo/S3Qq6G6zEnI/AAAAAAAAAXM/pCqMDh_PZjM/s400/YouTube.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5437017827921039986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="clear: both"&gt; Enjoy this video at &lt;a href="http://www.youtube.com/watch?v=WgVSu-4Mizs" title="Oracle Exadata:Single Source of Truth!" target="_blank"&gt;http://www.youtube.com/watch?v=WgVSu-4Mizs&lt;/a&gt; and stay tuned for Part 2 which will be available shortly...&lt;/p&gt;&lt;p style="clear: both"&gt;(&lt;em&gt;&lt;u&gt;Please Note: &lt;/u&gt;&lt;/em&gt;&lt;em&gt;&lt;u&gt;No DBAs or Business Analysts were harmed in the making of these videos&lt;/u&gt;&lt;/em&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8377593873889946760?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8377593873889946760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8377593873889946760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8377593873889946760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8377593873889946760'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/02/oracle-exadata-single-source-of-truth.html' title='Oracle Exadata: A Single Source of Truth (New Video)'/><author><name>keith laker</name><uri>http://www.blogger.com/profile/13350994132294695189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_5ecFmVOLrwo/R6HKVXSqHjI/AAAAAAAAAQM/Qm7-vRHTn1o/S220/Me2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5ecFmVOLrwo/S3Qq6G6zEnI/AAAAAAAAAXM/pCqMDh_PZjM/s72-c/YouTube.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1567045595193734373</id><published>2010-02-10T03:02:00.000-08:00</published><updated>2010-02-10T03:14:46.934-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='MindMapping'/><title type='text'>Using MindMapping to view OLAP hierarchies...</title><content type='html'>I came across this interesting article by accident. One thing I have always wanted within AWM is a way of viewing a hierarchy or series of hierarchies. In the old days of Express I wrote a various Express programs, EIS code (who remembers Express EIS?), Express Objects extensions,  that would list out a hierarchy. However, this article by Robert Brooke takes this idea way beyond anything I have seen because it uses the open source tool called MindMapping. Take a look at the series of articles Robert has written:&lt;div&gt;&lt;div&gt; &lt;blockquote&gt;&lt;a href="http://ofaworld.wordpress.com/2010/02/09/ofa-mindmapping/"&gt;http://ofaworld.wordpress.com/2010/02/09/ofa-mindmapping/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ofaworld.wordpress.com/2009/06/10/sample-olap-dml-code-gplcode/"&gt;http://ofaworld.wordpress.com/2009/06/10/sample-olap-dml-code-gplcode/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ofaworld.wordpress.com/2009/12/01/oracle-olap-mindmapping/"&gt;http://ofaworld.wordpress.com/2009/12/01/oracle-olap-mindmapping/&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt; Now that is cool! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I am thinking if we could just add the MindMapping GUI into AWM and somehow allow people to build a hierarchy visually using the MindMapping GUI that would be something. This would give AWM a very powerful way of designing a hierarchy in a live/interactive manner. One for the OLAP PM team - &lt;i&gt;I think&lt;/i&gt;.  In the short-term I think it might be possible to use the AWM extension API to add the MindMapping GUI to AWM menus but this would simply launch an the MindMapping tools outside of AWM but that might be sufficient for the moment?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nice one Robert!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1567045595193734373?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://ofaworld.wordpress.com/2009/12/01/oracle-olap-mindmapping/' title='Using MindMapping to view OLAP hierarchies...'/><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1567045595193734373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1567045595193734373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1567045595193734373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1567045595193734373'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2010/02/using-mindmapping-to-view-olap.html' title='Using MindMapping to view OLAP hierarchies...'/><author><name>keith laker</name><uri>http://www.blogger.com/profile/13350994132294695189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_5ecFmVOLrwo/R6HKVXSqHjI/AAAAAAAAAQM/Qm7-vRHTn1o/S220/Me2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-973050560986261710</id><published>2009-11-04T13:57:00.000-08:00</published><updated>2009-11-04T14:42:51.347-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cube'/><category scheme='http://www.blogger.com/atom/ns#' term='query rewrite'/><category scheme='http://www.blogger.com/atom/ns#' term='materialized view'/><category scheme='http://www.blogger.com/atom/ns#' term='summary management'/><title type='text'>Creating Cubes with Simple SQL</title><content type='html'>If you didn't look carefully at some of the Oracle OLAP 11.2 collateral there's a very interesting new feature that you've probably missed, the ability to create Oracle cubes and dimensions using only SQL.  This feature is implemented at the CREATE_MVIEW program in the DBMS_CUBE package.&lt;br /&gt;&lt;br /&gt;Here's how it works.  You define SQL dimension objects and a table-based materialized view and then run the DBMS_CUBE.CREATE_MVIEW program.  This program will (1) create an analytic workspace, (2) create OLAP dimensions from the SQL dimensions, (3) create a cube from the table-based materialized view and (4) create a cube-organized materialized view on the cube to enable query rewrite into the cube.&lt;br /&gt;&lt;br /&gt;This feature is primarily designed to make it very easy to use the cube as a summary management solution for applications that query relational tables.  For example, you might have an Oracle Business Intelligence (or Business Objects, Cognos or MicroStrategy) application that queries tables.  If the application queries summary level data, can benefit from a performance boost and queries tables that tables represent data that is dimensional in nature (e.g., a star or snowflake schema), a cube is a great way to manage that summary data.&lt;br /&gt;&lt;br /&gt;Let's look at a scenario.  There's a star schema with time, product, customer and channel dimension tables and a sales fact table.  The hierarchies are as follows:&lt;br /&gt;&lt;br /&gt;Time:  Day &gt; Month &gt; Quarter &gt; Year&lt;br /&gt;Product:  Item &gt; Subtype &gt; Type &gt; Category &gt; Department&lt;br /&gt;Customer:  Customer &gt; City &gt; State &gt; Country &gt; Region&lt;br /&gt;Channel:  Channel &gt; Class&lt;br /&gt;&lt;br /&gt;The fact table contains data at the Day, Item, Customer and Channel levels for measures Sales and Quantity.&lt;br /&gt;&lt;br /&gt;The objective is to create a cube and cube-organized materialized view that manages all summary data beginning at Month, Item, City and Channel levels.  Note that in this example the detail of the cube will be a summary of the fact table.&lt;br /&gt;&lt;br /&gt;Step 1 is to create SQL dimension objects for each of the dimension tables.  (If you want to try this script yourself, download and install the OLAPTRAIN schema from the OLAP page on OTN.  http://www.oracle.com/technology/products/bi/olap/11g/samples/schemas/readme.html .)&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;-- Create SQL dimension objects for hierarchies and attributes.  The cube will&lt;br /&gt;-- use these as the source definitions for cube.&lt;br /&gt;--&lt;br /&gt;-- Time dimension.&lt;br /&gt;--&lt;br /&gt;CREATE DIMENSION times&lt;br /&gt;  LEVEL day IS (times.day_key)&lt;br /&gt;  LEVEL month IS (times.month_id)&lt;br /&gt;  LEVEL calendar_quarter IS (times.calendar_quarter_id)&lt;br /&gt;  LEVEL calendar_year IS (times.calendar_year_id)&lt;br /&gt;  HIERARCHY calendar (&lt;br /&gt;    day CHILD OF&lt;br /&gt;    month CHILD OF&lt;br /&gt;    calendar_quarter CHILD OF&lt;br /&gt;    calendar_year)&lt;br /&gt;  ATTRIBUTE day DETERMINES (day_description)&lt;br /&gt;  ATTRIBUTE month DETERMINES (month_name, month_end_date)&lt;br /&gt;  ATTRIBUTE calendar_quarter DETERMINES (calendar_quarter_name, calendar_quarter_end_date)&lt;br /&gt;  ATTRIBUTE calendar_year DETERMINES (calendar_year_name, calendar_year_end_date);&lt;br /&gt;--&lt;br /&gt;-- Product dimension.&lt;br /&gt;--&lt;br /&gt;CREATE DIMENSION products&lt;br /&gt;  LEVEL item IS (products.item_key)&lt;br /&gt;  LEVEL subtype IS (products.subtype_key)&lt;br /&gt;  LEVEL type IS (products.type_key)&lt;br /&gt;  LEVEL category IS (products.category_key)&lt;br /&gt;  LEVEL department IS (products.department_key)&lt;br /&gt;  HIERARCHY departments (&lt;br /&gt;    item CHILD OF&lt;br /&gt;    subtype CHILD OF&lt;br /&gt;    type CHILD OF&lt;br /&gt;    category CHILD OF&lt;br /&gt;    department)&lt;br /&gt;  ATTRIBUTE item DETERMINES (item_name)&lt;br /&gt;  ATTRIBUTE subtype DETERMINES (subtype_name)&lt;br /&gt;  ATTRIBUTE type DETERMINES (type_name)&lt;br /&gt;  ATTRIBUTE category DETERMINES (category_name)&lt;br /&gt;  ATTRIBUTE department DETERMINES (department_name);&lt;br /&gt;--&lt;br /&gt;-- Customer dimension.&lt;br /&gt;--&lt;br /&gt;CREATE DIMENSION customers&lt;br /&gt;  LEVEL customer IS (customers.customer_key)&lt;br /&gt;  LEVEL city IS (customers.city_key)&lt;br /&gt;  LEVEL state IS (customers.state_province_key)&lt;br /&gt;  LEVEL country IS (customers.country_key)&lt;br /&gt;  LEVEL region IS (customers.region_key)&lt;br /&gt;  HIERARCHY regions (&lt;br /&gt;    customer CHILD OF&lt;br /&gt;    city CHILD OF&lt;br /&gt;    state CHILD OF&lt;br /&gt;    country CHILD OF&lt;br /&gt;    region)&lt;br /&gt;  ATTRIBUTE customer DETERMINES (customers.customer_number)&lt;br /&gt;  ATTRIBUTE city DETERMINES (customers.city_name)&lt;br /&gt;  ATTRIBUTE state DETERMINES (customers.state_province_name)&lt;br /&gt;  ATTRIBUTE country DETERMINES (customers.country_name)&lt;br /&gt;  ATTRIBUTE region DETERMINES (customers.region_name);&lt;br /&gt;--&lt;br /&gt;-- Channel dimension.&lt;br /&gt;--&lt;br /&gt;CREATE DIMENSION channels&lt;br /&gt;  LEVEL channel IS (channels.channel_key)&lt;br /&gt;  LEVEL class IS (channels.class_key)&lt;br /&gt;  HIERARCHY classes (&lt;br /&gt;    channel CHILD OF&lt;br /&gt;    class)&lt;br /&gt;  ATTRIBUTE channel DETERMINES (channels.channel_name)&lt;br /&gt;  ATTRIBUTE class DETERMINES (channels.class_name);&lt;br /&gt;&lt;br /&gt;The next step is to create a table-based materialized view that summarizes data to the level you want to load into the cube. Note that you do not need load data into this materialized view (use the BUILD DEFERRED option).  The DBMS_CUBE.CREATE_MVIEW program will simply use the table-based MV to understand how to query the source fact table and to find to the measures to be added to the cube.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;-- Create the table-based materialized view.  In this example, the table-based&lt;br /&gt;-- materialized view aggregates data from the day to month levels in time&lt;br /&gt;-- and the customer to city levels in customer.&lt;br /&gt;--&lt;br /&gt;-- MV is build deferred because the cube doesn't need data from the MV (it just&lt;br /&gt;-- uses the MV's definition.&lt;br /&gt;--&lt;br /&gt;CREATE materialized VIEW sales_mon_ite_cit_cha_mv build deferred&lt;br /&gt;AS&lt;br /&gt;  SELECT t.month_name,&lt;br /&gt;    p.item_name,&lt;br /&gt;    cu.city_name,&lt;br /&gt;    ch.channel_name,&lt;br /&gt;    SUM(f.sales) sales,&lt;br /&gt;    SUM(f.quantity) quantity&lt;br /&gt;  FROM times t,&lt;br /&gt;    products p,&lt;br /&gt;    customers cu,&lt;br /&gt;    channels ch,&lt;br /&gt;    sales_fact f&lt;br /&gt;  WHERE t.day_key = f.day_key&lt;br /&gt;  AND p.item_key = f.product&lt;br /&gt;  AND cu.customer_key = f.customer&lt;br /&gt;  AND ch.channel_key = f.channel&lt;br /&gt;  GROUP BY t.month_name,&lt;br /&gt;    p.item_name,&lt;br /&gt;    cu.city_name,&lt;br /&gt;    ch.channel_name;&lt;br /&gt;&lt;br /&gt;Finally, run the DBMS_CUBE.CREATE_MVIEW program.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;-- Create and load the cube-organized materialized view.&lt;br /&gt;--&lt;br /&gt;declare&lt;br /&gt;  myCubeMv varchar2(32);&lt;br /&gt; begin&lt;br /&gt;  myCubeMv := &lt;br /&gt;    dbms_cube.create_mview(&lt;br /&gt;      mvOwner =&gt;user, &lt;br /&gt;      mvName  =&gt;'sales_mon_ite_cit_cha_mv', &lt;br /&gt;      sam_parameters=&gt;'logDest=serverout,build=immediate' );&lt;br /&gt; end;&lt;br /&gt; /&lt;br /&gt;&lt;br /&gt;There's several parameters to this program, but I found the defaults to be very reasonable.  It built my cube as compressed, partitioned by quarter and pre-aggregation settings of 0 for the top partition and 35 for the bottom partition.  You can control any of these settings with the sam_parameters argument. You can also defer the loading of the cube and load the cube later with the DBMS_CUBE.BUILD or DBMS_MVIEW.REFRESH programs.&lt;br /&gt;&lt;br /&gt;The cube can be viewed and edited in Analytic Workspace Manager, so you can use it to check the design or make changes such as adding custom measures.&lt;br /&gt;&lt;br /&gt;As with any other materialized view, you will need to make sure all the necessary constraints are in place on the base tables.  I used AWM’s Relational Access Advisor feature (in the Cube / Materialized View tab) to generate constraint recommendations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-973050560986261710?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/973050560986261710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=973050560986261710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/973050560986261710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/973050560986261710'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/11/creating-cubes-with-simple-sql.html' title='Creating Cubes with Simple SQL'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8218071865068434202</id><published>2009-04-30T08:37:00.000-07:00</published><updated>2009-04-30T08:45:04.664-07:00</updated><title type='text'>Automatically Create Oracle Business Intelligence Repositories for Oracle11g Cubes</title><content type='html'>An OBIEE Plug-in for Oracle11g OLAP was released on the OLAP Option page on the Oracle Technical Network today. The plug-in allows you to automatically create OBIEE repositories that can be used to query Oracle11g cubes. It's really, really easy. The OBIEE repository created by the plug-in allows OBIEE to query all content of the cube, including summary data and advanced calculations. This is a great way to demonstrate how the Oracle cube can enhance the performance and analytic content of Oracle Business Intelligence Enterprise Edition.&lt;br /&gt;&lt;br /&gt;The OBIEE Plug-in is used with Analytic Workspace Manager (AWM), the administrative tool of the Oracle OLAP Option. Only the most basic understanding of the OBIEE repository is required to use this AWM plug-in. The plug-in creates fully configured a physical database, business model and mapping layer and presentation catalog in the OBIEE repository.&lt;br /&gt;&lt;br /&gt;Here are some useful links:&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;Oracle OLAP OTN page&lt;/a&gt;.&lt;br /&gt;The OBIEE Plug-in &lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/awm_plugin/biee/awm_plugin_biee.html"&gt;instruction sheet&lt;/a&gt;.&lt;br /&gt;A demonstration &lt;a href="http://download.oracle.com/otndocs/products/warehouse/olap/videos/obiee_plug_in_for_awm/OBIEE_Plugin.html"&gt;video&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/awm_plugin/biee/obieeplugin.jar"&gt;Download &lt;/a&gt;the plug-in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8218071865068434202?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8218071865068434202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8218071865068434202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8218071865068434202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8218071865068434202'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/04/automatically-create-oracle-business.html' title='Automatically Create Oracle Business Intelligence Repositories for Oracle11g Cubes'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8550105825189141213</id><published>2009-04-07T01:00:00.000-07:00</published><updated>2009-04-07T01:42:29.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenWorld'/><title type='text'>Call for OpenWorld 2009 papers has started...</title><content type='html'>This years Oracle OpenWorld conference will be held on October 11-15 at the Moscone Center in San Francisco. A few days ago the OpenWorld website opened for customers and partners to submit proposals for presentations to be included in this years conference. This year there will be more sessions allocated to customer and partner papers which increases your chances of having your paper selected. The OpenWorld conference is a great opportunity to present your ideas to the Oracle Community and to add to increase your own knowledge by attending other presentations. Most importantly,all the Oracle OLAP Blog team will be onsite at the demo grounds so come and say "Hi" and checkout the latest cool 11g OLAP demos.&lt;br /&gt;&lt;br /&gt;Presenting at OpenWorld is an amazing experience and I would recommend it to anyone and everyone. There is nothing quite like it. The deadline for submission is April 19 so act fast!&lt;br /&gt;&lt;br /&gt;Are there any benefits to presenting? Of course - but the benefits/goody bags change every year and I am not sure what we will be offering this year. Obviously you get a complimentary Oracle OpenWorld Full Conference pass which means you can get into the vast majority of events during the conference. You get access to the whole presentation catalog via the OpenWorld website. On top of the Oracle goodies, most of the vendors in the demo grounds hand out lots of other goodies (it pays to bring an extra suitcase) and most evenings someone, somewhere, is usually offering free beer. What more could you ask for!&lt;br /&gt;&lt;br /&gt;What should I present on? The topic is completely up to you. You can talk about a recent project or a specific database feature and how you used it. Just pick any topic you think will be of use and interest to other people.&lt;br /&gt;&lt;br /&gt;The 2009 Conference web page is &lt;a href="http://www.oracle.com/openworld/2008/call-for-papers.html"&gt;here&lt;/a&gt;. Look for the red link "Now Live" and good luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8550105825189141213?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.oracle.com/openworld/2008/call-for-papers.html' title='Call for OpenWorld 2009 papers has started...'/><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8550105825189141213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8550105825189141213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8550105825189141213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8550105825189141213'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/04/call-for-openworld-2009-papers-has.html' title='Call for OpenWorld 2009 papers has started...'/><author><name>keith laker</name><uri>http://www.blogger.com/profile/13350994132294695189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_5ecFmVOLrwo/R6HKVXSqHjI/AAAAAAAAAQM/Qm7-vRHTn1o/S220/Me2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1348644043602226128</id><published>2009-04-02T05:55:00.000-07:00</published><updated>2009-04-02T06:03:41.953-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><title type='text'>Excel Update - Beta Version of MDX Provider Now Available</title><content type='html'>A quick update on using Excel to query an Oracle11g cube ....&lt;br /&gt;&lt;br /&gt;Yesterday Simba announced availability beta 1 MDX provider for Oracle OLAP.  I've been using prerelease version of the provider for a few months now and have been very happy with it.  There's still some features to be added and some performance work to be done, but I think the beta 1 version is well worth trying.  In my experience, the MDX provider is pretty stable and I very much like Excel as a front end to Oracle cubes.&lt;br /&gt;&lt;br /&gt;To sign up, visit the MDX Provider for Oracle page at http://simba.com/MDX-Provider-for-Oracle-OLAP.htm .  You can also find a video demo on this page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1348644043602226128?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1348644043602226128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1348644043602226128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1348644043602226128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1348644043602226128'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/04/excel-update-beta-version-of-mdx.html' title='Excel Update - Beta Version of MDX Provider Now Available'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-7617492565845777141</id><published>2009-03-07T05:56:00.001-08:00</published><updated>2009-04-02T06:04:23.638-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><title type='text'>Using Excel with Oracle OLAP</title><content type='html'>I did two webcasts about using Excel with Oracle OLAP this week. They were incredibly sucessful. If you've never looked at Excel 2007 pivot tables, I'll tell you that they are very good. Using the MDX Provider for Oracle OLAP, Excel makes a direct/native connection to the Oracle database and has the ability to query OLAP cubes in a multidimensional context.&lt;br /&gt;&lt;br /&gt;I won't every try do to justice to this solution in this blog. It's really best to just see it in action. I've posted a video on simba.com (go to &lt;a href="http://simba.com/MDX-Provider-for-Oracle-OLAP.htm"&gt;http://simba.com/MDX-Provider-for-Oracle-OLAP.htm&lt;/a&gt; and click on the product demo link).&lt;br /&gt;&lt;br /&gt;You can also sign up for the beta test at simba.com. Do yourself a favor - try it out.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/SbKABugZvlI/AAAAAAAAADo/MTQhLX0d1iE/s1600-h/excel.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5310447677775396434" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 222px" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/SbKABugZvlI/AAAAAAAAADo/MTQhLX0d1iE/s400/excel.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Querying an Oracle OLAP Cube using Excel.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/SbJ_sOWk4-I/AAAAAAAAADg/6HILOiC-jG8/s1600-h/excel.bmp"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-7617492565845777141?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/7617492565845777141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=7617492565845777141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7617492565845777141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7617492565845777141'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/03/using-excel-with-oracle-olap.html' title='Using Excel with Oracle OLAP'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2lLO4bE4a8Y/SbKABugZvlI/AAAAAAAAADo/MTQhLX0d1iE/s72-c/excel.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-91863370270713431</id><published>2009-02-16T00:48:00.000-08:00</published><updated>2009-02-16T10:42:08.387-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New!  Oracle OLAP Overview Video</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_dg4JGcRB6lM/SZkq36J2-PI/AAAAAAAAABI/J0QXRDAE82c/s1600-h/video.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 312px;" src="http://1.bp.blogspot.com/_dg4JGcRB6lM/SZkq36J2-PI/AAAAAAAAABI/J0QXRDAE82c/s400/video.JPG" alt="" id="BLOGGER_PHOTO_ID_5303317176197249266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A new fifteen minute Oracle OLAP video has been released - describing the benefits of Oracle OLAP in the context of the Oracle Database, Data Warehouse and Business Intelligence platform.&lt;br /&gt;&lt;br /&gt;You can either watch this video online, or download for replay on an iPod:&lt;br /&gt;•    Click &lt;a href="http://download.oracle.com/otndocs/products/warehouse/olap/videos/overview/OracleOLAP_Video_Overview_forweb.html"&gt;here&lt;/a&gt; to view the video now&lt;br /&gt;•    Click &lt;a href="http://download.oracle.com/otndocs/products/warehouse/olap/videos/overview/OracleOLAP_Overview_forIPod.m4v"&gt;here&lt;/a&gt; to download the iPod video&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-91863370270713431?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/91863370270713431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=91863370270713431' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/91863370270713431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/91863370270713431'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/02/new-oracle-olap-overview-video.html' title='New!  Oracle OLAP Overview Video'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dg4JGcRB6lM/SZkq36J2-PI/AAAAAAAAABI/J0QXRDAE82c/s72-c/video.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-9167526306229329332</id><published>2009-02-06T06:29:00.000-08:00</published><updated>2009-02-19T09:11:14.942-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle OLAP Option'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle University'/><title type='text'>Experience with Oracle University OLAP Essentials Course</title><content type='html'>I've recently taught two sessions of the Oracle University Course 'OLAP Database 11g: OLAP Essentials'. The first session was in Reading UK and the next in Munich. Both sessions were highly rated by students (9.4 out of 10). As an instructor I found the course a pleasure to teach (kudos to Brian Pottle and Marty Gubar who put much of this class together).&lt;br /&gt;&lt;br /&gt;This is a three day introductory course that is appropriate for anyone who is approaching the OLAP Option for the first time or who is upgrading to 11g from earlier releases (there is so much new in OLAP 11g that even experienced users can learn a lot in this course). The students in the class were a mix of OLAP Option newbies and upgraders. Both groups were equally pleased with the course.&lt;br /&gt;&lt;br /&gt;Students remarked that one of the real strengths of the course is the hands-on exercises. By the end of day 1 students have defined, populated and queried their first cube. Later in the course they get hands-on experience with cube-organized materialized views, SQL query of cube, creating calculated measures, forecasting, security and even building a custom application in Application Express on the OLAP cube. One of the things about the hands-on exercises that I found remarkable was the high success rate experienced by the students. These are very well put together.&lt;br /&gt;&lt;br /&gt;The outline of the course follows:&lt;br /&gt;&lt;br /&gt;Day 1&lt;br /&gt;&lt;br /&gt;1. Examining the role of the OLAP Option in the Oracle BI/DW platform.&lt;br /&gt;2. Examining the OLAP Data Model.&lt;br /&gt;3. Building an OLAP Cube (with 2 hands-on exercises).&lt;br /&gt;&lt;br /&gt;Day 2&lt;br /&gt;&lt;br /&gt;4. Examining Cube-Organized Materialized Views (with hands-on exercise).&lt;br /&gt;5. Creating Calculated Measures (with hands-on exercise).&lt;br /&gt;6. Using SQL to Query OLAP Cubes (with hands-on exercise).&lt;br /&gt;7. Enhancing Analytic Content (with hands-on exercise). (This uses OLAP DML programs to create a forecast.)&lt;br /&gt;&lt;br /&gt;Day 3&lt;br /&gt;&lt;br /&gt;8. Using Oracle Application Express and Oracle Business Intelligence with OLAP Data (with hands-on exercise).&lt;br /&gt;9. Cube security (with hands-on exercise).&lt;br /&gt;10. Designing cubes for performance and scalability.&lt;br /&gt;11. Performance tuning (this is really about things the DBA should know to tune the Database for cubes).&lt;br /&gt;&lt;br /&gt;These three very full days. Expect to get a lot of value from this class. And, it was lots of fun.&lt;br /&gt;&lt;br /&gt;Here is one student's perspective of the class:  &lt;a href="http://ofaworld.wordpress.com/2009/02/18/oracle-university-oracle-11g-olap-essentials-training-course/"&gt;http://ofaworld.wordpress.com/2009/02/18/oracle-university-oracle-11g-olap-essentials-training-course/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For more information, see the &lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D70039GC10&amp;amp;p_org_id=1001&amp;amp;lang=US&amp;amp;source_call="&gt;Oracle University site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-9167526306229329332?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='' href='http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D70039GC10&amp;p_org_id=1001&amp;lang=US&amp;source_call=' length='0'/><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/9167526306229329332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=9167526306229329332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/9167526306229329332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/9167526306229329332'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/02/experience-with-oracle-university-olap.html' title='Experience with Oracle University OLAP Essentials Course'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2893068114396610184</id><published>2009-02-06T02:05:00.000-08:00</published><updated>2009-02-06T06:34:59.033-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX (Application Express)'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New Tutorial -  Creating Interactive APEX Reports Over OLAP 11g Cubes</title><content type='html'>The latest in a recent series of 11g OLAP tutorials has been added to the &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;Oracle OLAP product page on OTN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The tutorial is called &lt;a href="http://www.oracle.com/technology/obe/olap-apex/usingapex4olap.htm"&gt;'Creating Interactive APEX Reports Over OLAP 11g Cubes'&lt;/a&gt; and &lt;span class="bodycopy"&gt;shows how you use &lt;a href="http://www.oracle.com/technology/products/database/application_express/index.html"&gt;Oracle Application Express&lt;/a&gt; (APEX) to    create an interactive sales analysis report that runs against OLAP 11g data&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dg4JGcRB6lM/SYwMWq5T7qI/AAAAAAAAABA/aiAt-fMe77s/s1600-h/apex17.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://4.bp.blogspot.com/_dg4JGcRB6lM/SYwMWq5T7qI/AAAAAAAAABA/aiAt-fMe77s/s400/apex17.gif" alt="" id="BLOGGER_PHOTO_ID_5299624445119557282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You learn how to query and create analytic reports of OLAP 11g cubes, including both stored and calculated measures. You also learn how to apply query techniques that leverage unique characteristics of OLAP 11g cubes.&lt;br /&gt;&lt;br /&gt;The other tutorials already published in this series are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/obe/olap_cube/buildicubes.htm"&gt;Building OLAP 11g Cubes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/obe/olap_cube/querycubes.htm"&gt;Querying OLAP 11g Cubes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/obe/olap_biee/CreateBIEEMetadata.htm"&gt;Creating BI EE Metadata for OLAP 11g Cubes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/obe/olap_biee/querydata.htm"&gt;Querying OLAP 11g Data Using Oracle BI Answers&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2893068114396610184?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2893068114396610184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2893068114396610184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2893068114396610184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2893068114396610184'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/02/new-tutorial-creating-interactive-apex.html' title='New Tutorial -  Creating Interactive APEX Reports Over OLAP 11g Cubes'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dg4JGcRB6lM/SYwMWq5T7qI/AAAAAAAAABA/aiAt-fMe77s/s72-c/apex17.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-7483888097585039363</id><published>2009-02-05T16:36:00.000-08:00</published><updated>2009-02-06T02:05:20.721-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP Newsletter'/><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Customer References'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Oracle OLAP Newsletter - February 2009</title><content type='html'>The latest Oracle OLAP newsletter, February 2009, has been posted onto OTN and is available by clicking &lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/newsletter/oracleolapnewsletter_feb09.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The customer feature this time is R.L. Polk who have used 11g OLAP to simplify their delivery of aggregate data through the use of cube organised materialised views.  This is a fantastic case study which captures the true value of this functionality (note the dramatic improvements in both build and query times), and of having Oracle OLAP embedded in the Oracle Database.&lt;br /&gt;&lt;br /&gt;The highlights of the Product Update section this time are the release of &lt;a href="http://download.oracle.com/otndocs/products/warehouse/awm11.1.0.7.0B.zip"&gt;the latest version of AWM 11g&lt;/a&gt; (11.1.0.7B), and also a new version of the &lt;a href="http://www.oracle.com/technology/products/bi/spreadsheet_addin/index.html"&gt;BI Spreadsheet Add-in&lt;/a&gt; (10.1.2.3.0.1 - enough digits?!) which now includes support for Excel 2007.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-7483888097585039363?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/7483888097585039363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=7483888097585039363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7483888097585039363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7483888097585039363'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/02/oracle-olap-newsletter-february-2009.html' title='Oracle OLAP Newsletter - February 2009'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8533923761869852885</id><published>2009-01-26T11:50:00.001-08:00</published><updated>2009-02-05T16:35:54.760-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Exadata'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Gartner identifies Oracle OLAP as a key strength in Oracle's DW proposition</title><content type='html'>You may have already seen elsewhere that &lt;a href="http://www.gartner.com/"&gt;Gartner&lt;/a&gt; recently published &lt;a href="http://mediaproducts.gartner.com/reprints/microsoft/vol3/article7/article7.html"&gt;an updated magic quadrant for Data Warehouse Database Management Systems&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It was a little bit surprising to see that the &lt;a href="http://www.oracle.com/technology/products/bi/db/exadata/index.html"&gt;HP Oracle Exadata Storage Server&lt;/a&gt; and the &lt;a href="http://www.oracle.com/technology/products/bi/db/dbmachine/index.html"&gt;HP Oracle Database Machine&lt;/a&gt; hadn't provided a bigger boost to Oracle's rating (although, as you would expect, Oracle is still firmly entrenched in the leaders quadrant).  Perhaps it is still a little early for their significance to be fully appreciated.   There is likely to be a more pronounced improvement in Oracle's rating the next time this magic quadrant is published.&lt;br /&gt;&lt;br /&gt;Of particular interest to this blog is the fact that Oracle OLAP is identified as a key strength of Oracle's Data Warehousing proposition. The research highlights the enhanced materialized view and cube management features added in 11g, along with &lt;span&gt;transparent SQL access and incremental update.  &lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;It is really great to hear such a significant endorsement of Oracle's strategy to embed the Oracle OLAP engine inside the Oracle Database.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;If you want to read more about what 11g OLAP could do for your Oracle Data Warehouse, then check out this &lt;a href="http://www.oracle.com/technology/products/bi/olap/Oracle_OLAP_11g_TWP.pdf"&gt;white paper&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8533923761869852885?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8533923761869852885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8533923761869852885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8533923761869852885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8533923761869852885'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/01/gartner-identifies-oracle-olap-as-key.html' title='Gartner identifies Oracle OLAP as a key strength in Oracle&apos;s DW proposition'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-6323118913330111576</id><published>2009-01-07T01:20:00.000-08:00</published><updated>2009-01-07T02:07:14.453-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='Customer References'/><category scheme='http://www.blogger.com/atom/ns#' term='OBIEE'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Get hands-on with 11g OLAP &amp; Oracle Business Intelligence Enterprise Edition</title><content type='html'>Happy New Year to everyone!!&lt;br /&gt;&lt;br /&gt;Following the &lt;a href="http://oracleolap.blogspot.com/2008/12/get-hands-on-with-11g-olap.html"&gt;announcement last month of two new 'Oracle By Example' tutorials on building and querying 11g OLAP cubes&lt;/a&gt;, here are the details of a further two tutorials on working with 11g OLAP and Oracle Business Intelligence Enterprise Edition (OBIEE).&lt;br /&gt;&lt;br /&gt;The first tutorial shows &lt;a href="http://www.oracle.com/technology/obe/olap_biee/CreateBIEEMetadata.htm"&gt;how to create OBIEE metadata over 11g OLAP cubes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(if you are using 10g OLAP, use &lt;a href="http://www.oracle.com/technology/obe/olap_biee/CreateBIEEMetadata.htm"&gt;this&lt;/a&gt; tutorial to create OBIEE metadata instead)&lt;br /&gt;&lt;br /&gt;The second new tutorial shows &lt;a href="http://www.oracle.com/technology/obe/olap_biee/querydata.htm"&gt;how to query 11g OLAP cubes using OBIEE Answers&lt;/a&gt; - using the metadata repository created during the first tutorial&lt;br /&gt;&lt;br /&gt;While OBIEE &lt;span style="font-style: italic;"&gt;Answers&lt;/span&gt; is a widely used query tool for Oracle OLAP (for an example, see the &lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/micros_olap_newsletter08.html"&gt;article on Micros Systems&lt;/a&gt;), it would be interesting to hear from people using some of the other components of OBIEE, especially some of the newly integrated 'plus' components like Smart View which appears to be receiving a lot of development effort from the BI/EPM folks.&lt;br /&gt;&lt;br /&gt;Please feel free to share any experiences you might have in our comments section.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-6323118913330111576?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/6323118913330111576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=6323118913330111576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/6323118913330111576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/6323118913330111576'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2009/01/get-hands-on-with-11g-olap-oracle.html' title='Get hands-on with 11g OLAP &amp; Oracle Business Intelligence Enterprise Edition'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1182936742731352934</id><published>2008-12-29T11:26:00.000-08:00</published><updated>2008-12-29T11:36:57.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='Demonstration'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Now Available!  Two new Oracle OLAP Demonstrations</title><content type='html'>Two new Oracle OLAP demonstrations have been added to the &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;Oracle OLAP product page on OTN&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/demos/olap_sql_demo.html"&gt;Fast Answers to Tough Questions Using Simple SQL&lt;/a&gt; :- Oracle OLAP is a world class analytic engine embedded in the Oracle Database.  OLAP Cubes and dimensions are easily accessible thru a star-model.  Using very simple SQL, Oracle OLAP delivers fast answers to tough, analytic questions.  This demonstration shows how to query OLAP cubes using several tools, including:  Oracle Business Intelligence Enterprise Edition, Application Express and SQL Developer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/demos/olap_cube_mvs_demo.html"&gt;Transparently Improving Query Performance with Oracle OLAP Cube MVs&lt;/a&gt; :- Oracle OLAP cubes may also be deployed as materialized views.  Summary queries written to base fact tables can transparently leverage the fast query performance delivered by Oracle OLAP - without any changes to the application's query.  The Oracle Optimizer automatically rewrites queries to cubes when appropriate.  This demonstration shows how Oracle Business Intelligence Enterprise Edition seamlessly benefits from this capability. The demonstration then provides an "under the covers" view of how this improvement is achieved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1182936742731352934?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1182936742731352934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1182936742731352934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1182936742731352934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1182936742731352934'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/now-available-two-new-oracle-olap.html' title='Now Available!  Two new Oracle OLAP Demonstrations'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-6831319563431390188</id><published>2008-12-23T04:55:00.000-08:00</published><updated>2008-12-23T06:22:12.049-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP Newsletter'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Customer References'/><title type='text'>Oracle OLAP Newsletter - December 2008</title><content type='html'>The latest Oracle OLAP newsletter, December 2008, has been posted to the &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;OLAP Home Page&lt;/a&gt; on OTN and is available by clicking &lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/newsletter/oracleolapnewsletter_dec08.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As usual, it contains very useful information about what is happening in the world of Oracle OLAP and includes regular features such as the OLAP skills corner and DBA tips, as well as useful links for those wanting to download the software or get training or assistance.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/newsletter/oracleolapnewsletter_dec08.html#story1"&gt;The featured customer this time is JD Sports in the UK&lt;/a&gt;.  This is an excellent example of Oracle OLAP being used as part of a wider Data Warehouse solution.  It is also a significant endorsement of Oracle's Data Warehouse strategy to bring smart, embedded analytics to the data and highlights the benefits of an embedded OLAP server; JD Sports has been able to leverage other advanced Oracle technologies such as &lt;a href="http://www.oracle.com/technology/products/database/clustering/index.html"&gt;Real Application Clusters&lt;/a&gt; (to deliver scalability and availability), whilst additionally benefiting from many of the features taken for granted by Oracle's RDBMS customers (DW integrated security, storage, backup, transaction control, etc) but often not so easily delivered by stand-alone OLAP engines. &lt;br /&gt;&lt;br /&gt;This customer feature is also a good example of the scalability of the Oracle OLAP engine itself.  Whilst far from being the largest implementation (there are customers managing several Terabytes of data in Oracle OLAP cubes), this example shows how relatively large volumes of DW data can be loaded and aggregated in Oracle OLAP, and how the cube compression and partitioning features first introduced in 10g OLAP have completely changed the game compared to what was previously possible.  Taken in isolation, loading 300 million source records is not a major achievement (not for Oracle OLAP anyway), neither is having a 10 dimensional cube, or indeed is aggregating across 28 hierarchical levels.  What is more impressive is doing all of these three things combined in a single cube (which is only one cube out of a total of six), and still being able to deliver all of the key benefits you would associate with an well implemented OLAP system - fast query performance and lots of advanced calcs (literally 100's in this case) serving a reasonably sized user community.&lt;br /&gt;&lt;br /&gt;All things considered, it is easy to see why Oracle OLAP is a key, strategic component of the Oracle Data Warehouse platform.&lt;br /&gt;&lt;br /&gt;Let's hope for some more customer features in the near future.&lt;br /&gt;&lt;br /&gt;Greetings of the season to everyone!&lt;br /&gt;&lt;br /&gt;BTW - you can have the OLAP newsletter sent directly to your email box each quarter by following the link at the top of the current newsletter (Unsubscribe/Subscribe to this Newsletter)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-6831319563431390188?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/6831319563431390188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=6831319563431390188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/6831319563431390188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/6831319563431390188'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/oracle-olap-newsletter-december-2008.html' title='Oracle OLAP Newsletter - December 2008'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-7967162984532790253</id><published>2008-12-21T09:22:00.000-08:00</published><updated>2008-12-21T13:52:23.212-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Get hands-on with 11g OLAP</title><content type='html'>&lt;p class="MsoNormal"&gt;You may have already noticed but over the past couple of weeks some new 11g OLAP training material has been published on the &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;OTN OLAP home page&lt;/a&gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Two new tutorials have been added to the popular &lt;a href="http://www.oracle.com/technology/obe/start/index.html"&gt;Oracle By Example (OBE)&lt;/a&gt; series.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;The first is titled &lt;a href="http://www.oracle.com/technology/obe/olap_cube/buildicubes.htm"&gt;'Building OLAP 11g Cubes'&lt;/a&gt; and covers using Analytic Workspace Manager (AWM) 11g to build and load an OLAP cube.&lt;/p&gt;&lt;p class="MsoNormal"&gt;The second is titled &lt;a href="http://www.oracle.com/technology/obe/olap_cube/querycubes.htm"&gt;'Querying OLAP 11g Cubes'&lt;/a&gt; and is a guide to querying a cube via SQL, both directly using OLAP Cube Views, and indirectly using Cube Materialized Views.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Supporting both of the tutorials is a new &lt;a href="http://www.oracle.com/technology/products/bi/olap/11g/samples/schemas/readme.html"&gt;sample schema&lt;/a&gt; which gives you the opportunity to get hands-on and experiment in your own environment. Remember, that patch level 11.1.0.7 is required and to always check the &lt;a href="http://www.oracle.com/technology/products/bi/olap/collateral/olap_certification.html"&gt;recommended release&lt;/a&gt; details for your chosen operating system.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-7967162984532790253?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/7967162984532790253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=7967162984532790253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7967162984532790253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7967162984532790253'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/get-hands-on-with-11g-olap.html' title='Get hands-on with 11g OLAP'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-242985168550386313</id><published>2008-12-16T09:50:00.000-08:00</published><updated>2008-12-23T06:22:44.752-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP Newsletter'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Customer References'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>ComputerWeekly.com : E.on transforms financial insight with Oracle OLAP Option</title><content type='html'>&lt;a title="http://www.computerweekly.com/Articles/2008/12/11/233863/e.on+transforms+financial+insights+with+bare-knuckle.htm" href="http://www.computerweekly.com/Articles/2008/12/11/233863/e.on+transforms+financial+insights+with+bare-knuckle.htm" send="true"&gt;http://www.computerweekly.com/Articles/2008/12/11/233863/e.on+transforms+financial+insights+with+bare-knuckle.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The article above, published last week in ComputerWeekly, follows an earlier &lt;a href="http://www.oracle.com/customers/snapshots/e-on-uk-snapshot.pdf"&gt;customer profile posted on OTN&lt;/a&gt;.  E.on, one of Europe's leading energy suppliers, has gone live with a financial transformation software project that will give it an accurate view of the profits generated by each customer and provide better forecasting of future demand.  E.on has accounts with over eight million customers in the UK. To quote directly from the project leader Lawrence Edwards: "It (accurate forecasting of demand, and, therefore, margin) is a massive problem because of the data volumes and complexity.  Others have tried and failed, but we persevered."&lt;br /&gt;&lt;br /&gt;It provides excellent proof points for the use of Oracle OLAP to solve business problems that require rapid data loading and analysis of large data volumes.  The E.on system is currently operating at about 6Tb and is growing rapidly, with 150Gb of new data added every 14 hours.  There is a great quote from Lawrence in the &lt;a href="http://www.oracle.com/customers/snapshots/e-on-uk-snapshot.pdf"&gt;OTN PDF&lt;/a&gt; explaining what they have achieved using Oracle OLAP Option:&lt;br /&gt;&lt;br /&gt;"The analytical power,  centralized administration, and scalability of Oracle OLAP have allowed us to process and present data in a way that was not previously possible. This has provided us with an unprecedented depth of understanding of customers’ energy use and the demand for all our products and offerings"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-242985168550386313?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/242985168550386313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=242985168550386313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/242985168550386313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/242985168550386313'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/computerweeklycom-eon-transforms.html' title='ComputerWeekly.com : E.on transforms financial insight with Oracle OLAP Option'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1695628015571582705</id><published>2008-12-16T09:30:00.000-08:00</published><updated>2008-12-16T09:35:43.018-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New 11g OLAP Cube Materialized Views tutorial posted onto OTN</title><content type='html'>Another new tutorial has been added to the &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;Oracle OLAP home page on OTN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This tutorial is titled '&lt;a href="http://www.oracle.com/technology/products/bi/olap/collateral/OLAP_11g_MV_query_rewrite.html"&gt;Oracle OLAP 11g: Setting Up Cube Materialized Views for Query Rewrite&lt;/a&gt;'&lt;br /&gt;&lt;br /&gt;The tutorial describes how to enable cubes as Cube Materialized Views, and how to enable and troubleshoot Query Rewrite using Analytic Workspace Manager 11.1.0.7. It is intended as a quickstart for intermediate developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1695628015571582705?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1695628015571582705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1695628015571582705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1695628015571582705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1695628015571582705'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/new-11g-olap-cube-materialized-views.html' title='New 11g OLAP Cube Materialized Views tutorial posted onto OTN'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-7644888962943531094</id><published>2008-12-08T10:19:00.000-08:00</published><updated>2008-12-08T10:31:33.331-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Oracle Database 11g: OLAP Essentials - First dates announced</title><content type='html'>Following &lt;a href="http://oracleolap.blogspot.com/2008/12/new-oracle-olap-11g-oracle-university.html"&gt;the announcement last week about the new Oracle OLAP 11g Oracle University Training Course&lt;/a&gt;, the dates and locations for the first classes have been announced.&lt;br /&gt;&lt;br /&gt;The very first class will be in Bridgewater, New Jersey, US from 20-Jan-2009 through to 22-Jan-2009. &lt;br /&gt;&lt;br /&gt;The first class in Europe will be in Reading, UK from 21-Jan-2009 through to 23-Jan-2009.&lt;br /&gt;&lt;br /&gt;The code for the course is &lt;span&gt;&lt;span&gt;D70039GC10 and &lt;/span&gt;&lt;/span&gt;more details on both events can be found on the &lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=4&amp;amp;dc=D70039GC10"&gt;Oracle University web site&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Be sure to register early if you wish to attend as places are sure to be high in demand.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-7644888962943531094?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/7644888962943531094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=7644888962943531094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7644888962943531094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7644888962943531094'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/oracle-database-11g-olap-essentials.html' title='Oracle Database 11g: OLAP Essentials - First dates announced'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1883778856810811809</id><published>2008-12-04T01:50:00.000-08:00</published><updated>2008-12-04T02:02:37.725-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New! Oracle OLAP 11g Oracle University Training Course</title><content type='html'>A brand new OLAP 11g training class has been added to the Oracle University schedule.&lt;br /&gt;&lt;br /&gt;Here is a brief synopsis:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color:black;"&gt;Oracle OLAP 11g, a fully-integrated component of Oracle Database 11g, provides a  full featured multidimensional data model and calculation engine that is easily  accessible to any SQL based business intelligence application or  tool.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;In this course, students learn to progressively build an OLAP data model to support a wide range of business intelligence requirements. Students learn to design OLAP cubes to serve as a summary management resource for existing SQL table queries. Students also learn to leverage the power of Oracle OLAP by adding rich analytic content to your data model.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Students learn to create sophisticated reports of OLAP data by using simple SQL queries. Students also create and execute OLAP queries in SQL Developer, Oracle Application Express (APEX), and in Oracle BI Enterprise Edition. Students learn to implement cube security, including how to authorize access to cube data and methods for scoping user views of data. Finally, students learn to design OLAP cubes for performance and scalability.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Learn To:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   * Design and create an Oracle OLAP data model&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   * Enable query rewrite to OLAP Cube MVs for relational summary management&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   * Easily create OLAP calculations that enrich the analytic content of your data model&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   * Query OLAP data using simple SQL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   * Implement cube security&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   * Efficiently design cubes for performance and scalability&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More details and scheduling information can be found on the &lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D70039GC10&amp;amp;p_org_id=1001&amp;amp;lang=US&amp;amp;source_call="&gt;Oracle University Website&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1883778856810811809?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1883778856810811809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1883778856810811809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1883778856810811809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1883778856810811809'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/12/new-oracle-olap-11g-oracle-university.html' title='New! Oracle OLAP 11g Oracle University Training Course'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-6250178924989190937</id><published>2008-11-25T01:07:00.000-08:00</published><updated>2008-11-25T14:03:25.817-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='Workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='OTN'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New 11g OLAP tutorial posted onto OTN</title><content type='html'>A new tutorial has been added to OTN.&lt;br /&gt;&lt;br /&gt;The tutorial is aimed at newcomers to Oracle OLAP and is &lt;a href="http://www.oracle.com/technology/products/bi/olap/collateral/create_11g_olap_cube.html"&gt;a guide to creating and populating an 11g OLAP cube.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is perfect for people who are looking for a gentle introduction to using the Analytic Workspace Manager OLAP administration tool and understand the basic steps in building an 11g OLAP cube.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-6250178924989190937?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/6250178924989190937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=6250178924989190937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/6250178924989190937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/6250178924989190937'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/11/new-11g-olap-oracle-by-example-tutorial.html' title='New 11g OLAP tutorial posted onto OTN'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-3664577638849554482</id><published>2008-10-21T12:32:00.000-07:00</published><updated>2008-10-23T03:40:31.883-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenWorld'/><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Exadata'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New article on 11g OLAP Cube-Organised Materialized Views published onto OTN</title><content type='html'>Oracle ACE Director Arup Nanda has published a series of articles onto &lt;a href="http://www.oracle.com/technology/index.html"&gt;OTN&lt;/a&gt; covering important new features in Oracle Database 11g titled &lt;a href="http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/index.html"&gt;'Oracle Database 11g: Top Features for DBAs and Developers'&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The series includes a feature on &lt;a href="http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/11g-dw-olap.html"&gt;'Data Warehousing and OLAP'&lt;/a&gt; which looks at how Cube-Organized Materialized Views can be implemented alongside other features to deliver a compelling platform for data warehousing.&lt;br /&gt;&lt;br /&gt;With Oracle's data warehousing proposition featured heavily in the news at the moment following the &lt;a href="http://oracleolap.blogspot.com/2008/09/oracle-open-world-2008-hp-oracle.html"&gt;recent announcement at Oracle Open World on the availability of the Exadata Storage Server and Database Machine&lt;/a&gt;, this is an excellently timed reminder that Oracle OLAP is a core part of this data warehousing proposition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-3664577638849554482?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/3664577638849554482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=3664577638849554482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/3664577638849554482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/3664577638849554482'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/10/new-article-on-11g-olap-cube-organised.html' title='New article on 11g OLAP Cube-Organised Materialized Views published onto OTN'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-277388073036984282</id><published>2008-10-10T05:58:00.000-07:00</published><updated>2008-10-10T06:30:17.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='OBIEE'/><category scheme='http://www.blogger.com/atom/ns#' term='White Paper'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Access'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>New Oracle OLAP White Paper released to OTN</title><content type='html'>A new Oracle OLAP white paper has been released to OTN titled &lt;a href="http://www.oracle.com/technology/products/bi/olap/Oracle_OLAP_11g_BIEE_TWP.pdf"&gt;"Using Oracle Business Intelligence Enterprise Edition with the OLAP Option to Oracle Database 11g"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This contains a guide on how to configure the OBIEE metadata layer to leverage the 11g Oracle OLAP option, both indirectly via OLAP cube based materialized views, and directly via OLAP cube views. For those working with 10g OLAP (cube views only), the best guide to configuring OBIEE is found in the &lt;a href="http://www.oracle.com/technology/obe/obe_bi/bi_ee_1013/olap/index.html"&gt;online tutorial on OTN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Personally, I think that it is great that this white paper captures an explanation of how to write SQL that is optimised for Oracle OLAP cube views. This is something I find customers initially struggle with - they write what they believe is a simple query and then cannot understand why the performance is not good.&lt;br /&gt;&lt;br /&gt;This is because there are a few golden rules to writing optimal SQL for OLAP cube views and while they are simple to understand, they are not obvious to those who are new to the technology. I hope to write a more detailed Blog entry on this subject very soon, but for the time being take a look at the white paper (particularly pages 10 &amp;amp; 11) to see what I mean.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-277388073036984282?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/277388073036984282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=277388073036984282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/277388073036984282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/277388073036984282'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/10/new-oracle-olap-white-paper-released-to.html' title='New Oracle OLAP White Paper released to OTN'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-7913574936581352503</id><published>2008-10-10T04:14:00.000-07:00</published><updated>2008-12-16T09:36:30.712-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='11.1.0.7'/><category scheme='http://www.blogger.com/atom/ns#' term='patch'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>More 11.1.0.7 ports now available</title><content type='html'>The &lt;a href="https://updates.oracle.com/ARULink/PatchDetails/process_form?patch_num=6890831"&gt;Oracle Database 11g Release 11.1.0.7.0 Server Patch&lt;/a&gt; has now been released for several other ports, including Windows 32-bit.&lt;br /&gt;&lt;br /&gt;The full list of operating systems currently supported is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Linux x86&lt;/li&gt;&lt;li&gt;Linux x86-64&lt;/li&gt;&lt;li&gt;Solaris (SPARC) (64-bit)&lt;/li&gt;&lt;li&gt;IBM AIX (64-bit)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;HP-UX Itanium&lt;/li&gt;&lt;li&gt;Microsoft Windows (32-bit)&lt;/li&gt;&lt;/ul&gt;I would recommend that all 11g OLAP users apply the 11.1.0.7 patch as soon as it is available for their operating system.&lt;br /&gt;&lt;br /&gt;I would also recommend that all 11g OLAP users upgrade their AWM client to the 11.1.0.7A release which can be downloaded from &lt;a href="https://updates.oracle.com/ARULink/PatchDetails/process_form?patch_num=7420490"&gt;Metalink&lt;/a&gt; or &lt;a href="http://download.oracle.com/otndocs/products/warehouse/awm11.1.0.7.0A.zip"&gt;OTN&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As always, the best source of information for recommended releases and patches is the &lt;a href="http://www.oracle.com/technology/products/bi/olap/collateral/olap_certification.html"&gt;Oracle OLAP certification page on OTN&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm now going to download the Windows 32-bit patch (all 1.5GB of it!), and give it a roadtest....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-7913574936581352503?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/7913574936581352503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=7913574936581352503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7913574936581352503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/7913574936581352503'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/10/more-11107-ports-now-available.html' title='More 11.1.0.7 ports now available'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2806497760731135084</id><published>2008-10-06T02:46:00.000-07:00</published><updated>2008-10-10T04:10:59.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='11.1.0.7'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Analytic Workspace Manager 11.1.0.7A released to Metalink</title><content type='html'>The 11.1.0.7A version of AWM has been released to Metalink as patch &lt;a href="https://updates.oracle.com/ARULink/PatchDetails/process_form?patch_num=7420490"&gt;7420490&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It includes important fixes and new features including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the ability to add multiple languages to a single analytic workspace&lt;/li&gt;&lt;li&gt;individual aggregation definitions may now be defined for each measure of a cube&lt;/li&gt;&lt;li&gt;the Create Dimension user interface has been modified to allow levels of the dimension to be created at the same time as the dimension&lt;/li&gt;&lt;li&gt;the functionality of dimension and cube mapping has been enhanced to allow the application to refresh the definitions of database objects interactively to reflect the current state of database schema tables&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;To take advantage of all the new fixes and features, the &lt;a href="https://updates.oracle.com/ARULink/PatchDetails/process_form?patch_num=6890831"&gt;Oracle Database 11g Release 11.1.0.7.0 Server Patch&lt;/a&gt; must be installed as well.  This is currently only available for Linux 32-bit &amp;amp; Linux 64-bit, but other ports are likely to be available soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2806497760731135084?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2806497760731135084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2806497760731135084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2806497760731135084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2806497760731135084'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/10/analytic-workspace-manager-11107a.html' title='Analytic Workspace Manager 11.1.0.7A released to Metalink'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2969506672911206112</id><published>2008-09-29T04:05:00.000-07:00</published><updated>2008-12-23T06:23:27.184-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP Newsletter'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Customer References'/><title type='text'>Oracle OLAP Newsletter - September 2008</title><content type='html'>The latest edition of the excellent Oracle OLAP Newsletter has just been released &lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/newsletter/oracleolapnewsletter_sep08.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Highlights this time include a customer feature on Oss Council in the Netherlands who use Oracle OLAP for management reporting, details of the new 11.1.0.7 release, and a guide to delivering summary management through cube materialized views.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2969506672911206112?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2969506672911206112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2969506672911206112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2969506672911206112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2969506672911206112'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/09/oracle-olap-newsletter-september-2008.html' title='Oracle OLAP Newsletter - September 2008'/><author><name>Stuart Bunby</name><uri>http://www.blogger.com/profile/10781347144821555643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_dg4JGcRB6lM/SKlaoIXC4JI/AAAAAAAAAAM/9fNaDeWSnuc/S220/me_oracle.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2879502386630896622</id><published>2008-09-28T15:59:00.000-07:00</published><updated>2008-09-29T07:55:58.731-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenWorld'/><category scheme='http://www.blogger.com/atom/ns#' term='Database Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Exadata'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='Larry Ellison'/><title type='text'>Oracle Open World 2008 - HP-Oracle Database Machine launch</title><content type='html'>The big news at Oracle Open World last week was that Oracle CEO Larry Ellison used his &lt;a href="http://www.oracle.com/openworld/2008/keynotes.html#wednesday"&gt;keynote&lt;/a&gt;, entitled "Extreme. Performance." to talk about Data Warehousing and launch the &lt;a href="http://www.oracle.com/solutions/business_intelligence/database-machine.html"&gt;HP-Oracle Database Machine&lt;/a&gt; featuring the innovative new &lt;a href="http://www.oracle.com/exadata"&gt;Oracle Exadata &lt;/a&gt;storage server.&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5251224474167417618" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_YgBaT41Fipk/SOAY1kqWGxI/AAAAAAAAACs/VS0zaylLkcM/s400/LarryKeynote03.jpg" border="0" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5251224881532706466" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_YgBaT41Fipk/SOAZNSNzHqI/AAAAAAAAAC0/QyojGdEGnNs/s400/LarryKeynote01.jpg" border="0" /&gt; &lt;/p&gt;You can learn all about these exciting new products on the &lt;strong&gt;oracle.com&lt;/strong&gt; web site, so I won't bore you with that here, except to tell you that the performance of the Database Machine that we have seen from our Beta test customers is deeply impressive (the "10x" claims in the ads are pretty conservative from what I've seen).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://biz.yahoo.com/ap/080925/netezza_mover.html?.v=2"&gt;market reaction &lt;/a&gt;to the news that Oracle, together with HP, are now offering a 'DW Appliance' with superior performance, based on proven hardware components &amp;amp; including Oracle Database 11g, has reflected a common view that I heard while answering questions from customers at Open World: that the rationale for purchasing one of the niche vendors' DW Appliances, with their narrow sweet spot and less capable database software is now more questionable than ever.&lt;br /&gt;&lt;br /&gt;But why would anyone say that? Surely 'performance' is a game of leap-frogging, and if/when one of the DW Appliance vendors releases a newer faster machine before HP-Oracle does, won't that mean that the Oracle Database Machine's advantage is short-lived?&lt;br /&gt;&lt;br /&gt;Not at all.&lt;br /&gt;&lt;br /&gt;The HP-Oracle Database Machine is a DW Appliance like no other. This is because Oracle Database has depth &amp;amp; breadth of functionality and power that none of the others can claim. When you purchase a Database Machine you get Oracle Database EE, Real Application Clusters and Partitioning pre-installed and preconfigured, with ASM being used to manage the storage grid. All of the features included in there are available for use as soon as you plug in your new machine. But you can leverage much more even than that, of course.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And this is a key point - all the capabilities, features and options available in Oracle Database 11g are available on the Database Machine. Security, High Availability, Manageability, support for a Mixed Workload, and Embedded Analytics - all of it. And because this is standard Oracle Database, it is easy to run any of your applications on it - no specialised knowledge of rarely used niche RDBMS's required. Anything that runs your existing Oracle servers will run on Database Machine without change.&lt;br /&gt;&lt;br /&gt;This includes OLAP of course. Oracle Database OLAP is there too - pre-installed along with the rest of Oracle Database EE. You just need to license it for use on the DB Machine when you choose to use it. And this is great news as it adds multidimensional calculation and analysis sophistication to an already awsome piece of kit.&lt;br /&gt;&lt;br /&gt;A majority of the Oracle OLAP Option customers that I have met who report disappointing performance turn out to be IO Bound on their servers. That is, the server and storage they are using is out of balance, and constraining the ability of the Database to process the data. The HP-Oracle Database Machine &lt;em&gt;(like some of the &lt;/em&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/optimized-warehouse-initiative.html"&gt;&lt;em&gt;Optimized Warehouses &lt;/em&gt;&lt;/a&gt;&lt;em&gt;also available from Oracle and it's other hardware partners)&lt;/em&gt; provides excellent IO performance thanks to the balanced high speed infiniband interconnects between the storage and the database servers included in the machine, and is optimised for data warehousing queries across the spectrum - OLAP included. Good IO performance directly translates to even more effective OLAP implementations.&lt;br /&gt;&lt;br /&gt;So, the HP Oracle Database Machine is a great fit for Oracle Database OLAP Option, and other embedded analytics features of the Oracle Database, including &lt;a href="http://www.oracle.com/solutions/business_intelligence/data-mining.html"&gt;Data Mining&lt;/a&gt;, SQL &lt;a href="http://www.oracle.com/technology/products/bi/db/11g/dbbi_tech_info_anl.html"&gt;Analytics&lt;/a&gt; and &lt;a href="http://www.oracle.com/technology/products/bi/stats_fns/index.html"&gt;Statistical Functions&lt;/a&gt;, and the &lt;a href="http://www.oracle.com/technology/products/warehouse/index.html"&gt;OWB&lt;/a&gt; (Oracle Warehouse Builder) &lt;a href="http://www.oracle.com/technology/products/warehouse/11gr1/datasheets/warehouse-builder-11g-data-quality-datasheet.pdf"&gt;Data Profiling and Data Quality &lt;/a&gt;features. Delivering BI applications that leverage these powerful capabilities is also much easier thanks to them being pre-installed on the Database Machine.&lt;br /&gt;&lt;br /&gt;And Oracle OLAP is a great fit for the Database Machine, too. Which leads to the other question I have been asked by a couple of people: if Database Machine makes queries really really fast, does it mean that OLAP is no longer needed? Can I just dump all the data into tables and ignore all the other optimisations for Data Warehousing that Oracle Database provides?&lt;br /&gt;&lt;br /&gt;This question misunderstands the primary reason that people invest in OLAP systems. It is not only about performance, but also (especially) about the calculation capability, and the ease with which even the most complex of business calculations can be expressed. Many business calculations are difficult to do in SQL on regular relational tables. Some are still not even possible. And in turn, many BI tools resort to the transfer of large amounts of data across the network to mid-tier servers, or even the client, where the calcs are performed. Database Machine will allow them to pull the raw data much faster than before, but you still have a more complex architecture than you need, and network performance will be impacted. The OLAP Option makes time series, shares, indexes, ratios and so on that businesses use on all their performance dashboards really easy to define, and really efficient to process. In the Database.&lt;br /&gt;&lt;br /&gt;As regular readers of this blog know, the OLAP Option provides sophisticated multidimensional calculation and query functionality, accessible by pretty much any tools via a simple SQL query. There are hundreds of multidimensional-aware analytic calculation functions delivered by the OLAP Option - best of breed capability. This in turn leads to further performance benefits of course, but especially phenomenal ease of use and cost of ownership improvements. If all your KPIs are calculated within the Database, and surfaced to your BI tools, BI apps and Dashbards as simple columns that can be SELECTed; you reduce to trivial levels the amount of work you need to do in each BI Tools metadata layer with regard to (re)defining those calculations.&lt;br /&gt;&lt;br /&gt;Other Data Warehouse vendors - appliance &amp;amp; non-appliances alike - cannot do this, and instead force you into further fragmenting your information asset across multiple servers and engines, with the added complications to the BI infrastructure that brings. The other vendors will require you to purchase, install, build and manage seperate standalone multidimensional data marts, usually from 3rd party vendors. None of them have embedded analytics into the core of the Database like Oracle has. And none provide simple high performance SQL access to the results of these analytics.&lt;br /&gt;&lt;br /&gt;The combination of extremely fast performance for IO intensive queries &lt;em&gt;(which characterise the work of some of the users of the data warehouse and are typicaly the queries targetted by the DW Appliance vendors)&lt;/em&gt; together with the multidimensional calculation power of the OLAP Option &lt;em&gt;(which are commonly consumed by the masses via interactive dashboards etc, as well as used by the analyst users)&lt;/em&gt; in an easy to install, pre-configured, balanced hardware platform is very compelling.&lt;br /&gt;&lt;br /&gt;Exciting times for Oracle BI and Data Warehousing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2879502386630896622?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2879502386630896622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2879502386630896622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2879502386630896622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2879502386630896622'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/09/oracle-open-world-2008-hp-oracle.html' title='Oracle Open World 2008 - HP-Oracle Database Machine launch'/><author><name>Kevin Lancaster</name><uri>http://www.blogger.com/profile/06742628997065141834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_YgBaT41Fipk/SOAY1kqWGxI/AAAAAAAAACs/VS0zaylLkcM/s72-c/LarryKeynote03.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-1084062568708722357</id><published>2008-07-09T02:46:00.000-07:00</published><updated>2008-07-09T03:54:22.666-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g'/><title type='text'>Article : Closing the Ad Hoc Query Performance Gap for Good</title><content type='html'>I found an interesting article today in amongst my Google alerts. It related to a topic of conversation at the recent TDWI conference in May about the issue of adhoc query performance within data warehouse environments. The article, on the whole, was very good (in my opinion) and included comments by Oracle's vice-president of database marketing, Willie Hardie.&lt;br /&gt;&lt;br /&gt;The full article in &lt;span style="FONT-WEIGHT: bold"&gt;Enterprise Systems&lt;/span&gt; is available &lt;a href="http://www.esj.com/business_intelligence/article.aspx?EditorialsID=9034"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The article examines the reasons why business users feel their queries are taking too long and what steps companies are taking to try to improve query performance. The basic reasons for poor query performance was given as being down to two issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;success of pervasive BI - so more users are running adhoc queries&lt;/li&gt;&lt;li&gt;more data - users want access to more and more data, both in terms of level of detail and time span.&lt;/li&gt;&lt;/ul&gt;I would add a third reason, which is increasing sophistication. Simply presenting users with reports that show revenue and expenses for the latest month, quarter and year to date are not adequate in today's highly competitive environment. Business users want to know about trends - this period vs last period, this year vs last year, this period vs the same period last year, like-for-like, shares, ranks, forecast, customer segmentation, market basket analysis. The list goes on and on and on.&lt;br /&gt;&lt;br /&gt;Here is a direct quote from the article:&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;......The RDBMS -- or, more specifically, the &lt;/span&gt;&lt;em style="FONT-STYLE: italic"&gt;Oracle&lt;/em&gt;&lt;span style="FONT-STYLE: italic"&gt; RDBMS -- is an unmatched analytic workhorse, Hardie argues. Oracle is one of the biggest data warehousing players in the business, he points out, and the Oracle database powers some of the largest DWs in existence.&lt;/span&gt; &lt;p style="FONT-STYLE: italic"&gt;"The Oracle database is proven to be the fastest database out there for both transactional systems and data warehousing systems, across all scales, from small to extremely large systems. You ask any Oracle customer out there and they'll all give you the same answer: Oracle is the fastest database out there on the market right now," he claims. &lt;/p&gt;What I would add is the Oracle Database is the only database with embedded multidimensional OLAP, which is fine tuned for adhoc query performance, query scaleability and, most importantly, calculation power. As I stated above it is no longer about simply what is happened in the last trading period, BI analysis is now all about comparisons, trends and KPIs (calculations) at aggregate levels with the ability to drill right through to the lowest level of detail.&lt;br /&gt;&lt;br /&gt;As the article quite clearly acknowledges there is a trend to opening up the corporate data warehouse to more and more users, which means query performance and scalability are becoming increasingly important. Only Oracle Database has specific built-in optimisations, such as OLAP and data mining, to meet these growing requirements.&lt;br /&gt;&lt;br /&gt;For those of you new to Oracle OLAP Option and Oracle Data Warehousing you can get more information from these links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;Oracle OLAP Option on OTN&lt;br /&gt;&lt;/a&gt;&lt;a href="http://forums.oracle.com/forums/forum.jspa?forumID=16"&gt;Oracle OLAP Option Forum on OTN&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+Option"&gt;Oracle OLAP Option Wiki&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+Option"&gt;&lt;/a&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/olap.html"&gt;Oracle OLAP Option on Oracle.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/db/11g/index.html"&gt;Oracle Data Warehousing on OTN&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/dw_home.html"&gt;Oracle Data Warehousing on Oracle.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/optimized-warehouse-initiative.html"&gt;Optimised Warehouse Initiative&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-1084062568708722357?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.esj.com/business_intelligence/article.aspx?EditorialsID=9034' title='Article : Closing the Ad Hoc Query Performance Gap for Good'/><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/1084062568708722357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=1084062568708722357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1084062568708722357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/1084062568708722357'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/07/article-closing-ad-hoc-query.html' title='Article : Closing the Ad Hoc Query Performance Gap for Good'/><author><name>keith laker</name><uri>http://www.blogger.com/profile/13350994132294695189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_5ecFmVOLrwo/R6HKVXSqHjI/AAAAAAAAAQM/Qm7-vRHTn1o/S220/Me2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2514858031759738892</id><published>2008-06-02T03:34:00.000-07:00</published><updated>2008-12-11T15:25:17.957-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='10g'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Best Practice'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>Best Practice Tips : SQL Access to Oracle DB Multidimensional AW Cubes (#2)</title><content type='html'>&lt;div&gt;One of the most useful features introduced with Oracle Database OLAP is the ability for the powerful multidimensional calculation engine and the performance benefits of true multidimensional storage in the Analytic Workspace (AW), to be accessed and leveraged by simple SQL queries.&lt;br /&gt;&lt;br /&gt;This single feature dramatically increases the reach and applicability of multidimensional OLAP – to a vast range of BI query and reporting tools, and SQL-based custom applications that can now benefit from the superior performance, scalability and functionality of a first class multidimensional server, but combined within the Oracle Database with all the other advantages that derive from that. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;This post is the &lt;strong&gt;second&lt;/strong&gt; in a series that I will use to share some general best practice tips to get the most out of this feature, so that you can deliver even better solutions to your business end-users:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Best Practice Tip #2: &lt;/strong&gt;&lt;strong&gt;General AW Object Naming Conventions for dimensions, levels, hierarchies and attributes…&lt;/strong&gt;(Oracle Database 10g and 11g)&lt;br /&gt;&lt;br /&gt;The following advice will result in much easier to understand and use relational views over your AW. It makes the implementation much cleaner to visualise, and easier for other users to understand what they are looking at. It also saves a lot of typing for developers that are writing their own SQL queries!&lt;br /&gt;&lt;br /&gt;The objective is to ensure that the generated column names in your views are easy to read, and also to avoid the possibility that generated column names may get truncated to fit within the limits for a column name in Oracle Database (when that happens your views get really ugly really quickly). Finally, it has the additional desirable side effect of making it easier and therefore quicker to do the mappings in AWM because the screens are less cluttered with long-winded object names!&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;Note: this advice follows both for Oracle Database 10g OLAP (eg views created by the AWM10g View Generator Plug-in) and for Oracle Database 11g OLAP, where views are auto-generated (eg when creating your Standard From AW via AWM11g).&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Here is the idea:&lt;/strong&gt; &lt;/div&gt;&lt;ul&gt;&lt;li&gt;Keep the names used for dimensions, levels, hierarchies, and attributes as short as possible, while still meaningful of course. &lt;/li&gt;&lt;li&gt;If possible (simply for readability in the resulting relational view and column names), avoid the use of the "_" char especially for dimension, hierarchy, level and attribute names.&lt;/li&gt;&lt;li&gt;&lt;div align="left"&gt;If possible &lt;em&gt;(also recommended if Oracle OLAP API clients such as OracleBI Spreadsheet Add-in , OracleBI Discoverer Plus OLAP and OracleBI Beans will be used on the same AW),&lt;/em&gt; create the AW in its own schema.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="left"&gt;&lt;img id="BLOGGER_PHOTO_ID_5207301947241906770" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_YgBaT41Fipk/SEQNiBONwlI/AAAAAAAAABw/yrifWDSbcuw/s400/ObjectNameLengths.jpg" border="0" /&gt;&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_YgBaT41Fipk/SEQKsBONwgI/AAAAAAAAABI/3v1ZSUnIOE8/s1600-h/ObjectNameLengths.jpg"&gt;&lt;/a&gt;Don't be seduced into thinking it is a good idea to put "DIM" in the name of everything that is a dimension, or "ATT" into the name of all the attributes. You don't need to do this. The AW knows what objects are what, and you can very simply query the AW if you need, for example, to find out the names of all the Dimensions in an AW. &lt;em&gt;(Another topic for another day is to walk thru all the Data Dictionary stuff that helps with this). &lt;/em&gt;&lt;br /&gt;&lt;p align="left"&gt;In other words: If you have a Product Dimension, it is self-evidently a dimension, so clogging up its name with "_DIM" or "_DIMENSION" is just extra wear and tear on your keyboard!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To illustrate the impact this advice can have, here are two Product Dimensions, which apart from the fact one follows best practice advice and one does not, are identical (example is from Oracle Database 11g AW) &lt;em&gt;&lt;span style="font-size:85%;"&gt;(you can click on the picture to see it full size):&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;First&lt;/strong&gt; – two ways I could have created my Product Dimension:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_YgBaT41Fipk/SEQK5RONwhI/AAAAAAAAABQ/JuOxyeVPS-4/s1600-h/DimExamples_AWM.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5207299048138981906" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_YgBaT41Fipk/SEQK5RONwhI/AAAAAAAAABQ/JuOxyeVPS-4/s400/DimExamples_AWM.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Second&lt;/strong&gt; – what the resulting dimension views for the Main hierarchy would look like in each case:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_YgBaT41Fipk/SEQLCRONwiI/AAAAAAAAABY/nZRsnoKv_kw/s1600-h/DimExamples_Views.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5207299202757804578" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_YgBaT41Fipk/SEQLCRONwiI/AAAAAAAAABY/nZRsnoKv_kw/s400/DimExamples_Views.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Third&lt;/strong&gt; – how much harder it is to read and write the SQL to query the AW’s dimension as a result:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_YgBaT41Fipk/SEQLnhONwkI/AAAAAAAAABo/heiwUAQmYio/s1600-h/DimExamples_SQL.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5207299842707931714" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_YgBaT41Fipk/SEQLnhONwkI/AAAAAAAAABo/heiwUAQmYio/s400/DimExamples_SQL.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Which of these functionally identical examples is easier to read, easier to understand and easier to query?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;I rest my case&lt;/strong&gt;. Giving a bit of thought to the way you build your AW before you build it nearly always pays dividends later. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2514858031759738892?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2514858031759738892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2514858031759738892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2514858031759738892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2514858031759738892'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/06/best-practice-tips-sql-access-to-oracle.html' title='Best Practice Tips : SQL Access to Oracle DB Multidimensional AW Cubes (#2)'/><author><name>Kevin Lancaster</name><uri>http://www.blogger.com/profile/06742628997065141834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YgBaT41Fipk/SEQNiBONwlI/AAAAAAAAABw/yrifWDSbcuw/s72-c/ObjectNameLengths.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8737603170125527781</id><published>2008-05-31T11:48:00.000-07:00</published><updated>2008-12-11T15:25:18.095-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='10g'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Best Practice'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>Best Practice Tips : SQL Access to Oracle DB Multidimensional AW Cubes (#1)</title><content type='html'>One of the most useful features introduced with Oracle Database OLAP is the ability for the powerful multidimensional calculation engine and the performance benefits of true multidimensional storage in the Analytic Workspace (AW), to be accessed and leveraged by simple SQL queries.&lt;br /&gt;&lt;br /&gt;This single feature dramatically increases the reach and applicability of multidimensional OLAP – to a vast range of BI query and reporting tools, and SQL-based custom applications – BI and operational – that can now benefit from the superior performance, scalability and functionality of a first class multidimensional server, but combined within the Oracle Database with all the other advantages that derive from that. Bottom line: if you have a tool or application that can (a) connect to an Oracle Database instance, and (b) fire simple SQL at that Database, then you can get benefit from the AWs in that tool or application.&lt;br /&gt;&lt;br /&gt;This post is the &lt;strong&gt;first of a series&lt;/strong&gt; that I will use to share some general best practice tips to get the most out of this feature, so that you can deliver even better solutions to your business end-users.&lt;br /&gt;&lt;br /&gt;If any of you have tips and advice of your own that we can share, please contact us – we’ll be happy to publish your good ideas and experience with this feature of Oracle Database OLAP.&lt;br /&gt;&lt;br /&gt;Anyway. Enough pre-amble. Let’s get on with it. Here goes:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Best Practice Tip #1: Creating your views&lt;/strong&gt; (Oracle Database 10g and 11g)&lt;br /&gt;&lt;br /&gt;Basically the first tip in the series boils down to two things:&lt;br /&gt;&lt;br /&gt;1) Always build your AWs to Oracle Database OLAP ‘Standard Form’. This is what happens if you build them with AWM, OWB (10g-only at the time of this post, but support for 11g target AWs is due in OWB very soon), or the supplied AW API if you need to programmatically build and maintain your AW.&lt;br /&gt;2) Use the free-ware “View Generator” plug in for AWM10g to build your 10g views, and leverage the &lt;strong&gt;automatically generated&lt;/strong&gt; views in &lt;strong&gt;11g,&lt;/strong&gt; unless you have a very good reason not to.&lt;br /&gt;&lt;br /&gt;Together, if you follow this advice you will save a lot of time on your project, and also increase your ability to support the application going forward. And it will be a lot easier for others (such as Oracle Support, or your local friendly Oracle OLAP Consultant) to help you if you have any problems.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;More detail:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In &lt;strong&gt;Oracle Database 10g&lt;/strong&gt;, there is nothing to stop you coding your own views using the SQL OLAP_TABLE() function. And, if you have an entirely custom built AW this is pretty much your only option. However, if you have developed your AW to Oracle’s OLAP Standard Form specification you can save yourself the time, by using a handy dandy little plug-in for AWM10g. The plug-in is free shareware for AWM10gR2 &amp;amp; can be downloaded from &lt;a href="http://www.oracle.com/technology/products/bi/olap/viewGenerator_1_0_2.zip"&gt;here&lt;/a&gt;, with the associated ReadMe &lt;a href="http://www.oracle.com/technology/products/bi/olap/ViewGenerator.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The plug in steps you thru a simple wizard within AWM, allowing you to choose which measures etc you need, and then creates the views for you (storing the biggest lump of syntax – the ‘limitmap’ parameter which describes which AW objects show up in what columns in your view – inside the AW itself, in a multi-line text variable/measure).&lt;br /&gt;&lt;br /&gt;In &lt;strong&gt;Oracle Database 11g&lt;/strong&gt;, while &lt;span style="font-family:courier new;"&gt;OLAP_TABLE()&lt;/span&gt; is still available for you to use if you like (and sometimes it is perfect for your needs as it has lots of very clever hooks by which you can trigger various OLAP actions whenever a user selects from the view), for most cases, the new &lt;span style="font-family:courier new;"&gt;CUBE_TABLE()&lt;/span&gt; function added in Database 11g is much easier and therefore recommended.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CUBE_TABLE()&lt;/span&gt; views are what AWM11g automatically creates for you when defining the objects inside the AW. Assuming you have a valid Standard Form 11g Database AW, such as you might build in AWM11g, &lt;span style="font-family:courier new;"&gt;CUBE_TABLE()&lt;/span&gt; is much, much easier to use than &lt;span style="font-family:courier new;"&gt;OLAP_TABLE().&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example, the entire syntax required to create a Dimension View, for a specified hierarchy of that Dimension in an AW (not that I even have to type any of this in, as the AWM tool does it automatically for me) is as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE FORCE VIEW MYDIM_MYHIER_VIEW AS&lt;br /&gt;SELECT * &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM TABLE( CUBE_TABLE('MYSCHEMA.MYDIM;MYHIER') );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How easy is that?!&lt;br /&gt;&lt;br /&gt;All you need to know about your AW is the name of the Hierarchy (MYHIER), Dimension (MYDIM) and schema that the AW is built in (MYSCHEMA). All the object mappings that you have to tell &lt;span style="font-family:courier new;"&gt;OLAP_TABLE&lt;/span&gt; about, in the limitmap parameter, are automatically done as a result of improvements in Database 11g’s Data Dictionary (which is now fully aware of the details of the contents of the AW).&lt;br /&gt;&lt;br /&gt;Here (below) is what an example Product Dimension looks like in AWM11g, and the resulting View:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_YgBaT41Fipk/SEQH7hONwfI/AAAAAAAAABA/C1EsKmv1qA8/s1600-h/PROD_and_View.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_YgBaT41Fipk/SEQH7hONwfI/AAAAAAAAABA/C1EsKmv1qA8/s400/PROD_and_View.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5207295788258804210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;Note that the OLAP Option only allows one Dimension or Cube (and therefore Dimension View, or Cube View) of a given name in each SCHEMA. For this reason, it is our recommendation that each AW be built in its own schema if possible. This will allow you, if you ever need to, to have a PROD dimension or SALES Cube in more that one unrelated AW. This tip will be included again, in an upcoming Post on Best Practice AW Design practices, and naming conventions.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8737603170125527781?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8737603170125527781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8737603170125527781' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8737603170125527781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8737603170125527781'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/05/best-practice-tips-sql-access-to-oracle.html' title='Best Practice Tips : SQL Access to Oracle DB Multidimensional AW Cubes (#1)'/><author><name>Kevin Lancaster</name><uri>http://www.blogger.com/profile/06742628997065141834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YgBaT41Fipk/SEQH7hONwfI/AAAAAAAAABA/C1EsKmv1qA8/s72-c/PROD_and_View.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-4656394751729616749</id><published>2008-04-21T22:00:00.000-07:00</published><updated>2008-12-11T15:25:24.150-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='10g'/><category scheme='http://www.blogger.com/atom/ns#' term='Tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>Tuning Guidance for OLAP 10g</title><content type='html'>My assumption with this posting is: you are familiar with all the basic OLAP terms such as, dimensions, levels, hierarchies, attributes, measures, cubes, etc.  If this is not the case then go to the Oracle Wiki and checkout these links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+Olap+Option"&gt;http://wiki.oracle.com/page/Oracle+Olap+Option&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+Olap+Terminology"&gt;Terminology&lt;/a&gt; - Key Concepts and Terms&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+How+To"&gt;Oracle OLAP How To&lt;/a&gt; - Performance Tuning and more ...&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+DBA+Sample+Scripts"&gt;Script Samples&lt;/a&gt; - for DBAs managing the OLAP option.&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+Did+You+Know%3F"&gt;Did You Know?&lt;/a&gt; - that in the Oracle OLAP option you can.&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+Diagnostic+Techniques"&gt;Diagnostic Techniques&lt;/a&gt; - for those using the OLAP option.&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+RAC+%26+GRID"&gt;RAC &amp;amp; GRID&lt;/a&gt; - for those using OLAP option with RAC or GRID&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Most people when they approach OLAP for the first time, create a data model that either takes too long to build or too long to query.  The “too long to query” is usually the first problem to arise and in trying to solve this issue they create the second problem “too long to build”.  There is a balance that needs to be achieved when designing OLAP data models.  That balance is between pre-solving every level across all dimensions, which increases build time, and providing users with fast query performance.  Most people assume there is a direct relationship between the number of levels that are pre-solved and query performance.  As one goes up so does the other:  pre-solve more levels and query performance improves.  Therefore, the answer to poor query performance is to pre-solve all levels across all dimensions correct?  Yes and no.  Most systems do not have an infinite window for building cubes.  Fortunately, using Oracle OLAP Option it is possible to balance the amount of time taken to build a cube and still ensure excellent query performance.  How is this achieved?&lt;br /&gt;&lt;br /&gt;Oracle OLAP is the most powerful and scalable OLAP server on the market.  Because OLAP is inside the database it inherits all the native scalability, security and performance of the Oracle database and it is because the database is so fast and scalable there is a tendency to ignore certain design principles when building an OLAP data model.  If the original design and methodology is sound then tuning is very quick and easy to manage.  But there is no silver bullet to make OLAP go faster, as one of our OLAP gurus states: there is no ”_OLAP_TURBO_MODE=YES” setting for the init.ora.&lt;br /&gt;&lt;br /&gt;What follows is a series of recommendations and observations based on my experience on various OLAP projects to help optimize OLAP builds.  This is not the authoritative guide to tuning OLAP data models; just my thoughts.&lt;br /&gt;&lt;br /&gt;When asked to tune an existing OLAP data model I break the work up in to five sections:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/SAxy8LuJKXI/AAAAAAAAAVc/mf2jqgqK6iU/s1600-h/Slides+for+Keith.001.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/SAxy8LuJKXI/AAAAAAAAAVc/mf2jqgqK6iU/s400/Slides+for+Keith.001.png" alt="" id="BLOGGER_PHOTO_ID_5191650848715385202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tuning a data load process needs to be done in a step-by-step process.  Trying to rush things and changing too many settings at once can simply create more problems than it solves.  It is also important to start at the beginning with the hardware and lastly look at the database instance itself.  Most DBAs will be tempted to rip open the init.ora file and start tweaking parameters in the hope of making the build run faster.&lt;br /&gt;&lt;br /&gt;However, the area that is likely to have the biggest impact is refining (or possibly even changing) the implementation of the logical model.  But when making changes that improve the build performance you should also check the impact on query performance to ensure the amount of time taken to return a query is still within acceptable limits.&lt;br /&gt;&lt;br /&gt;Below are the steps I use when I am asked to analyse the build performance on an OLAP schema.  But before you start a tuning exercise, I would recommend reading the &lt;span style="font-weight: bold;font-size:85%;" &gt;2-Day Performance Tuning Guide&lt;/span&gt; that is now part of the database documentation suite.  It provides a lot of useful information.  It is available as an &lt;a href="http://www.oracle.com/pls/db111/to_toc?pathname=server.111/b28275/toc.htm"&gt;HTML&lt;/a&gt; document and &lt;a href="http://www.oracle.com/pls/db111/to_pdf?pathname=server.111/b28275.pdf"&gt;PDF&lt;/a&gt; document.  The PDF document can be downloaded and stored on your laptop/memory stick etc for easy reference.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Part 1 - Analysis of Hardware&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;In any situation the first challenge in a tuning exercise is to ensure the foundation for the whole solution is solid.  This tends to be the biggest challenge because it can involve a working with a number of hardware and software vendors.  Trying to make sure your environment is based on an adequate configuration can be time consuming and risky, and will probably end in a compromise between performance, scalability, manageability, reliability, and naturally price.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/SAxzkLuJKYI/AAAAAAAAAVk/aYhDx5l6aR4/s1600-h/Slides+for+Keith.002.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/SAxzkLuJKYI/AAAAAAAAAVk/aYhDx5l6aR4/s400/Slides+for+Keith.002.png" alt="" id="BLOGGER_PHOTO_ID_5191651535910152578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Configurations can be difficult to analyse and most of the time.  This analysis typically tends to degenerate into each vendor in the hardware stack blaming the other vendor and/or the database.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Step 1 – Check Patches&lt;/span&gt;&lt;br /&gt;When analysing an existing environment make sure all the latest firmware, drivers and O/S patches have been applied.  Refer to the Oracle database installation guide, Metalink, and the hardware vendors web sites for more details.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/documentation/index.html"&gt;Oracle Documentation Portal&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://metalink.oracle.com/"&gt;Oracle Support Portal&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Step 2 – Determine Workload&lt;/span&gt;&lt;br /&gt;In a good environment you should be expecting to load about 1 million rows per minute via OLAP.  This is the benchmark.  Check the XML_LOAD_LOG table from previous builds to determine if this is being achieved.   Here is a log from a data load for the Common Schema AW based on a relatively simple view that joins two fact tables together to load three measures.  Approximately 900,000 records are loaded in 57 seconds.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx0aruJKZI/AAAAAAAAAVs/YbC8n5b-LtA/s1600-h/image1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx0aruJKZI/AAAAAAAAAVs/YbC8n5b-LtA/s400/image1.PNG" alt="" id="BLOGGER_PHOTO_ID_5191652472213023122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this case, we could conclude this is a reasonable starting point to begin the next phase of the tuning exercise.  However, don’t forget the performance initially listed in XML_LOAD_LOG could be influenced by a number of factors, but if the data source is a table or a very simple view, then 1 million rows a minute should be achievable.  Anything less tends to indicate some sort of I/O issue, or possibly the use of inefficient SQL to extract data from the source.  The ADDM analysis of I/O performance partially depends on a single argument, DBIO_EXPECTED, that describes the expected performance of the I/O subsystem. The value of DBIO_EXPECTED is the average time it takes to read a single database block in microseconds. Oracle uses the default value of 10 milliseconds, which is an appropriate value for most modern hard drives. If your hardware is significantly different, such as very old hardware or very fast RAM disks, consider using a different value.  To determine the correct setting for DBIO_EXPECTED parameter, perform the following steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Measure the average read time of a single database block read for your hardware. Note that this measurement is for random I/O, which includes seek time if you use standard hard drives. Typical values for hard drives are between 5000 and 20000 microseconds.&lt;/li&gt;&lt;li&gt;Set the value one time for all subsequent ADDM executions. For example, if the measured value if 8000 microseconds, you should execute the following command as SYS user: &lt;/li&gt;&lt;li&gt;EXECUTE DBMS_ADVISOR.SET_DEFAULT_TASK_PARAMETER( 'ADDM', 'DBIO_EXPECTED', 8000);&lt;/li&gt;&lt;/ol&gt;Also review the Performance Tuning Guide, &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/iodesign.htm#i20394"&gt;Chapter 8 : I/O Configuration and Design&lt;/a&gt;.   Specifically, review these two sections:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/#CHDBBADG"&gt;Prerequisites for I/O Calibration&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/#CHDGBECA"&gt;Running I/O Calibration&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;Parallel vs Serial Processing&lt;/span&gt;&lt;br /&gt;As part of this step some consideration needs to given to parallel vs serial processing.  I find most people will start by running a build in serial mode and then assume if it takes X amount of time to process in serial mode, running in parallel mode will naturally take X/No of parallel jobs.  Of course this is true up to a point.  There is a definite tipping point in parallel processing where the law of diminishing returns sets in very quickly.  As a starting point if I am going to process a load in parallel I will start by using a job queue = “No. of CPUs-1”.  This is usually a good starting point and depending on where the bottlenecks start appearing (CPU waits vs I/O waits) I may increase or decrease this figure during testing.&lt;br /&gt;&lt;br /&gt;Parallel processing is a very useful tool for improving performance but you need to use partitioned cubes and the data being load must map across multiple partition keys to result in parallel processing.  As before, this is not a silver bullet that will simply make everything run faster.  It needs to be used carefully.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Step 3 – Determine Best Reference Configurations&lt;/span&gt;&lt;br /&gt;What can be useful is to work from a set of known configurations designed to provide a stated level of performance.  Oracle has worked with a number of hardware vendors to provide documented configurations for data warehouse solutions.  These configurations can be used as benchmarks and/or recommendations for your environment.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/emc.html"&gt;Reference Configurations for Dell and EMC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/hp.html"&gt;Reference Configurations for HP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/ibm.html"&gt;Reference Configurations for IBM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/solutions/business_intelligence/sun.html"&gt;Reference Configurations for Sun&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Each configuration combines software, hardware, storage, I/O and networking into an optimized environment for different scales of customer data warehouse requirements. Using extensive customer experience and technical knowledge, Oracle and its hardware partners have developed configurations for data warehouses with varying raw data sizes, concurrent user population and workload complexity. By offering customers reference configurations suited for different profiles, customers can select the one that best suits their business and price, performance requirements. And since they're built on scalable, modular components, these reference configurations enable customers to aggressively pursue incremental data warehouse growth.&lt;br /&gt;&lt;br /&gt;One of the key questions for the performance tuning exercise is:  Are you just tuning the model based on today’s data volumes or should the exercise look to maximise performance of future load volumes.  This is a very tricky area to manage and difficult to plan and test.  Which is why having a referenceable configuration is so important.  Why?  Because the reference configurations provide a clear upgrade path and levels of performance are certified along that upgrade path.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Step 4 – Match/Compare/Contrast with Existing Configurations&lt;/span&gt;&lt;br /&gt;In reality altering your hardware configuration is going to be a given.  To change a configuration is likely to be a costly and time-consuming exercise.  However, it should not be ignored.  If you have followed and tuned your data model based on the following recommendations and the load and aggregation phase is still too long then a full hardware review may in fact be needed and upgrades may need to be purchased.  Hopefully, the next result of this whole exercise is to provide some sort of cost/benefit report to outline expected performance improvements based on additional hardware costs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Part 2 - Analysis of Dimensions&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The second stage is to review the logical model for the dimensions.  This stage is largely to confirm the dimensions are correctly implemented and the source data is of good quality.  Most of this analysis is really just making sure there are no big issues within the various dimensions and possibly making small changes based on experience from various projects.   But it is important to ensure the dimensions are of “good quality” before moving on to review the cubes – there is no point building a house on a sand bank and then wondering why it gets washed away (if that makes sense?).  Good foundations are needed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SAx14buJKaI/AAAAAAAAAV0/RL9zWS4AcwM/s1600-h/Slides+for+Keith.003.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SAx14buJKaI/AAAAAAAAAV0/RL9zWS4AcwM/s400/Slides+for+Keith.003.png" alt="" id="BLOGGER_PHOTO_ID_5191654082825759138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Analysis of Attributes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Many customers implement dimensions when they only really need attributes.  This usually happens when they are migrating from a legacy OLAP server to Oracle OLAP.  We have a customer at the moment that has an existing OLAP data model in a legacy OLAP server based on 60 dimensions.  Reviewing the queries the users make against the data model it became clear that many of these dimensions were in fact simple attributes within Oracle OLAP.  This can have a significant impact on the design of related cubes and the whole loading process, since fewer dimensions within a cube will improve both load and aggregation times.&lt;br /&gt;&lt;br /&gt;Can Oracle OLAP support extremely large dimensional models?  Yes it can. The engine will support up to 256 dimensions within a single cube and within the AW you can have as many dimensions as you need.  The key point here is:  each cube can have its own dimensionality. Oracle OLAP does not implement hyper-cubes where every cube has to share the same dimensionality – one of the key benefits of Oracle OLAP over other legacy OLAP engines is that it does support cubes of different dimensionality.&lt;br /&gt;&lt;br /&gt;There is an excellent customer case study in the December 07 OLAP Newsletter that examines how one customer managed a very large data models based on lots of dimensions.  The &lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/newsletter/oracleolapnewsletter_dec07.html"&gt;E.ON&lt;/a&gt; data model contains multiple cubes (subject areas) each with between 6 to 12 dimensions.  The cubes are updated weekly with many millions of rows loaded and aggregated, with about 1 million rows updated in the cube per minute.  For more information, read the complete review by clicking &lt;a href="http://www.oracle.com/technology/products/bi/olap/olapref/newsletter/oracleolapnewsletter_dec07.html"&gt;here&lt;/a&gt;.  There are many other customers with even bigger models.&lt;br /&gt;&lt;br /&gt;From a UI perspective you need to think very carefully about the number of dimensions within a cube.  Many UI studies have shown business users find it increasingly difficult to interpret the results from a dataset where there are more than nine dimensions.  Although, as the above case shows, it is possible for some users to interact with larger more complex models providing the information is presented in usable format, it is worth spending some time clarifying the exact dimensionality of each cube.&lt;br /&gt;&lt;br /&gt;If you think about a typical crosstab layout, a nine dimensional cube results in one row edge dimension, one column edge dimension and seven page edge dimensions plus the measure dimension. That is a huge amount of information to absorb and, in my opinion, makes constructing queries very difficult.  Another, issue that frequently occurs, as the number of dimensions increases, is the game of “hunt-the-data”.  Even with only nine dimensions in a cube it is likely the data set will be extremely sparse and drilling down only one or two levels across a couple of dimensions can result in crosstabs with little or no data.  Some BI tools try to mask this problem by providing an NA and/or Zero row filters.  The net result is usually a “no rows returned” message appearing in the body of the report at regular intervals.&lt;br /&gt;&lt;br /&gt;My main recommendation is:  Check the number of dimensions in your model and for the sake of your users and try to keep the number within each cube down to something intelligible. For example approximately nine – this is not a hard and fast rule; just a recommendation but do read the E.ON case study as well.  If you are presented with a data model, do not be afraid to challenge the dimensionality of the cubes within the model.  Make sure all the dimensions within a cube are really required because I can guarantee some are simply basic attributes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - Analysis of Level Keys&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There is not much that needs to be done here except to make sure to use surrogate keys except when you are certain the dimension keys are unique across all levels.  This is not always the case and using a surrogate key is a good way to ensure your hierarchies are correctly populated.  OLAP creates a surrogate key by prefixing the original source key with the level identifier.  Therefore, from a storage perspective it makes sense to make the level key as short as possible.  For example, don’t create a level identifier such as “PRODUCT_SUB_CATEGORY_SKU_IDENTIFIER”.  There is a limit of 30 characters for level names.   In practice I have seen issues with both data loading and aggregation where very large dimension keys (i.e. greater than 400 characters) have been created.&lt;br /&gt;&lt;br /&gt;In practice I recommend using simple level identifiers such as L1, L2, L3 although this does make writing SQL statements a little more challenging via the SQL Views as the level identifier is used in the column name along with the dimension and it is not exactly obvious what each column contains when they are called PODUCT_L1, PRODUCT_L2 etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Surrogate vs Natural Keys&lt;/span&gt;&lt;br /&gt;The use of surrogate keys is an interesting area.  During some projects it has been found that by not using surrogate keys build performance has increased.  This does make sense since the source data for cube will have to be reformatted at load time to ensure the key is valid.  In some cases the amount of time required to manipulate the incoming key values may be minimal.  In other cases it has had a significant impact on load performance – the “1 million rows a minute” benchmark was not achieved and reverting to natural keys did improve load times.  If the data source can be guaranteed to provide unique keys across all levels it is probably worth switching to natural keys.  But be warned – you cannot switch between using surrogate and natural keys if the cube already contains data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Quantitative Analysis of Members&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This is an important step as it will allow us to determine which levels to pre-aggregate within the cube.  In most cases the default skip level approach to pre-solving levels within a cube is a reasonable starting point.  But it is possible to design a much better model by analysing the number of members at each level and the average number of children for each level.&lt;br /&gt;&lt;br /&gt;Lets look at two real customer examples:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dimension 1&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/SAx51LuJKbI/AAAAAAAAAV8/uZfljQDXbBk/s1600-h/image2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/SAx51LuJKbI/AAAAAAAAAV8/uZfljQDXbBk/s400/image2.PNG" alt="" id="BLOGGER_PHOTO_ID_5191658425037695410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A change as simple as this could have a huge impact on the amount of time taken to aggregate a cube.&lt;br /&gt;&lt;br /&gt;However, in some cases the OLAP Compression feature can be useful in terms of allowing you to pre-compute additional lower levels within a hierarchy for little or no additional cost because the sparsity of the data allows higher levels to compressed out of the cube.  If you have a situation where there is almost a 1:1 relationship between a level and the next level down in the hierarchy it would make sense to pre-compute that level since the compression feature will compress out the redundant data.  For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dimension 2&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx6ZruJKdI/AAAAAAAAAWM/qA8BylJ7tzg/s1600-h/image2b.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx6ZruJKdI/AAAAAAAAAWM/qA8BylJ7tzg/s400/image2b.PNG" alt="" id="BLOGGER_PHOTO_ID_5191659052102920658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this example the hierarchy is relatively flat and the number of children returned at each level varies quite a lot.  But at the lowest levels, there is likely to be a large number of instances where a parent only has a single child and in these situations the compress feature can compress out the repeated values.  Therefore, it might make sense to solve levels L5 and L4.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dimension 3&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx6VruJKcI/AAAAAAAAAWE/yo62NhDJKJU/s1600-h/image2c.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx6VruJKcI/AAAAAAAAAWE/yo62NhDJKJU/s400/image2c.PNG" alt="" id="BLOGGER_PHOTO_ID_5191658983383443906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this example the hierarchy here shows the normal pyramid approach and is definitely bottom heavy.  But the upper levels contain relatively few members and drilling typically returns very few members.  The default skip level approach for this dimension may in fact be pre-solving too many levels.  In practice it may take 2 or 3 builds to determine which are the best levels to pre-solve, with a good starting point being:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Run 1: L7, L5, L2&lt;/li&gt;&lt;li&gt;Run 2: L7, L6, L1&lt;/li&gt;&lt;li&gt;Run 3: L7, L4, L2&lt;/li&gt;&lt;/ul&gt;This dimension shows that it may be necessary to schedule multiple runs to test these various scenarios.  Again we need to consider the impact of using compression, which allows OLAP to solve additional levels very cheaply.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 4a - Hierarchy Validation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Always, always check your hierarchies are functioning correctly.  This involves using the Data Viewer feature within AWM.  You should make sure the dimension is drillable and that selecting each level in turn returns the correct result-set.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SAx7AbuJKfI/AAAAAAAAAWc/lz13uCxX5m8/s1600-h/image4.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SAx7AbuJKfI/AAAAAAAAAWc/lz13uCxX5m8/s400/image4.PNG" alt="" id="BLOGGER_PHOTO_ID_5191659717822851570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx68ruJKeI/AAAAAAAAAWU/UrMLXDMFgHM/s1600-h/image5.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx68ruJKeI/AAAAAAAAAWU/UrMLXDMFgHM/s400/image5.PNG" alt="" id="BLOGGER_PHOTO_ID_5191659653398342114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A better approach is actually to make the database do the work, but this requires some additional SQL commands to be executed against the source tables.  Ideally, try and create a relational dimension over the source table(s).  Normally, the relational dimension object is used within query rewrite, which in this case we are not really concerned with for 10gR2 (in 11g the story is quite different as a cube can be registered as a materialised view and used for query-rewrite).  But this does allow us to use the dbms_dimension.validate_dimension procedure verifies that the relationships specified in a dimension are valid. The rowid for any row that is found to be invalid will be stored in the table DIMENSION_EXCEPTIONS in the user's schema.  The procedure looks like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    DBMS_DIMENSION.VALIDATE_DIMENSION (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        dimension               IN VARCHAR2,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        incremental             IN BOOLEAN := TRUE,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        check_nulls             IN BOOLEAN := FALSE,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        statement_id            IN VARCHAR2 := NULL );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note that before running the VALIDATE_DIMENSION procedure, you need to create a local table, DIMENSION_EXCEPTIONS, by running the provided script utldim.sql. If the VALIDATE_DIMENSION procedure encounters any errors, they are placed in this table. Querying this table will identify the exceptions that were found. To query this table you can use a simple SQL statement such as this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    SELECT * FROM dimension_exceptions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    WHERE statement_id = 'Product Validation';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, rather than query this table, it may be better to query the rowid of the invalid row to retrieve the actual row that has generated the errors. In this example, the dimension PRODUCTS is checking a table called DIM_PRODUCTS. To find any rows responsible for the errors simply link back to the source table using the rowid column to extract the row(s) causing the problem, as in the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    SELECT * FROM DIM_PRODUCTS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    WHERE rowid IN (SELECT bad_rowid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    FROM dimension_exceptions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    WHERE statement_id = &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    'Product Validation');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 4b - Hierarchy Order&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The order of hierarchies within a dimension can have a significant impact on query performance.  When solving levels at run-time the OLAP engine will use the last hierarchy in the list as the aggregation path.  Consider this example using a time dimension:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/SAx767uJKgI/AAAAAAAAAWk/0lyK_7rFtrM/s1600-h/image5a.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/SAx767uJKgI/AAAAAAAAAWk/0lyK_7rFtrM/s400/image5a.PNG" alt="" id="BLOGGER_PHOTO_ID_5191660722845198850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let’s assume we pre-compute the levels Month and Quarter.  But decide not to pre-compute the Year level because the main hierarchy used during queries is the Julian Year-Quarter-Month-Day and, therefore, the total for each Year will be derived from adding up just 4 values.  In fact, the aggregation engine looks at all the hierarchies to find the lowest common level across all hierarchies, which in this case is Day.  It then selects the last hierarchy in the list containing the level Day, in this case the Week hierarchy.  Therefore, the value for the each dimension member at the Year level will be the result of adding up 365/366 values and not simply 4 Quarter values.&lt;br /&gt;&lt;br /&gt;The obvious question is why?  The answer is to ensure backward compatibility with the Express ROLLUP command from which the AGGREGATE command is derived.  When the Aggregate command was introduced one of our requirements was that it produced numbers that matched those of Rollup, thus in cases where an aggregate node was declared in multiple hierarchies we always produced numbers based on the LAST definition of the node because that would be the number that matched the procedural approach taken by rollup.  Because of this feature an alternative approach to hierarchy ordering might be as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SAx8JbuJKhI/AAAAAAAAAWs/dHtg9aRtMDM/s1600-h/image5b.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SAx8JbuJKhI/AAAAAAAAAWs/dHtg9aRtMDM/s400/image5b.PNG" alt="" id="BLOGGER_PHOTO_ID_5191660971953302034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now the run-time aggregation for Year will be derived from the level Quarter, which has been pre-computed, and the result will be returned much faster.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 5 - Check the Data Quality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This last step is probably the most important, especially as OLAP style projects tend to be scheduled once all the ETL has been completed.  But you should never take the quality of the source data for granted.  Ideally you can use the Data Quality option of Warehouse Builder (which is a costed option for OWB) and analyse the source data for each dimension to make sure the data is of a reasonable quality.  Things to check are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Consistent data type&lt;/li&gt;&lt;li&gt;Number distinct values&lt;/li&gt;&lt;li&gt;Min and Max values&lt;/li&gt;&lt;li&gt;Domain members&lt;/li&gt;&lt;li&gt;Number of members not present in the fact table&lt;/li&gt;&lt;/ul&gt;OLAP stores all members as data type text.  Even if there are inconsistent data types within the source data, everything gets converted to text.  This can mask some issues where unusual dimension members are included in the source data such as –9999, or XXXX.  In many cases the data owners are completely unaware these values exist, or, worse still – they are included to allow the data to balance correctly and used as journal buckets.  It may not be possible to remove these values but it is important to know they exist and equally important to clarify if they are in fact needed.&lt;br /&gt;&lt;br /&gt;The last one is an interesting check especially if you are using that dimension as a partition key.  If you are creating lots and lots of empty partitions that will never contain data then should those members even be loaded?  In a recent project I identified a dimension that contained over 300,000 leaf node members, but in the main fact table there was only data for 50% of those members.  The obvious question is why load 150,000 plus members if you are never going to post data to them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Part 3 - Analysis of Cubes&lt;/span&gt;&lt;br /&gt;The next stage is to review the data model for each cube in turn.  It is in this area the biggest impacts on load time are likely to be achieved.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx89ruJKiI/AAAAAAAAAW0/CGdOECd-x0M/s1600-h/Slides+for+Keith.004.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SAx89ruJKiI/AAAAAAAAAW0/CGdOECd-x0M/s400/Slides+for+Keith.004.png" alt="" id="BLOGGER_PHOTO_ID_5191661869601466914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Analysis of Storage Model&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;It is important to assign an efficient storage model to a cube, as this will have a significant impact on both the load and aggregation times.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make sure compression is enabled.&lt;/li&gt;&lt;li&gt;Data type should be either DECIMAL or INTGER&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Warning do not use NUMBER as this uses approximately 3.5 times the storage compared to DECIMAL, but it is the default.  Number requires 22 bytes and Decimal requires 8 bytes (See OLAP Application Developers Guider, 10.2.0.3, Chapter 7 Aggregating Data).&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Try not to use Global Composites.  There is little need to use this feature, except in very special cases where you need to optimise the retrieval of rows via SQL access and you want to only report non-NA and/or non-zero rows.    Note – if you are using compression it is not possible to use the “Global Composites” feature even though in AWM10gR2 the option box is still enabled even after you select to use compression.  (In 11g there are database events you can use to optimise the retrieval of non-NA/zero rows.  See the posting by Bud Endress on the OLAP Blog: &lt;a href="http://oracleolap.blogspot.com/2008/04/attribute-reporting-on-cube-using-sql.html"&gt;Attribute Reporting on the Cube using SQL&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - Analysis of Sparsity Model&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Management of sparsity within a cube is critical.  Firstly the order of the dimensions is very important.   When using compression, which should always be enabled, dimensions should be ordered with the dimension with the least number of members first and the dimension with the most number of members last.  The most common question is:  Should time be dense or sparse?&lt;br /&gt;&lt;br /&gt;Answer – it depends.  This is where you need to have a deep understanding of the source data and the data quality features in OWB can really help in this type of situation.  In some models time works best dense and in other models time works best when it is sparse.  This is especially true when time is used as the partition dimension.  Therefore, you need to plan for testing these different scenarios.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/SAx9i7uJKjI/AAAAAAAAAW8/YgV9VxEHp7c/s1600-h/Image6.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/SAx9i7uJKjI/AAAAAAAAAW8/YgV9VxEHp7c/s400/Image6.PNG" alt="" id="BLOGGER_PHOTO_ID_5191662509551594034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is sparsity advisor package in the database, which analyses the source data in relational tables and recommends a storage method. The recommendations may include the definition of a composite and partitioning of the data variable. The Sparsity Advisor consists of these procedures and functions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SPARSITY_ADVICE_TABLE Procedure&lt;/li&gt;&lt;li&gt;ADD_DIMENSION_SOURCE Procedure&lt;/li&gt;&lt;li&gt;ADVISE_SPARSITY Procedure&lt;/li&gt;&lt;li&gt;ADVISE_DIMENSIONALITY Function&lt;/li&gt;&lt;li&gt;ADVISE_DIMENSIONALITY Procedure&lt;/li&gt;&lt;/ul&gt;The Sparsity Advisor also provides a public table type for storing information about the dimensions of the facts being analyzed.   I have to say this is not the friendliest package ever shipped with the database, but it can be useful in some situations. To use the Sparsity Advisor you need to follow these five steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Call SPARSITY_ADVICE_TABLE to create a table for storing the evaluation of the Sparsity Advisor.&lt;/li&gt;&lt;li&gt;Call ADD_DIMENSION_SOURCE for each dimension related by one or more columns to the fact table being evaluated.  The information that you provide about these dimensions is stored in a DBMS_AW$_DIMENSION_SOURCES_T variable.&lt;/li&gt;&lt;li&gt;Call ADVISE_SPARSITY to evaluate the fact table.  Its recommendations are stored in the table created by SPARSITY_ADVICE_TABLE. You can use these recommendations to make your own judgements about defining variables in your analytic workspace, or you can continue with the following step.&lt;/li&gt;&lt;li&gt;Call the ADVISE_DIMENSIONALITY procedure to get the OLAP DML object definitions for the recommended composite, partitioning, and variable definitions, or&lt;/li&gt;&lt;li&gt;Use the ADVISE_DIMENSIONALITY function to get the OLAP DML object definition for the recommended composite and the dimension order for the variable definitions for a specific partition.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The OLAP Reference manual provides an example script for the GLOBAL demo schema to analyse the relational fact table.  The amount of information required does seem a little excessive given that most of it could be extracted from the various metadata layers – may be some bright person will create a wrapper around this to simplify the whole process.&lt;br /&gt;&lt;br /&gt;On the whole I still find the majority of models work best with everything sparse and to far I have only found a few cases where load and aggregation times improved when time was marked dense.  But as with all tuning exercises, it is always worth trying different options, as there is no “fits-all” tuning solution with OLAP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Analysis of Partition Model&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Partitioning is managed at both the logical and physical levels.  At the logical level, it is possible to partition a cube using a specific level to split the cube into multiple chunks.  At the physical level, it is possible to partition the actual AW$ table and associated indexes that form the AW.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Logical Partitioning&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Always start by use partitioning. Why?  Because partitioning allows the cube to be broken down into smaller segments – much like relational table partitioning.  This can help improve the aggregation phase of a build because the engine is able to load more related data into memory during processing.  It also allows you to use the parallel update features of Oracle OLAP during a build.  But there are some things to consider when setting up partitioning.  When using partitioning you should:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Try to select a dimension that has balanced partitions, such as Time&lt;/li&gt;&lt;li&gt;Try to select a dimension level that is not too volatile, this is one of the reasons for electing to use a dimension such as time.&lt;/li&gt;&lt;li&gt;Select the Level based on the information collected during Step 3 of the analysis of dimensions.  In 10g, the levels above the partition key are solved at run time (this is resolved in 11g) so select the level for the partition key carefully.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;When selecting the partition key consider the impact this will have on the default partition, which contains all the levels above the partition level.  For example partitioning on a level such as Day might generate nice small partitions but the default partition will contain all the other members such as Week, Month, Quarter and Year making the default partition very large.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;It might be necessary to experiment with different partition keys to get the right balance between stored and run time aggregation.   For example, if you partition using a Time dimension then Month is usually a good level to select as the key since each year only needs to aggregate 12 members to return a total, but if you have 30 years of data and most reports start at the year level displaying all 30 years the run time performance might not be acceptable.  In this case the level Quarter or even Year might be a better option.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Parallel vs Serial Processing&lt;/span&gt;&lt;br /&gt;Logical partitioning is required for cubes where you want to enable parallel processing.  But be warned, running a job in parallel may not improve processing times.  In fact using too many parallel processes can have the opposite affect.  But used wisely, parallel processing can drastically improve processing times provided the server is not already CPU bound.  As a starting point I always begin testing by setting the value MaxJobQueues to “No. of CPUs-1” in the XML file for the definition of the build.  In some cases even this might be too high and reducing this figure can actually improve processing times.  Tuning AW parallel processing is exactly the same as tuning relational parallel processing – you need to determine where the point of diminishing returns sets in, which can be a combination:&lt;br /&gt;&lt;br /&gt;CPU loading&lt;br /&gt;I/O bandwidth&lt;br /&gt;Cube design&lt;br /&gt;&lt;br /&gt;Do not assume throwing parallel resources at a performance issue will resolve the whole problem.  Managed carefully this can provide a significant improvement in peformance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Physical Partitioning&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The aim of relational (physical) partitioning is to allow you to control the tablespace for each partition thus distributing the load across multiple disks, to spread data across a variety of disk types (see information on ILM on OTN) and to enhance query performance since it is possible to direct specific queries to a smaller subset of data.&lt;br /&gt;&lt;br /&gt;Some, but not all of this applies to an AW.  From a tablespace perspective it is probably easier to use ASM to manage and distribute the storage of an AW across multiple disks as opposed to creating a partitioned AW$ table spread across multiple tablespaces.  The reason the AW$ table is partitioned is optimise the lob performance.  Each partition has its own lob index, which manages its storage, and a separate slave process can update each partition.&lt;br /&gt;&lt;br /&gt;The relational table that acts as a container for the AW, AW$xxxxx , can be partitioned to break the AW into more physical chunks which can reduce contention for locks on the relational objects (AW$ table and related indexes) during parallel data loading jobs.  By default each AW is created using a range partition key of gen# and 8 subpartitions.  The DDL below is from a default AW created via AWM.  Note the clauses to manage the partition and sub-partitions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PARTITION BY RANGE ("GEN#") &lt;/li&gt;&lt;li&gt;SUBPARTITION BY HASH ("PS#","EXTNUM") &lt;/li&gt;&lt;li&gt;SUBPARTITIONS 8&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;  CREATE TABLE "BI_OLAP"."AW$SH_AW" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ("PS#" NUMBER(10,0), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    "GEN#" NUMBER(10,0), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    "EXTNUM" NUMBER(8,0), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    "AWLOB" BLOB, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    "OBJNAME" VARCHAR2(256 BYTE), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    "PARTNAME" VARCHAR2(256 BYTE)) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PCTFREE 10 PCTUSED 40 INITRANS 4 MAXTRANS 255 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  STORAGE(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  BUFFER_POOL DEFAULT)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  DISABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  CACHE &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  STORAGE(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  BUFFER_POOL DEFAULT)) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  PARTITION BY RANGE ("GEN#") &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION BY HASH ("PS#","EXTNUM") &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITIONS 8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; (PARTITION "PTN1"  VALUES LESS THAN (1) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PCTFREE 10 PCTUSED 40 INITRANS 4 MAXTRANS 255 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  STORAGE(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  BUFFER_POOL DEFAULT)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  DISABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  CACHE READS LOGGING &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  STORAGE(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  BUFFER_POOL DEFAULT)) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; ( SUBPARTITION "SYS_SUBP16109" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16110" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16111" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16112" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16113" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16114" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16115" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16116" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP") , &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; PARTITION "PTNN"  VALUES LESS THAN (MAXVALUE) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PCTFREE 10 PCTUSED 40 INITRANS 4 MAXTRANS 255 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  STORAGE(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  BUFFER_POOL DEFAULT)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  DISABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  CACHE &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  STORAGE(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  BUFFER_POOL DEFAULT)) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; ( SUBPARTITION "SYS_SUBP16117" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16118" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16119" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16120" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16121" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16122" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16123" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP", &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  SUBPARTITION "SYS_SUBP16124" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; LOB ("AWLOB") STORE AS (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  TABLESPACE "BI_OLAP" ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   TABLESPACE "BI_OLAP") ) ;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The best overall approach here is to ensure you have the correct number of sub-partitions to reduce contention during updates.  For example, if you have a cube with three years of data partitioned using the level month, it would be sensible to add and additional 36 subpartitions to the AW$ table to spread the load and reduce contention during parallel updates. You can add more sub-partitions quickly and easily as follows.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;alter table aw$test modify partition ptnn add subpartition ptnn_009 update indexes;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;alter table aw$test modify partition ptnn add subpartition ptnn_010 update indexes;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Therefore, I recommend adding additional subpartitions at the physical level to match the number of logical partitions within the cube.&lt;br /&gt;&lt;br /&gt;It is possible to go to the next level (if you really feel it is necessary) and directly manage the DDL used to create the AW and there are a number of commands that allow you to control the default tablespace and the number of partitions.  You can increase the number of sub-partitions within each gen# partition using either the ‘aw create command’ as shown here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('aw create &lt;span style="font-style: italic;"&gt;owner&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;owner&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;.aw_name&lt;/span&gt;&lt;/span&gt;&lt;aw&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; partitions &lt;span style="font-style: italic;"&gt;N&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;n&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;segmentsize &lt;/span&gt;&lt;/span&gt;&lt;/n&gt;&lt;/aw&gt;&lt;/owner&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-style: italic;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; K|M|G');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Note the key word “partitions” actually refers to the number of subpartitions.&lt;br /&gt;It is in fact possible to define a target tablespace for the AW via the DBMS_AW.ATTACH procedure:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    DBMS_AW.AW_ATTACH ( &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        awname IN VARCHAR2,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        forwrite IN BOOLEAN DEFAULT FALSE,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        createaw IN BOOLEAN DEFAULT FALSE,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        attargs IN VARCHAR2 DEFAULT NULL,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        tablespace IN VARCHAR2 DEFAULT NULL);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;For example, the following SQL statement creates the AW GLOBAL_PROGRAMS as the last user-owned analytic workspace in tablespace USERS:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;SQL&gt;EXECUTE DBMS_AW.AW_ATTACH('global_programs', true, true, 'last', ‘USERS’);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;AWM 10gR2 (10.2.0.03A) also allows you to define the tablespace when you create the AW, but the tablespace name is not included in the XML definition of the AW.&lt;br /&gt;If you think you need to get right down to the base DDL level to control the allocation of tablespaces used by the AW then you will need to manually define the AW$ table.  The easiest method is to create another AW$ table using the DDL from the original AW$ table and modifying it to create your own placement statements for the tablespaces.  To get the DDL for an AW (table and index) you can either use SQLDeveloper or use the DBMS_METDATA package as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;        set heading off;&lt;br /&gt;set echo off;&lt;br /&gt;set pages 999;&lt;br /&gt;set long 90000;&lt;br /&gt;spool aw_ddl.sql&lt;br /&gt;select dbms_metadata.get_ddl('TABLE','AW$SH_AW','SH_OLAP') from dual;&lt;br /&gt;select dbms_metadata.get_ddl('INDEX','SH_AW_I$','SH_OLAP') from dual;&lt;br /&gt;spool off;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;These statements show the exact DDL used to generate the AW$ table and its associated index.  Once you have the DDL you can then modify the tablespace statements for each sub-partition to spread the loading across different tablespaces and hence data files.  But it is much easier to use ASM to manage all this for you.&lt;br /&gt;&lt;br /&gt;There is one major issue with manually creating an AW – the standard form metadata is not automatically added to the AW and there is no documented process for achieving this.  The only reliable solution I have found is to first create the AW via AWM and then export the empty AW to an EIF file.  This EIF file will then contain the standard form metadata objects.  Once you have deleted and re-created the AW with the based on your specific tablespace and subpartition requirements the standard form metadata can be added by importing the EIF file.  Not the prettiest of solutions but it works – at least with 10gR2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 4 - Analysis of Aggregation Model&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Summarize To Tab&lt;/span&gt;&lt;br /&gt;This is where the biggest improvements to build time are likely to be uncovered.  The “Summarize To” tab allows you to select the levels to pre-solve.  Based on the analysis of the number of members and children at each level it should be possible to tune the levels to pre-solve only the most important levels.&lt;br /&gt;&lt;br /&gt;This step will require lots of testing and many builds to finally arrive at the best mix of levels.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2lHTzJ24I/AAAAAAAAAXE/jAPi_kQ89ic/s1600-h/Image13.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2lHTzJ24I/AAAAAAAAAXE/jAPi_kQ89ic/s400/Image13.JPG" alt="" id="BLOGGER_PHOTO_ID_5191987490420546434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Rules Tab&lt;/span&gt;&lt;br /&gt;If you are using the same aggregation method across all dimensions, such as SUM, the aggregation engine will optimise the processing order for the dimensions by solving them in the reverse order from highest cardinality to lowest cardinality.  Despite this I always manually order the dimensions myself anyway on the Rules Tab.&lt;br /&gt;&lt;br /&gt;Where you are using different aggregation methods across the various dimensions it is important to ensure the dimensions are in the correct order to return the desired result.  If you change the order to improve aggregation performance where different aggregation methods are used, check the results returned are still correct.  Getting the wrong answer very quickly is not a good result.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2lpTzJ25I/AAAAAAAAAXM/dkEVH-GtMC4/s1600-h/Image14.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2lpTzJ25I/AAAAAAAAAXM/dkEVH-GtMC4/s400/Image14.JPG" alt="" id="BLOGGER_PHOTO_ID_5191988074536098706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 5 - Analysis of Data Quality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This is another area that can have a huge impact of load times.  There are three key things to consider:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Number of NA cells&lt;/li&gt;&lt;li&gt;Number of Zero cells&lt;/li&gt;&lt;li&gt;Sparsity patterns&lt;/li&gt;&lt;/ul&gt;Quite often I see situations where hundreds of thousands of either NA or zero values are loaded into a cube and then aggregated.  In a recent customer situation, over 40% of the data being loaded was either NA or zero.  Removing just those records from the data load saved a huge amount of time both in loading and aggregating that data set.  Now in some cases it may in fact be necessary to load a zero balance because the value “0” does actually mean something and having a cell appear as NULL in a report does not infer the same meaning.  If this is the case, there are much better ways of managing zero balances than loading and aggregating those balances up across all the various hierarchies to return a value of 0.  My recommendation is to remove all zero and NA/null rows from the source fact table.&lt;br /&gt;&lt;br /&gt;Where there is a need to show a zero balance, create a separate cube load only the zero balances into that cube but do not aggregate the data.  Use a formula to glue the non-zero balance data to the zero balance data, such as:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Nafill(CUBE1_NON_NA_DATA, CUBE2_ZERO_BALANCE_DATA)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will significantly improve the performance of the main cube since the aggregation engine only has to deal with real balances.&lt;br /&gt;&lt;br /&gt;Sparsity patterns are important when you have a cube that contains a large number of measures all sourced from the same fact table.  In another situation, a customer had designed two cubes with about 30 measures in one cube and two measures in the other cube.  The source fact table contained 75 million rows.  The data load was taking about ten hours for just three years of data.  Looking at the data and executing various SQL counts to determine the number of NULL cells and Zero cells for each measure, it was clear there were five different sparsity patterns within the fact table.&lt;br /&gt;&lt;br /&gt;By breaking the single cube into five different cubes, creating views over the base fact table to only return the relevant columns for each cube and removing all NA and zero values the amount of data being loaded each month declined to the values shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2mTDzJ26I/AAAAAAAAAXU/2ql9wJeMMZM/s1600-h/Image15.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2mTDzJ26I/AAAAAAAAAXU/2ql9wJeMMZM/s400/Image15.JPG" alt="" id="BLOGGER_PHOTO_ID_5191988791795637154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This change combined with changes to the selection of levels pre-aggregated reduced the build and aggregation time by over 50% with little impact on query performance.&lt;br /&gt;&lt;br /&gt;It is critical to fully understand the source data and how it is stored.  As the number of measures within a cube increases it is likely that the number of times an NA or Zero value appears will also increase. Breaking a large cube up into smaller more focused chunks in this type of scenario can provide significant benefits.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Part 4 - Analysis of Source Schema Queries&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;When loading data into a cube from a relational source schema you should be able to achieve about 1 million rows updated in the cube per minute.  If you are not seeing that level of throughput from the source table/view, you need to look at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hardware issues&lt;/li&gt;&lt;li&gt;Cube design issues&lt;/li&gt;&lt;li&gt;Query design issues&lt;/li&gt;&lt;/ul&gt;The first two issues have already been covered.  This area aims to review the tuning of the query fetching the data from the relational source table/view into the cube.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2miDzJ27I/AAAAAAAAAXc/IsFgTYtFh8A/s1600-h/Slides+for+Keith.005.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2miDzJ27I/AAAAAAAAAXc/IsFgTYtFh8A/s400/Slides+for+Keith.005.png" alt="" id="BLOGGER_PHOTO_ID_5191989049493674930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tuning the queries used to load dimension members and data into cubes can be very important.  When either a data load or dimension load is executed a program is created containing the SQL to fetch the data from the relational table. It is important to make sure the SQL being executed is as efficient as possible.  By using views as the source for your mappings it is relatively easy to add additional hints to ensure the correct execution path is used.  Note - with 11g this can cause problems if the cube is to be exposed as a materialised view.  For query re-writes to function the cube must use the underlying fact table that is part of the end-user query.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Analysing SQL Statements&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;To optimise the SQL executed during a load you have use either, or both, of the approaches:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enterprise Manager – via Tuning Packs&lt;/li&gt;&lt;li&gt;Manual analysis&lt;/li&gt;&lt;/ul&gt;If you are comfortable using PL/SQL and understand a little about OLAP DML you can follow the manual approach.  However, I expect most people will revert to using Enterprise Manage as it makes the whole process so simple.  However, note the Tuning Pack is a costed option for EM so check your license agreement before you start using the Enterprise Manager approach.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Enterprise Manager&lt;/span&gt;&lt;br /&gt;Enterprise Manager can be used to monitor the results from a SQL statement.  The Performance Tab provides the environment for tuning SQL statements as well as monitoring the operation of the whole instance.  The easiest way to find the SQL statement used by the data load process is to search for a SELECT statement against the view/table used in the mapping.  The SQL can quite often be found in the “Duplicate SQL” report at the bottom of the Top Activity page:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/SA2m_zzJ28I/AAAAAAAAAXk/27d7OqjYuQI/s1600-h/Image9b.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/SA2m_zzJ28I/AAAAAAAAAXk/27d7OqjYuQI/s400/Image9b.PNG" alt="" id="BLOGGER_PHOTO_ID_5191989560594783170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once you have found the SQL statement, clicking on the SQL statement listed in the table will present a complete analysis of that statement and allow you to schedule the SQL Tuning Advisor.  The output from the Advisor includes recommendations for improving the efficiency of that statement.  Below is the analysis of the resources used to execute the product dimension SQL statement:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2nMDzJ29I/AAAAAAAAAXs/rTXH2aFyANc/s1600-h/Image9a.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2nMDzJ29I/AAAAAAAAAXs/rTXH2aFyANc/s400/Image9a.PNG" alt="" id="BLOGGER_PHOTO_ID_5191989771048180690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Scheduling the Advisor&lt;/span&gt;&lt;br /&gt;Scheduling the advisor to analyse your SQL statement is very simple.  Click on the button in the top right corner of the SQL Details screen.  This will launch the SQL Advisor where you need to provide:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A description for the job&lt;/li&gt;&lt;li&gt;Set the scope to either limited or comprehensive (there are on screen notes to help you make this decision)&lt;/li&gt;&lt;li&gt;Time and date to run the Advisor, since it might not be possible to run the advisor immediately.&lt;/li&gt;&lt;/ul&gt;Once the Advisor has completed its review, it is possible to look at the recommendations that have been generated.  After you have implemented the recommendations it is then possible to view the explain plan for your query:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2ndDzJ2-I/AAAAAAAAAX0/RaBwKzjN9zY/s1600-h/Image9d.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/SA2ndDzJ2-I/AAAAAAAAAX0/RaBwKzjN9zY/s400/Image9d.PNG" alt="" id="BLOGGER_PHOTO_ID_5191990063105956834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Note: These features are costed extensions to the Enterprise Manager console and cannot be used on a production system unless your customer has bought these extensions.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Manual Tuning&lt;/span&gt;&lt;br /&gt;So how do you capture the SQL being executed during a data load?  In 10g, during a load process an OLAP DML program is created called  '___XML_LOAD_TEMPPRG'.&lt;br /&gt;This program contains the code used during the build process and it is relatively easy to capture this code either via Enterprise Manager or manually at the end of the build.&lt;br /&gt;(For a data load in 11g, look at the CUBE_BUILD_LOG’s “output” column.  The table is in the AW’s schema).&lt;br /&gt;&lt;br /&gt;To manually capture the program code (in 10g), create your own job to manually execute a data load.  For example below is a job to refresh the members in the dimension Products.  Note the first three lines and last four lines that control the dumping of the program code so we can capture the SQL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;set serveroutput on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('aw attach SH_AW rw first');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('cda BI_DIR');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;call SQL file to refresh cube&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('outfile loader.txt');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('DSC ___XML_LOAD_TEMPPRG')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('outfile eof');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('aw detach SH_AW');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The resulting program looks like this, with the SQL code highlighted in bold:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DEFINE ___XML_LOAD_TEMPPRG PROGRAM INTEGER&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PROGRAM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;variable _errortext text&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;trap on HADERROR noprint&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql declare c1 cursor for -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select SH.VW_PRODUCTS_DIM.PROD_ID, -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SH.VW_PRODUCTS_DIM.PROD_DESC, -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SH.VW_PRODUCTS_DIM.PROD_DESC, -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SH.VW_PRODUCTS_DIM.PROD_PACK_SIZE, -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SH.VW_PRODUCTS_DIM.PROD_WEIGHT_CLASS, -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SH.VW_PRODUCTS_DIM.PROD_UNIT_OF_MEASURE, -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SH.VW_PRODUCTS_DIM.SUPPLIER_ID -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from SH.VW_PRODUCTS_DIM -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;where -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(SH.VW_PRODUCTS_DIM.PROD_ID IS NOT NULL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql open c1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if sqlcode ne 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;then do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       _errortext =  SQLERRM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       goto HADERROR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     doend&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql import c1 into :MATCHSKIPERR SH_OLAP.SH_AW!PRODUCTS_PRODUCT_SURR -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:SH_OLAP.SH_AW!PRODUCTS_LONG_DESCRIPTION(SH_OLAP.SH_AW!ALL_LANGUAGES 'AMERICAN') -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:SH_OLAP.SH_AW!PRODUCTS_SHORT_DESCRIPTION(SH_OLAP.SH_AW!ALL_LANGUAGES 'AMERICAN') -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:SH_OLAP.SH_AW!PRODUCTS_PACK_SIZE -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:SH_OLAP.SH_AW!PRODUCTS_WEIGHT_CLASS -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:SH_OLAP.SH_AW!PRODUCTS_UNIT_OF_MEASURE -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:SH_OLAP.SH_AW!PRODUCTS_SUPPLIER_ID&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if sqlcode lt 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;then do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       _errortext =  SQLERRM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       goto HADERROR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     doend&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql close c1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql cleanup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;return 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;HADERROR:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;trap on NOERR1 noprint&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql close c1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;NOERR1:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;trap off&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sql cleanup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;call __xml_handle_error(_errortext)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Once you have the statement you can use SQLDeveloper’s explain plan feature to determine the execution plan.  When dealing with cubes, it is likely the source fact table will be partitioned; therefore, you need to ensure partition elimination is occurring correctly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2odTzJ2_I/AAAAAAAAAX8/US5Gas_rVNs/s1600-h/Image10.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2odTzJ2_I/AAAAAAAAAX8/US5Gas_rVNs/s400/Image10.PNG" alt="" id="BLOGGER_PHOTO_ID_5191991166912551922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If additional hints need to be added to make the query more efficient, these can be added to the view definition.  This approach does not automatically generate recommendations so you will need to have a solid grasp of SQL tuning to ensure your query is based on the most optimal execution plan.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 2 – Managing Sort Resources&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Sorting the source data is quite important for both dimensions and facts.  By default, OLAP sorts dimensions alphabetically in ascending order based on the long description.  Therefore, it makes sense for the relational source to provide the data in the required order, especially for the dimension loads.&lt;br /&gt;&lt;br /&gt;Optimising cube loads requires making sure the sorting is based on the same order as the dimensions are listed within the partitioned composites.  This will be the same order as shown on the implementation details tab.&lt;br /&gt;&lt;br /&gt;OLAP load operations are sort intensive.  You may need to increase the sort_area_size setting within the database to try and ensure the various sorting operations during a load are performed in memory and not disk.  The default setting is 262,144.  As part of a load process you can increase the amount of sort memory available as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('SortBufferSize=10485760');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Executing this command before starting a data load will increase the amount of resources allocated to memory sorts, in this case providing approximately 10Mb of memory.   To permanently set the SortBufferSize to 10Mb, issue the following commands:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;exec DBMS_AW.EXECUTE('aw attach my_aw_name rwx');&lt;br /&gt;exec DBMS_AW.EXECUTE('SortBufferSize=10485760');&lt;br /&gt;exec DBMS_AW.EXECUTE('update');&lt;br /&gt;exec DBMS_AW.EXECUTE('commit');&lt;br /&gt;exec DBMS_AW.EXECUTE('aw detach my_aw_name');&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Or you can simply set the option before executing the XML job definition:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;set serveroutput on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.shutdown;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.startup;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('aw attach SH_AW rw first');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('SortBufferSize=10485760');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:85%;"  &gt;call SQL file to refresh cube&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('SortBufferSize=262144');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('update;commit');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.execute('aw detach SH_AW');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_aw.shutdown;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec dbms_session.free_unused_user_memory;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;For more information on this subject area refer to the next session on monitoring system resources.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Part 5 - Analyis of the Database&lt;/span&gt;&lt;br /&gt;There are a number of areas that are important when tuning a data load process and the areas outlined in this section are really just going to tweak the performance and may or may need result in significant performance improvements.  But this area can provide the “icing on the cake” in terms of extracting every last ounce of performance.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/SA2o7jzJ3AI/AAAAAAAAAYE/VgRNPhrz0WM/s1600-h/Slides+for+Keith.006.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/SA2o7jzJ3AI/AAAAAAAAAYE/VgRNPhrz0WM/s400/Slides+for+Keith.006.png" alt="" id="BLOGGER_PHOTO_ID_5191991686603594754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 1a – Relational Storage Settings&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Make sure logging is switched off on the tablespace used to store the AW.  Since the AW does not support redo there is not point in generating it.  Make sure you have enough space within the tablespace before you start a build.  A lot of time can be consumed extending the tablespace if you are not careful.&lt;br /&gt;&lt;br /&gt;If you are using Data Guard, it will not be possible to switch of redo.  The alternative is to increase REDO Log Size to between 100M and 500M, and also modify LOG_BUFFER parameter to 10M (for example) to allow for more efficient index lob creation, and also try to move TEMP, UNDO and REDO logs to fastest disk.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 1b –AW Storage Settings&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If the cubes within an AW contain a large number of partitions, then performance can be improved by adding additional physical partitions to AWs. The AW should be logically partitioned and modelled well and then should also be physically partitioned as it improves update performance by reducing index lob contention. For example, if the main data cube contains 36 months of data and is logically partitioned by month in the AW, then the physical partitioning of the AW should match the number of logical partitions.  To override the default of eight partitions it is necessary to manually define the AW and set the required number of partitions as show here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; exec dbms_aw.execute('aw create scott.product_AW partitions 36');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, this approach does create some additional complications regarding the creation of standard form metadata.  This metadata is required to make the AW visible to AWM and other OLAP aware tools.  In the vast majority of cases it will be necessary to create a standard form metadata compliant AW.  See the Part 3 Analyis of Cube Model, Step 3 – Partitioning for more information.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - Temp Storage Settings&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Pre-allocating space within the temp tablespace prior to running a build can make some performance improvements.  When pre-allocating space make sure the temp tablespace is not set to auto-extend and the correct (most efficient) uniform extend size is used. The procedure below will pre-allocate TEMP Tablespace. Alter the for i in 1..1000000 are required. This example will pre-allocate approximately 1.5GB of TEMP tablespace. Make sure your default temporary tablespace/group is not set to auto-extend unlimited. It should be fixed to the required size.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;create or replace procedure preallocate_temp as&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;amount integer := 26;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;buffer varchar2(26) := 'XXXXXXXXXXXXXXXXXXXXXXXXXX';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;done boolean := false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;out_of_temp exception;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;position integer := 10240;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;pragma exception_init(out_of_temp,-01652);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tmppre clob;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.createtemporary(tmppre, true,d bms_lob.session);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.open(tmppre, dbms_lob.lob_readwrite);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;for i in 1..130400&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;loop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (done = true) then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.close(tmppre);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.freetemporary(tmppre);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end if;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.write(tmppre, amount, position, buffer);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exception when out_of_temp then done := true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;position := position + amount + 10240;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end loop;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.close(tmppre);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dbms_lob.freetemporary(tmppre);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;conn prealltemp/oracle&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec preallocate_temp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;disc;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - ADDM Report&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;ADDM (Automatic Database Diagnostic Monitor) is a self-diagnostic engine built into the Oracle Database kernel, which automatically detects and diagnoses common performance problems, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hardware issues related to excessive I/O&lt;/li&gt;&lt;li&gt;CPU bottlenecks&lt;/li&gt;&lt;li&gt;Connection management issues&lt;/li&gt;&lt;li&gt;Excessive parsing&lt;/li&gt;&lt;li&gt;Concurrency issues, such as contention for locks&lt;/li&gt;&lt;li&gt;PGA, buffer-cache, and log-buffer-sizing issues&lt;/li&gt;&lt;li&gt;Issues specific to Oracle Real Application Clusters (RAC) deployments, such as global cache hot blocks and objects and interconnect latency issues&lt;/li&gt;&lt;/ul&gt;An ADDM analysis is performed after each AWR snapshot (every hour by default).  The results are saved in the database, which can then be viewed using either Oracle&lt;br /&gt;Enterprise Manager or SQLPlus. For tuning OLAP data loads, ADDM is always a good place to start.  In addition to diagnosing performance problems, ADDM recommends possible solutions. When appropriate, ADDM recommends multiple solutions, which can include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hardware changes&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Adding CPUs or changing the I/O subsystem configuration&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Database configuration&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Changing initialization parameter settings&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Schema changes&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Hash partitioning a table or index, or using automatic segment-space management (ASSM)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Application changes&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Using the cache option for sequences or using bind variables&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Using other advisors&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Running the SQL Tuning Advisor on high-load SQL statements or running the Segment Advisor on hot objects&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;ADDM benefits apply beyond production systems; even on development and test&lt;br /&gt;Systems.  ADDM can provide an early warning of potential performance problems.  Typically the results from an ADDM snapshot are viewed via various interactive pages within Enterprise Manager, as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2pVTzJ3BI/AAAAAAAAAYM/7PgBGZVoPr4/s1600-h/Image7.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/SA2pVTzJ3BI/AAAAAAAAAYM/7PgBGZVoPr4/s400/Image7.PNG" alt="" id="BLOGGER_PHOTO_ID_5191992128985226258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alternatively you can access ADDM reports using the SQL*Plus command line by calling the new DBMS_ADVISOR built-in package. For example, here's how to use the command line to create an ADDM report quickly (based on the most recent snapshot):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;set long 1000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set pagesize 50000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;column get_clob format a80&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select dbms_advisor.get_task_report(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;task_name, 'TEXT', 'ALL') &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;as ADDM_report&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from dba_advisor_tasks&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; where task_id=(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; select max(t.task_id)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; from dba_advisor_tasks t, dba_advisor_log l&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   where t.task_id = l.task_id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   and t.advisor_name='ADDM'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   and l.status= 'COMPLETED');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The ‘ALL’ parameter generates additional information about the meaning of some of the elements in the report.  The most interesting section of the report relates to the "Findings" for each issue.  This outlines the impact of the identified problem as a percentage of DB time, which correlates with the expected benefit, based on the assumption the problem described by the finding will be solved if the recommended action is taken.&lt;br /&gt;&lt;br /&gt;In the example below the recommendation is to adjust the sga_target value in the parameter file:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;FINDING 3: 5.2% impact (147 seconds)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;---------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;The buffer cache was undersized causing significant additional read I/O.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;RECOMMENDATION 1: DB Configuration, 5.2% benefit (147 seconds)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ACTION: Increase SGA target size by increasing the value of parameter "sga_target" by 24 M.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SYMPTOMS THAT LED TO THE FINDING:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Wait class "User I/O" was consuming significant database time. (5.3% impact [150 seconds])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To get more information this feature refer to the Oracle® Database 2 Day + Performance Tuning Guide 10g Release 2 (10.2).&lt;br /&gt;&lt;br /&gt;For the HTML version, click &lt;a href="http://www.oracle.com/pls/db102/to_toc?pathname=server.102%2Fb14211%2Ftoc.htm&amp;amp;remark=portal+%28Getting+Started%29"&gt;here&lt;/a&gt; for 10gR2 and &lt;a href="http://www.oracle.com/pls/db111/to_toc?pathname=server.111/b28274/toc.htm"&gt;here &lt;/a&gt;for 11g.&lt;br /&gt;For the PDF version, click &lt;a href="http://www.oracle.com/pls/db102/to_pdf?pathname=server.102%2Fb14211.pdf&amp;amp;remark=portal+%28Getting+Started%29"&gt;here&lt;/a&gt; for 10gR2 and &lt;a href="http://www.oracle.com/pls/db111/to_pdf?pathname=server.111/b28274.pdf"&gt;here &lt;/a&gt;for 11g&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 4 - Dynamic Performance Views&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Each Oracle database instance maintains a set of virtual tables that record current database activity and store data about the instance. These tables are called the V$ tables. They are also referred to as the dynamic performance tables, because they store information relating to the operation of the instance. Views of the V$ tables are sometimes called fixed views because they cannot be altered or removed by the database administrator.  The V$ tables collect data on internal disk structures and memory structures. They are continuously updated while the database is in use.   The SYS user owns the V$ tables. In addition, any user with the SELECT CATALOG role can access the tables. The system creates views from these tables and creates public synonyms for the views. The views are also owned by SYS, but the DBA can grant access to them to a wider range of users.&lt;br /&gt;&lt;br /&gt;Among these are tables that collect data on OLAP operations. The names of the OLAP V$ views begin with V$AW:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;V$AW_AGGREGATE_OP&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Lists the aggregation operators available in the OLAP DML.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;V$AW_ALLOCATE_OP&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Lists the allocation operators available in the OLAP DML.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;V$AW_CALC&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Collects information about the use of cache space and the status of dynamic aggregation.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;V$AW_LONGOPS&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Collects status information about SQL fetches.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;V$AW_OLAP&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Collects information about the status of active analytic workspaces.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;V$AW_SESSION_INFO&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Collects information about each active session.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;For tuning the two most important views from this list are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;V$AW_CALC&lt;/span&gt;&lt;br /&gt;This reports on the effectiveness of various caches used by Oracle OLAP and the status of processing by the AGGREGATE function.   Oracle OLAP uses the following caches:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Aggregate cache: An internal cache used by the aggregation subsystem during querying. It stores the children of a given dimension member, such as Q1-04, Q2-04, Q3-04, and Q4-04 as the children of 2004.&lt;/li&gt;&lt;li&gt;Session cache: Oracle OLAP maintains a cache for each session for storing the results of calculations. When the session ends, the contents of the cache are discarded.&lt;/li&gt;&lt;li&gt;Page pool: A cache allocated from the User Global Area (UGA), which Oracle OLAP maintains for the session. The page pool is associated with a particular session and caches records from all the analytic workspaces attached in that session. If the page pool becomes too full, then Oracle OLAP writes some of the pages to the database cache. When an UPDATE command is issued in the OLAP DML, the changed pages associated with that analytic workspace are written to the permanent LOB, using temporary segments as the staging area for streaming the data to disk. The size of the page pool is controlled by the OLAP_PAGE_POOL initialization parameter.&lt;/li&gt;&lt;li&gt;Database cache: The larger cache maintained by the Oracle RDBMS for the database instance.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Because OLAP queries tend to be iterative, the same data is typically queried repeatedly during a session. The caches provide much faster access to data that has already been calculated during a session than would be possible if the data had to be recalculated for each query.&lt;br /&gt;&lt;br /&gt;The more effective the caches are, the better the response time experienced by users. An ineffective cache (that is, one with few hits and many misses) probably indicates that the data is not being stored optimally for the way it is being viewed. To improve runtime performance, you may need to reorder the dimensions of the variables (that is, change the order of fastest to slowest varying dimensions).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;V$AW_LONGOPS&lt;br /&gt;This view will identify the OLAP DML command (SQL IMPORT, SQL FETCH, or SQL EXECUTE) that is actively fetching data from relational tables.  The view will state the current operation based on one of the following values:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;EXECUTING. The command has begun executing.&lt;/li&gt;&lt;li&gt;FETCHING. Data is being fetched into the analytic workspace.&lt;/li&gt;&lt;li&gt;FINISHED. The command has finished executing. This status appears very briefly before the record disappears from the table.&lt;/li&gt;&lt;/ul&gt;Other information returned includes: the number of rows already inserted, updated, or deleted and the time the command started executing.&lt;br /&gt;For more information refer to the Oracle OLAP Option Users Guide, Section 7 Administering Oracle OLAP – &lt;a href="http://download.oracle.com/docs/cd/B28359_01/olap.111/b28124/admin.htm#sthref479"&gt;Dynamic Performance Views&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Step 5 - Init.Ora Parameters&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Checking the RDBMS parameters are appropriately tuned for your OLAP environment is relatively easy. Fortunately in 10g the majority of init.ora parameters are managed dynamically, however a few parameters that may need to be changed are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;SORTBUFFERSIZE&lt;/span&gt;&lt;br /&gt;This should be increased since OLAP AWs use this parameter instead of SORT_AREA_SIZE. So, for every AW, to increase it do the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('aw attach SCOTT.MYAW rwx');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('shw sortbuffersize');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;262,411&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('SortBufferSize=10485760');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('shw sortbuffersize');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;10,485,760&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exec DBMS_AW.EXECUTE('aw detach SCOTT.MYAW');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;OLAP_PAGE_POOL_SIZE&lt;/span&gt;&lt;br /&gt;This should be set to 0 or unset so that auto dynamic page pool is on and is managed by the database (will be set to 50% of PGA size). However, if you have over 8Gb of memory available then you should set the parameter manually and a good value for data loading is to set to 256MB and for multiple users querying concurrently, 64MB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-4656394751729616749?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/4656394751729616749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=4656394751729616749' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4656394751729616749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4656394751729616749'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/04/tuning-guidance-for-olap-10g.html' title='Tuning Guidance for OLAP 10g'/><author><name>Keith Laker</name><uri>http://www.blogger.com/profile/01039869313455611230</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_MQqVcvGe0t8/R4TgI_SdrcI/AAAAAAAAAJM/vbkN081--7Q/S220/Me2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MQqVcvGe0t8/SAxy8LuJKXI/AAAAAAAAAVc/mf2jqgqK6iU/s72-c/Slides+for+Keith.001.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-680722843118407795</id><published>2008-04-10T07:27:00.000-07:00</published><updated>2008-12-11T15:25:24.976-08:00</updated><title type='text'>Attribute Reporting on the Cube using SQL</title><content type='html'>&lt;span style="font-family:arial;"&gt;In my last post, I noted that nearly reporting on the 11g cube occurs within &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SQL&lt;/span&gt;-based relational reporting tools such as Oracle Business Intelligence Enterprise Edition (OBI &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;EE&lt;/span&gt;), Business Objects, etc. That's no surprise given that these tools dominate the BI market and that the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;OLAP&lt;/span&gt; Option is positioned as making &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SQL&lt;/span&gt;-based BI tools better with improved query performance and analytic content. While the focus is how &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;OLAP&lt;/span&gt; cubes make &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SQL&lt;/span&gt;-based BI application better, it shouldn't be overlooked that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SQL&lt;/span&gt;-based tools can make the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;OLAP&lt;/span&gt; Option better.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;A perfect example is attribute reporting. The cube has never naturally supported attribute reporting. For example, if a cube is dimensioned by time, product and customer and product has attributes such as buyer and marketing manager it has never been easy to report sales by time, buyer, marketing manager and customer with just the cube.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;One of the reasons for integrating the cube into the Oracle Database is that it blends the dimension storage and calculation models with the relational query model (that is, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SQL&lt;/span&gt;). Dimensional calculations can be defined in the cube and relational calculations can be added above the cube in a query.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Getting back to our example, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;SQL&lt;/span&gt; view of the product dimension (with the buyer and marketing manager attributes) will look something like this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;desc&lt;/span&gt; product_classes_view;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;DIM_KEY &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;LEVEL_NAME &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;VARCHAR&lt;/span&gt;2(30)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;LONG_DESCRIPTION &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;SHORT_DESCRIPTION &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;TOTAL_PRODUCT_LONG_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;DESCR&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;TOTAL_PRODUCT_LONG_DES_1 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;TOTAL_PRODUCT_DAVE &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;CLASS_LONG_DESCRIPTION &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;CLASS_LONG_DESCRIPTION1 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;FAMILY_LONG_DESCRIPTION &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;FAMILY_LONG_DESCRIPTION1 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;strong&gt;ITEM_BUYER &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;strong&gt;ITEM_MARKETING_MANAGER &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;ITEM_PACKAGE &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;ITEM_LONG_DESCRIPTION &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;ITEM_LONG_DESCRIPTION1 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;PARENT &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;TOTAL_PRODUCT &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;CLASS &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;FAMILY &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;VARCHAR&lt;/span&gt;2(100)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;ITEM &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;VARCHAR&lt;/span&gt;2(100)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;A sampling of the data follows.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT dim_key,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;item_long_description,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;item_buyer,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;item_marketing_manager&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;product_classes_view&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;level_name = 'ITEM';&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4lLZb-5CI/AAAAAAAAABU/_g8xIFBjJ9c/s1600-h/product_table.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187624698514433058" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4lLZb-5CI/AAAAAAAAABU/_g8xIFBjJ9c/s400/product_table.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If I want to break out sales by report sales by time, buyer, marketing manager and customer I query those columns and use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;SQL&lt;/span&gt; group by. E.g.,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;t.calendar_year_long_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;descr&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.item_buyer,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.item_marketing_manager,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SUM(f.sales)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;time_calendar_view t,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;product_classes_view p,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;customer_shipments_view cu,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;channel_channels_view ch,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;units_cube_view f&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;t.dim_key = f.time&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND p.dim_key = f.product&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND cu.dim_key = f.customer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND ch.dim_key = f.channel&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND t.level_name = 'CALENDAR_YEAR'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND p.level_name = 'ITEM'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND cu.level_name = 'TOTAL_CUSTOMER'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AND ch.level_name = 'TOTAL_CHANNEL'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;GROUP BY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;t.calendar_year_long_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;descr&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.item_buyer,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.item_marketing_manager,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cu.total_customer_long_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;desc&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ch.total_channel_long_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;descr&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORDER BY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;calendar_year_long_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;descr&lt;/span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_4mLpb-5EI/AAAAAAAAABk/BmcBU7gJ9QA/s1600-h/table.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187625802321028162" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_4mLpb-5EI/AAAAAAAAABk/BmcBU7gJ9QA/s400/table.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are two things you want to keep in mind when doing any aggregation above the cube in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;SQL&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make sure the aggregation method used in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;SQL&lt;/span&gt; is compatible with the aggregation method used in the cube. For example, if the cube aggregates using SUM, then using SUM in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;SQL&lt;/span&gt; makes sense. If the cube aggregates using a hierarchical weighted average, it probably doesn't make sense to SUM in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;SQL&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Make sure it is appropriate to aggregate the measure in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;SQL&lt;/span&gt;. For example, it makes sense to aggregate measures such as sales, sales prior period, etc. using SUM in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;SQL&lt;/span&gt;. It probably doesn't make sense to aggregate measures that are percentages or rankings. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In products like OBI &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;EE&lt;/span&gt; I like to set up the presentation layer to make it clear which columns are levels and which are attributes. This helps highlight the fact that they are different. I also like to group different types of measures into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;seperate&lt;/span&gt; presentation tables. While this is convenient in general, this also highlights differences between types of measures. For example, a report designer can easily be told not to include ranking measures in a report that includes attribute columns.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In the illustration below, note the presentation tables group columns in to level, attributes and measure types.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4pnZb-5HI/AAAAAAAAAB8/a5-S-6hsm5E/s1600-h/answers_columns.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187629577597281394" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4pnZb-5HI/AAAAAAAAAB8/a5-S-6hsm5E/s400/answers_columns.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In products like OBI &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;EE&lt;/span&gt;, I can now effortlessly make reports broken out by attribute that include many types of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;OLAP&lt;/span&gt; calculations. &lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4nJZb-5GI/AAAAAAAAAB0/x2MOyvRfveY/s1600-h/obi_ee_report.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187626863177950306" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4nJZb-5GI/AAAAAAAAAB0/x2MOyvRfveY/s400/obi_ee_report.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-680722843118407795?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/680722843118407795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=680722843118407795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/680722843118407795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/680722843118407795'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/04/attribute-reporting-on-cube-using-sql.html' title='Attribute Reporting on the Cube using SQL'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_4lLZb-5CI/AAAAAAAAABU/_g8xIFBjJ9c/s72-c/product_table.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-4828326095217015525</id><published>2008-04-09T09:29:00.000-07:00</published><updated>2008-12-11T15:25:26.394-08:00</updated><title type='text'>More on the Calculated Measure Cube</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;"&gt;In Keith's post, he describes how to create a calculated measure cube in Oracle 10g. In this post, I will describe how to create a calculated measure cube in Oracle 11g.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;The basic technique is the same as Keith describes:&lt;/span&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a dimension representing calculations.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Create a cube that will contain the stored measures.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a reporting cube that will contain the calculated measures.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Define the calculations.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:Arial;"&gt;Where the 11g technique varies from the 10g technique is how the calculations are defined. In 10g, the calculations are defined in OLAP DML code. In 11g, they are defined using the new calculation expression language. No OLAP DML programming is required. Also, in 11g, the SQL view is created and managed by the database so I get to skip the step of creating the view.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;In this example, I have a cube that is dimensioned by time, product, customer and channel and base measures sales, units and costs. I want to add time series calculations to these base measures.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Step 1 - Creating the calculation dimension&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;In my example, I have a calculation dimension. It plays the same role as Keith's Time View dimension - it's members represent calculations. The dimension is very simple, with one level and one hierarchy (which I really don't even need) and an attribute used for sorting.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_z1PV09snI/AAAAAAAAAAU/Gxully4hY4Q/s1600-h/calc_dim.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187290514730103410" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_z1PV09snI/AAAAAAAAAAU/Gxully4hY4Q/s320/calc_dim.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;The data for the calculation dimension looks like this:&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_z2UF09soI/AAAAAAAAAAc/NLfUosda-8o/s1600-h/calc_dim_datda.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187291695846109826" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_2lLO4bE4a8Y/R_z2UF09soI/AAAAAAAAAAc/NLfUosda-8o/s320/calc_dim_datda.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;Step 2 - Create cube for the stored measure&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;In this example, I have a UNITS_CUBE cube dimensioned by time, product, customer and channel with the stored measures sales, units and costs. This is mapped to a table that contains these measures and data is loaded into this cube.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Step 3 - Create the cube for the calculations&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;This second cube is dimensioned by time, product, customer, channel and calculation and calculated measures. This will be the cube used for reporting purposes. Oracle 11g automatically creates a SQL view of this cube.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Since this cube contains only stored measures settings such as partitioning, compression, sparsity and aggregation are irrelevant. The cube is not mapped to source tables.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;In this cube, I created one calculated measure for each stored measure in the UNITS_CUBE. I named these SALES_CALCS, UNITS_CALCS and COST_CALCS. Note the two cubes below.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_2lLO4bE4a8Y/R_z5zZb-48I/AAAAAAAAAAk/WnkzfKiCPx8/s1600-h/cubes.JPG"&gt;&lt;span style="font-family:arial;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187295532220867522" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_2lLO4bE4a8Y/R_z5zZb-48I/AAAAAAAAAAk/WnkzfKiCPx8/s320/cubes.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Here is where 11g is a lot different from 10g. The calculation definition of the calculated measures is defined in AWM as 11g OLAP calculation expressions. The expression uses the CASE statement to choose the calculation expression based on the value of the calculation dimension.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;CASE&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;W&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;HEN CALCULATION.DIM_KEY = 'BASE'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;THEN UNITS_CUBE.SALES&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;WHEN CALCULATION.DIM_KEY = 'PP'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;THEN LAG(UNITS_CUBE.SALES, 1) OVER HIERARCHY ("TIME".CALENDAR)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;WHEN CALCULATION.DIM_KEY = 'CHG_PP'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;THEN LAG_VARIANCE(UNITS_CUBE.SALES, 1) OVER HIERARCHY ("TIME".CALENDAR)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;WHEN CALCULATION.DIM_KEY = 'PCT_CHG_PP'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;THEN LAG_VARIANCE_PERCENT(UNITS_CUBE.SALES, 1) OVER HIERARCHY ("TIME".CALENDAR) * 100&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;ELSE NULL&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;END &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Notes:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The calculation expressions are based on the logical model, so you have none of the concerns that come with writing to the physical model of the AW (e.g., migration problems that occur when the physical model changes).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The CASE statement is used to switch between calculations. CASE in the OLAP expression language is exactly the same as in SQL.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Because the calculation is captured as on OLAP expression, it will be included in the XML template of the cube or AW.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The illustration below shows the calculation in the context of AWM and the cube.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_2lLO4bE4a8Y/R_z8lpb-4-I/AAAAAAAAAA0/pMuO2hif8Ys/s1600-h/awm_calc.JPG"&gt;&lt;span style="font-family:arial;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187298594532549602" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_2lLO4bE4a8Y/R_z8lpb-4-I/AAAAAAAAAA0/pMuO2hif8Ys/s400/awm_calc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;In AWM, you can view the results. It looks like Keith's example, except that I've nested calculation under measure and put time down as rows. This shows some of the flexibility of this approach to modeling measures and calculations.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_z_TJb-4_I/AAAAAAAAAA8/VTTTLdFW7Pk/s1600-h/report.JPG"&gt;&lt;span style="font-family:arial;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187301575239853042" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_z_TJb-4_I/AAAAAAAAAA8/VTTTLdFW7Pk/s400/report.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Updating INIT.ORA&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Before querying your caclulated measure cube, add the following line to our init.ora file:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;event="37395  trace name context forever, level 1024"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;This line will control some looping code in the OLAP_TABLE table function that is used to query the cube using SQL.  Without this line, null data can be returned by SQL for measures in the calculated meaure cube.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Displaying Data&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;This approach&lt;/span&gt;&lt;span style="font-family:arial;"&gt; makes is very easy to define large numbers of calculations without cluttering the measure dimension. From a data display point of view, this approach really shines with a dimensionally aware tool such as the data viewer in AWM. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;As the OLAP Option moves forward in time we find that almost all data is viewed in SQL based business intelligence tools such as Oracle Business Intelligence Enterprise Edition (OBI EE). What does this mean for data display?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;If we think about OBI EE as an example of relational reporting tools that are commonly used with OLAP cubes, you have two choices: relational style reporting and pivot table style reporting.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;With relational style reporting, the measures of this cube will appear as columns and the calculations as rows (because calculation is a dimension). This enables reporting in the context of a table. Note the calculation column.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_2lLO4bE4a8Y/R_0BZZb-5AI/AAAAAAAAABE/3nzbeZ78FTk/s1600-h/obiee_table.JPG"&gt;&lt;span style="font-family:arial;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187303881637291010" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_2lLO4bE4a8Y/R_0BZZb-5AI/AAAAAAAAABE/3nzbeZ78FTk/s400/obiee_table.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:arial;"&gt;The OBI EE pivot table offers additional flexibility. Note that this is the same report as in the AWM data viewer (above).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_0D-5b-5BI/AAAAAAAAABM/zh4W3ob5Jn0/s1600-h/obeii_pivot.JPG"&gt;&lt;span style="font-family:arial;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187306724905640978" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_0D-5b-5BI/AAAAAAAAABM/zh4W3ob5Jn0/s400/obeii_pivot.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Which style reporting you use is, of course, up to you. With this cube, you can do either.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;It is important to understand that tools such as OBI EE understand the fact columns from the cube view as measures and that they have no special understanding of the calculations dimension. Therefore, they don't typically offer measure formatting based on this column. In my example, I've sorted rows of the calculation dimension using the DISPLAY_ORDER attribute in the AW dimension (via the dimension view) and multiplied the percent change measure * 100 for display purposes. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Keep these types of issues in mind and you can add a lot of analytic capability to your SQL based BI applications and really take advantage of features such as the pivot table in OBI EE.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-4828326095217015525?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/4828326095217015525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=4828326095217015525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4828326095217015525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/4828326095217015525'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/04/more-on-calculated-measure-cube.html' title='More on the Calculated Measure Cube'/><author><name>Bud Endress</name><uri>http://www.blogger.com/profile/02590149552658898625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_2lLO4bE4a8Y/SdS1ej3OizI/AAAAAAAAAD0/Z699ya50auY/S220/bud_head_oracle.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2lLO4bE4a8Y/R_z1PV09snI/AAAAAAAAAAU/Gxully4hY4Q/s72-c/calc_dim.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2918314807430508084</id><published>2008-03-27T07:30:00.000-07:00</published><updated>2008-12-11T15:25:29.775-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Calculated Measures'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='Workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP DML'/><title type='text'>Creating A Calculated Measure Cube - IOGALFF</title><content type='html'>&lt;p style="font-style: italic;" class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;(Firstly, this is information relates only to OLAP 10gR2.&lt;span style=""&gt;  &lt;/span&gt;There are a number of changes within OLAP11gR1 and the following scenario has not been tested with 11g)&lt;/span&gt;&lt;/p&gt;  When you venture into most supermarkets today, somewhere on one of the many isles there will be a BOGOF – buy one get one free.  Well how about an OLAP offer: “IOGALFF” – install one get at least fourteen free.  I admit it is not quite as catchy as the original, but the benefits are huge and it has the result of making life so much easier.&lt;br /&gt;&lt;br /&gt;One of the more interesting challenges of using Analytic Workspace Manager (and also OWB) relates to managing all the calculated measures within a cube.   Every measure should really be accompanied by a standard set of calculated measures such as:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Current Period&lt;/li&gt;&lt;li&gt;Last Year&lt;/li&gt;&lt;li&gt;Last Year %&lt;/li&gt;&lt;li&gt;Prior Period&lt;/li&gt;&lt;li&gt;Prior Period %&lt;/li&gt;&lt;li&gt;Year to Date&lt;/li&gt;&lt;li&gt;Year to Date Last Year&lt;/li&gt;&lt;li&gt;Year to Date Last Year %&lt;/li&gt;&lt;li&gt;Quarter to Date&lt;/li&gt;&lt;li&gt;Quarter to Date Last Year&lt;/li&gt;&lt;li&gt;Quarter to Date Last Year %&lt;/li&gt;&lt;li&gt;3-Month Moving Average&lt;/li&gt;&lt;li&gt;6-Month Moving Average&lt;/li&gt;&lt;li&gt;12-Month Moving Average&lt;/li&gt;&lt;li&gt;Dimension “A” Share of All Members&lt;/li&gt;&lt;li&gt;Dimension “A” Share of Parent&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Its is the addition of these types of measures that adds real value to the your BI application.  As I have stated many times before: business users are not interested in looking at data from base measures, typically they are more interested in trends based on the prior period or prior year, share of revenue, moving averages and so on.  This adds a lot of work for the cube designer as they need to add at least 14 calculated measures for each base measure as well as two additional calculated share measures for each dimension associated with each cube.&lt;br /&gt;&lt;br /&gt;Which adds up to a lot of measures and manually creating all these measure is likely to take a considerable amount of time. If we take the command schema sample that is shipped with BI10g, this contains 5 base measures (costs, quantity, revenue, margin, price) with 4 dimensions (channel, geography, product, time), which translates to&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;    5 * 14 calculated measures&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    + &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    5 * 3 (dimensions - channel, geography, product) * 2 calculated share measures&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    =  100 calculated measures.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;As I said, it is very easy to generate a lot of calculated measures.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So is there a more intelligent way of managing calculated measures?  What is the quickest way to add all these additional calculations to a cube?  One way is to use the Excel Accelerator to add the calculated measures to your AW.  It is relatively easy to use and allows you to use normal Excel tools such as cut &amp;amp; paste to quickly create all the calculations you could ever need.  You can download the Excel Accelerator from the OLAP OTN Home Page, or by clicking &lt;a href="http://www.oracle.com/technology/products/bi/olap/index.html"&gt;here&lt;/a&gt;.  Look for these links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/otn/java/olap/SpreadsheetCalcs_10203.zip"&gt;Creating OLAP Calculations using Excel&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/OLAP_SpreadsheetCalcs.html"&gt;Creating OLAP Calculations using Exce Readme&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;During a recent POC, we used a more interesting approach that takes the use of customer calculations to a new level.   In many ways this goes back to the various techniques we used when creating Express databases for use with Sales Analyzer to make life easier for both administrators and users.  The approach is quite simple – use and additional dimension to define the type of calculation you want to execute and link this to a DML program to return the required results.  The list of calculated measures listed above are converted into dimension members, which provides another way to slice, dice and pivot the data.  As you can see here, the dimension member that identifies the type of calculation is in the row edge with the measure in the column edge.  In this way, only one calculation is required which is used across all the available measures.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pu99qj6VI/AAAAAAAAATs/BmRU3gPU6QI/s1600-h/moz-screenshot-17.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pu99qj6VI/AAAAAAAAATs/BmRU3gPU6QI/s400/moz-screenshot-17.jpg" alt="" id="BLOGGER_PHOTO_ID_5182076332047329618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What this means is: by installing one simple (well, everything is relative) calculated measure you can get upto fourteen additional calculations for free.  Hence the acronym “IOGALFF” – install one get at least fourteen free.&lt;br /&gt;&lt;br /&gt;How is all this managed?  There are five basic steps to creating this type of reporting solution:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create a new dimension to control the types of calculations returned&lt;/li&gt;&lt;li&gt;Add some additional attributes to the time dimension to help manage some of the time series arguments for specific calculations&lt;/li&gt;&lt;li&gt;Create an OLAP DML program to return the data&lt;/li&gt;&lt;li&gt;Create a new cube that includes the new calculation type dimension and add a calculated measure that calls the OLAP DML program to return the required data&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a SQL View over the cube&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1 – Creating the new Time View dimension&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have called the dimension containing the list of calculated members, Time View (mainly because the majority of the calculations are time based but may be a better name would be "&lt;span style="font-style: italic;"&gt;measure view&lt;/span&gt;" ?).   The Time View dimension has one level and one hierarchy with three attributes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Long Label&lt;/li&gt;&lt;li&gt;Short Label&lt;/li&gt;&lt;li&gt;Default sort order&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-pu0Nqj6UI/AAAAAAAAATk/Nu6Z_Zq17yQ/s1600-h/Image1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-pu0Nqj6UI/AAAAAAAAATk/Nu6Z_Zq17yQ/s400/Image1.JPG" alt="" id="BLOGGER_PHOTO_ID_5182076164543605058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The source data looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pvZ9qj6WI/AAAAAAAAAT0/ekI6qOs6_2U/s1600-h/Image2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pvZ9qj6WI/AAAAAAAAAT0/ekI6qOs6_2U/s400/Image2.JPG" alt="" id="BLOGGER_PHOTO_ID_5182076813083666786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With the source table definition as follows:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE TIME_VIEW &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   (TIME_VIEW_ID VARCHAR2(2 BYTE), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; TIME_VIEW_DESC VARCHAR2(35 BYTE), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; SORT_ORDER NUMBER(*,0)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;And the view definition as follows:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE FORCE VIEW VW_TIME_VIEW  AS &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;br /&gt;TIME_VIEW_ID&lt;br /&gt;, TIME_VIEW_DESC&lt;br /&gt;, SORT_ORDER&lt;br /&gt;FROM TIME_VIEW&lt;br /&gt;ORDER BY SORT_ORDER;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To populate the base table the following commands are used:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('1', 'Current Period', '1')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('2', 'Last Year', '2')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('3', 'Last Year %', '3')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('4', 'Prior Period', '4')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('5', 'Prior Period %', '5')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('6', 'Year To Date', '6')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('7', 'Year To Date Last Year', '7')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('8', 'Year To Date Last Year %', '8')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('9', 'Quarter To Date', '9')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('10', 'Quarter To Date Last Year', '10')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('11', 'Quarter To Date Last Year %', '11')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('12', '3-Month Moving Average', '12')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('13', '6-Month Moving Average', '13')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('14', '12-Month Moving Average', '14')&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After this, the next set of values depends on the dimensions within your data model.  For my model, I have three additional dimensions that I want to analyze: Channel, Product and Customer.  For each of these dimensions I want to see the % share of each member in relation to the value for all members (i.e. the top level) and the shared based  on the parent value.  To enable these calculations I add the following lines to the TIME_VIEW table:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('15', ' Product Share of All Products', '15')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('16', ' Product Share of Parent', '16')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('17', ' Channel Share of All Channels', '17')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('18', ' Channel Share of Parent', '18')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('19', ' Customer Share of All Customers', '19')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO TIME_VIEW VALUES ('20', ' Customer Share of Parent', '20')&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Obviously, these additional share calculations are not really related to time, so using the name Time View is sort of confusing and in hindsight the term &lt;span style="font-style: italic;"&gt;Measure View&lt;/span&gt; would have been a better name for the dimension).  Once the table has been defined, it can be mapped in AWM to create the dimension mapping (in this case I am using a view over the source&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-pvjNqj6XI/AAAAAAAAAT8/oanYiI_Qoyw/s1600-h/Image3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-pvjNqj6XI/AAAAAAAAAT8/oanYiI_Qoyw/s400/Image3.JPG" alt="" id="BLOGGER_PHOTO_ID_5182076971997456754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The last part of this step is to then load the members into the dimension using the dimension data load wizard or via the SQL command line using a load script.  The result should look like this when you view the members using the Dimension Data Viewer:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-pvrdqj6YI/AAAAAAAAAUE/flrtNr6cizw/s1600-h/Image3a.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-pvrdqj6YI/AAAAAAAAAUE/flrtNr6cizw/s400/Image3a.JPG" alt="" id="BLOGGER_PHOTO_ID_5182077113731377538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As can be seen here, there are fourteen base calculations that can be applied to any model, plus the additional share calculations that are based on the dimensions within the source cube.  Hence the title “IOGALFF” – install one get fourteen free.  In reality it is more like: install one and as many calculations as you like or need, but that translates to “IOGASMAYNORL” which does not really role off the tongue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2 – Updating the Time Dimension with new Attributes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To make the program that delivers all these calculated measures as simple as possible a number of attributes are added to the time dimension:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lag Prior Year&lt;/li&gt;&lt;ul&gt;&lt;li&gt;At the Year level this equates to 1&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;At the Quarter level this equates to  4&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;At the Month level this  equates to 12&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;At the Day level it is the number of days in the year (365 or 366)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Parent Quarter&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This is the quarter for each time period and used as the reset trigger for the cumulative totals&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Parent Year&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This is the year for each time period and used as the reset trigger for the cumulative totals&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pwk9qj6ZI/AAAAAAAAAUM/VwI_OiGpCoI/s1600-h/Image4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pwk9qj6ZI/AAAAAAAAAUM/VwI_OiGpCoI/s400/Image4.JPG" alt="" id="BLOGGER_PHOTO_ID_5182078101573855634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The information for the two parent attributes is taken from existing columns within the source data since this information already exists and the Lag Prior Year is a simple hard-coded value apart from the day level where the timespan value for the year is used to cope with leap years.  Therefore, all the information for these three attributes should be readily available within your source data, especially if you are using the OWB Time Wizard to create your time dimension.  Obviously using a view over the source table for the mapping within AWM makes adding this information relatively trivial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3 – Create the OLAP DML Calculation Program.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The new OLAP DML program, called TIME_VIEW_PRG (again feel free to change the name of program if you want), takes two arguments:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The cube.measure_name for the base measure, in this case SALES_M1, which is the Revenue measure in the SALES cube.&lt;/li&gt;&lt;li&gt;The identifier for the calculated measure within the REPORT_CUBE cube, which in this case is M1_PRG (this is explained in more detail in the next section)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The program code is as follows, which for those of you familiar with OLAP DML will find relatively easy to understand:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;DEFINE TIME_VIEW_PRG PROGRAM DECIMAL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;argument T_MEASURE      text    " Full measure name including cube name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;argument T_MEASURE_ID   text    " Measure name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;variable T_FORM         text     " Name of the formula&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;variable T_TIME_VIEW    text     " Value of TIME_VIEW dimension&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;variable D_RETURN       decimal  " Return value&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;trap on ALLDONE noprint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;T_TIME_VIEW = TIME_VIEW&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;T_FORM      = joinchars('REPORT_CUBE_', T_MEASURE_ID)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;switch T_TIME_VIEW&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_1':&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_MEASURE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_2':  "LY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_3':  "LY%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = lagpct(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_4':  "PP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), 1, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_5':  "PP%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = lagpct(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), 1, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_6':  "YTD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL EQ 'YEAR'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else D_RETURN = cumsum(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES, TIMES_PARENT_YEAR)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_7':  "YTD LY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL EQ 'YEAR'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else D_RETURN = cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_YEAR)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_8':  "YTD LY%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = (&amp;amp;T_FORM(TIME_VIEW 'VL1_6')-cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_YEAR))/cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_YEAR)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_9':  "QTD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL EQ 'YEAR'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'QUARTER'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'MONTH'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = cumsum(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'DAY'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = cumsum(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_10': "QTD LY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL EQ 'YEAR'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;else if TIMES_LEVELREL EQ 'QUARTER'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'MONTH'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'DAY'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_11': "QTD LY%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL EQ 'YEAR'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;else if TIMES_LEVELREL EQ 'QUARTER'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = (&amp;amp;T_FORM(TIME_VIEW 'VL1_9')-cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER))/cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'MONTH'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = (&amp;amp;T_FORM(TIME_VIEW 'VL1_9')-cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER))/cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else if TIMES_LEVELREL EQ 'DAY'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = (&amp;amp;T_FORM(TIME_VIEW 'VL1_9')-cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER))/cumsum(lag(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES_LAG_PRIOR_YEAR, TIMES, LEVELREL TIMES_LEVELREL), TIMES, TIMES_PARENT_QUARTER)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_12': "3MMA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL eq 'MONTH'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = MOVINGAVERAGE(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), -2, 0, 1, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_13': "6MMA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL eq 'MONTH'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = MOVINGAVERAGE(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), -5, 0, 1, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_14': "12MMA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if TIMES_LEVELREL eq 'MONTH'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      then D_RETURN = MOVINGAVERAGE(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), -11, 0, 1, TIMES, LEVELREL TIMES_LEVELREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else D_RETURN = NA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_15': "Product Share of All Products&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', PRODUCTS limit(PRODUCTS to TOPANCESTORS using PRODUCTS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_16': "Product Share of Parent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', PRODUCTS PRODUCTS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_17': "Customers Share of All Customers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', CUSTOMERS limit(CUSTOMERS to TOPANCESTORS using CUSTOMERS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_18': "Customers Share of Parent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', CUSTOMERS CUSTOMERS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_19': "Channels Share of All Channels&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', CHANNELS limit(CHANNELS to TOPANCESTORS using CHANNELS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_20': "Channels Share of Parent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', CHANNELS CHANNELS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;doend&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ALLDONE:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;return D_RETURN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In simple terms, the program checks to see which member of the dimension TIME_VIEW is being requested and then executes the correct OLAP function to return the required data.   At the moment this has only been tested on a Julian calendar hierarchy but I am doing some more testing over the next few weeks for other types of hierarchies.  Some of the measures are dependant on the level within the Time dimension, so you may need to change references to specific level names etc if you want to reuse this program code.  For example:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    if TIMES_LEVELREL EQ 'YEAR'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My time dimension has levels; Year, Quarter, Month, and Day.  In some cases it is necessary to change the processing depending the level, for example:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;    if TIMES_LEVELREL EQ 'YEAR'&lt;br /&gt;then D_RETURN = NA&lt;br /&gt;else if TIMES_LEVELREL EQ 'QUARTER'&lt;br /&gt;then D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')&lt;br /&gt;else if TIMES_LEVELREL EQ 'MONTH'&lt;br /&gt;then D_RETURN = cumsum(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES, TIMES_PARENT_QUARTER)&lt;br /&gt;else if TIMES_LEVELREL EQ 'DAY'&lt;br /&gt;then D_RETURN = cumsum(&amp;amp;T_FORM(TIME_VIEW 'VL1_1'), TIMES, TIMES_PARENT_QUARTER)&lt;br /&gt;else D_RETURN = NA&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this code extract you can see the reference to one of the additional time attributes we added in the previous step, PARENT_QUARTER that is used by the program.  All the references within the program are based on Standard Form naming conventions.  Therefore, the full standard name for this attribute is TIMES_PARENT_QUARTER since the dimension is called TIMES and the attribute is called PARENT_QUARTER.&lt;br /&gt;&lt;br /&gt;For simplicity I created the program in the AW containing the cubes, which is not exactly ideal because if you delete the AW to rebuild it you will lose the program code.  Alternatively, you can just create a new AW and add the program to the new AW then modify the ONTTACH program in your data AW to automatically attach the program AW.&lt;br /&gt;&lt;br /&gt;Calculations for dimension members VL_15 to VL_20 are provided as examples and would need to be changed to match the dimensions within your own AWs.  For each dimension you will need to create two new dimension members within the TIME_VIEW dimension to return the following share calculations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Share of based on the top level total, i.e. All Members&lt;/li&gt;&lt;li&gt;Share based on parent.&lt;/li&gt;&lt;/ul&gt;As the code uses Standard form notation the only thing you should need to change is code highlighted in bold and replace the phrase “Channels” with your own dimension name:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_19': "Channels Share of All Channels&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', CHANNELS limit(CHANNELS to TOPANCESTORS using CHANNELS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   case 'VL1_20': "Channels Share of Parent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      D_RETURN = &amp;amp;T_FORM(TIME_VIEW 'VL1_1')/&amp;amp;T_FORM(TIME_VIEW 'VL1_1', CHANNELS CHANNELS_PARENTREL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      break&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4 – Creating the New Cube.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In my demo schema I have a cube called SALES and it contains two measures: Revenue (called M1) and Quantity (called M2).  The dimensionality for this cube is Time, Channel Product, and Customer.&lt;br /&gt;&lt;br /&gt;To provide all the time series and comparative calculations I create a new cube that has the same dimensionality as the SALES cube, with one additional dimension.  In this cube the Time View dimension is also used.  This reporting cube contains no stored measures, but it does contain custom calculated measures for each measure in the SALES cube, however, each calculated measure will return 14 additional time calculations and 6 share calculations to support the base measure controlled by the dimension TIME_VIEW.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-px0Nqj6aI/AAAAAAAAAUU/dlY0CE5Gwlo/s1600-h/Image5.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-px0Nqj6aI/AAAAAAAAAUU/dlY0CE5Gwlo/s400/Image5.JPG" alt="" id="BLOGGER_PHOTO_ID_5182079463078488482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The implementation for the cube is largely irrelevant since no stored measures will be present within the cube, only calculated measures.  Therefore, you can if you want either accept the default settings or de-select all the various options.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-pyZNqj6bI/AAAAAAAAAUc/Cq6yNV7VimQ/s1600-h/Image5a.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-pyZNqj6bI/AAAAAAAAAUc/Cq6yNV7VimQ/s400/Image5a.JPG" alt="" id="BLOGGER_PHOTO_ID_5182080098733648306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To add the calculated measures to the cube requires the use of a custom measure XML template.  To create a calculated measure to support the measure “Revenue” from the SALES cube you will need to create a custom calculation either using an XML template (email me I can send you a blank template) or use the Excel Calculation Utility that can be downloaded from the OLAP Home Page on OTN to install the two custom calculations.&lt;br /&gt;&lt;br /&gt;Once you have added these calculated measures to the REPORT_CUBE, the tree in AWM should look like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pzs9qj6cI/AAAAAAAAAUk/p79-jdGBOLA/s1600-h/Image7.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pzs9qj6cI/AAAAAAAAAUk/p79-jdGBOLA/s400/Image7.JPG" alt="" id="BLOGGER_PHOTO_ID_5182081537547692482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By selecting each of the calculated measures, the details of each calculation will be displayed within the right-hand panel of AWM.  For the first calculated measure linked the Revenue measure in the Sales cube the panel looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R-pz2tqj6dI/AAAAAAAAAUs/aofEPCGdYZk/s1600-h/Image8.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R-pz2tqj6dI/AAAAAAAAAUs/aofEPCGdYZk/s400/Image8.JPG" alt="" id="BLOGGER_PHOTO_ID_5182081705051417042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the second calculated measure linked the Quantity measure in the Sales cube the panel looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-pz8dqj6eI/AAAAAAAAAU0/pZfDoaY-ixE/s1600-h/Image9.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-pz8dqj6eI/AAAAAAAAAU0/pZfDoaY-ixE/s400/Image9.JPG" alt="" id="BLOGGER_PHOTO_ID_5182081803835664866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key part is the line showing the “Expression”  (in the XML Template this is the attribute ExpressionText), this defines the call to an OLAP DML program called TIME_VIEW_PRG passing the two required arguments of&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    ExpressionText="TIME_VIEW_PRG('SALES_M1', 'M1_PRG')”&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The cube.measure_name for the base measure, in this case SALES_M1, which is the Revenue measure in the SALES cube.&lt;/li&gt;&lt;li&gt;The identifier for the calculated measure within the REPORT_CUBE cube.&lt;/li&gt;&lt;/ul&gt;At this point you may or may not have the correct formula/expression text.  When you load calculations via the XML interface OLAP tries to be a bit too clever and it attempts to convert any physical name it can match with the equivalent standard form name.  In most cases this is fine, but in this case we need to refer directly to the physical objects.  Modifying the expressions is relatively easy if you follow these steps.  Using AWM, open the OLAP Worksheet and then:&lt;br /&gt;&lt;ol  style="font-family:courier new;"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;CNS REPORT_CUBE_M1_PRG&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;EQ &lt;/span&gt;&lt;span style="font-size:85%;"&gt;TIME_VIEW_PRG('SALES_M1', 'M1_PRG')&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;UPDATE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;COMMIT&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;CNS REPORT_CUBE_M2_PRG&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;EQ &lt;/span&gt;&lt;span style="font-size:85%;"&gt;TIME_VIEW_PRG('SALES_M2', 'M2_PRG')&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;UPDATE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;COMMIT&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;If want to do this via the PL/SQL interface then you can do something like this:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('AW ATTACH AW_NAME RW FIRST')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('CNS REPORT_CUBE_M1_PRG')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('EQ TIME_VIEW_PRG(''SALES_M1'', ''M1_PRG'')')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('UPDATE')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('COMMIT')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('CNS REPORT_CUBE_M2_PRG')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('EQ TIME_VIEW_PRG(''SALES_M2'', ''M2_PRG'')')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('UPDATE')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('COMMIT')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXEC DBMS_AW.EXECUTE('AW DETACH AW_NAME') &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4a – Viewing the Data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once the calculated measures have been added to the new cube, REPORT_CUBE, the AWM Data Viewer can be launched to check the results:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-p0xNqj6fI/AAAAAAAAAU8/WBaYNxibPWQ/s1600-h/Image10A.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-p0xNqj6fI/AAAAAAAAAU8/WBaYNxibPWQ/s400/Image10A.JPG" alt="" id="BLOGGER_PHOTO_ID_5182082710073764338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the Query Wizard both sets of measures (stored measures and the new calculated measures) are both available for selection.  To see the new calculations that are now available we can select both of the Report View measures as shown here.&lt;br /&gt;&lt;br /&gt;Once the measures have been selected, the dimension selector will allow us to pick the calculations we want to display from the list of twenty (there are fourteen base calculations that can be applied to any model, plus the additional share calculations that are based on the dimensions within the source cube, in this case six additional share calculations, making twenty calculated measures in total).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-p0-Nqj6gI/AAAAAAAAAVE/_2fPi9q25eI/s1600-h/Image10B.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R-p0-Nqj6gI/AAAAAAAAAVE/_2fPi9q25eI/s400/Image10B.JPG" alt="" id="BLOGGER_PHOTO_ID_5182082933412063746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Dimension Viewer shows all the available calculations for this demo schema and the final report is shown below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-p1Idqj6hI/AAAAAAAAAVM/jMfbrK9BSLs/s1600-h/Image11.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-p1Idqj6hI/AAAAAAAAAVM/jMfbrK9BSLs/s400/Image11.JPG" alt="" id="BLOGGER_PHOTO_ID_5182083109505722898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 5 – Making the Data Available via SQL.&lt;/span&gt;&lt;br /&gt;Is there any real point to this post except to show how clever Oracle OLAP can be?  In opinion yes, since this technique can be extremely useful when you need to make an OLAP cube visible to SQL based tools.  Analytic Workspace Manager 10g has an relational view generator that is available as a plugin and this makes generating the SQL views to support your OLAP cubes a very quick and easy process.  But there we know users don’t just want base measures they want lots and lots of calculations as well.  When the time comes to create SQL views as the limit on the number of columns within a view is 1000.  This may have been increased in 10g/11g, but even so, navigating a cube with that many columns is not easy.&lt;br /&gt;&lt;br /&gt;The OLAP View Generator plugin for AWM10gR2 can be downloaded from &lt;a href="http://www.oracle.com/technology/products/bi/olap/viewGenerator_1_0_2.zip"&gt;here&lt;/a&gt;, and the associated readme is &lt;a href="http://www.oracle.com/technology/products/bi/olap/ViewGenerator.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Using this model, the calculations simply resolve to another dimension, which translates to one additional column in the view as opposed to, at least, 14 additional columns per source measure and in this case 20 additional columns per source measure.  Therefore, this approach makes exposing the cube much easier to manage as can be seen here:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-p1Udqj6iI/AAAAAAAAAVU/4qwxeHTZ2gw/s1600-h/Image12.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R-p1Udqj6iI/AAAAAAAAAVU/4qwxeHTZ2gw/s400/Image12.JPG" alt="" id="BLOGGER_PHOTO_ID_5182083315664153122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As we can see here, all the calculations are contained within the dimension Time View, which simply gets exposed like any other dimension.&lt;br /&gt;&lt;br /&gt;Eh voila, install one measure and you can automatically generate fourteen or more additional measures which are guaranteed to bring a smile to the face of any business user.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2918314807430508084?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2918314807430508084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2918314807430508084' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2918314807430508084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2918314807430508084'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/03/creating-calculated-measure-cube.html' title='Creating A Calculated Measure Cube - IOGALFF'/><author><name>Keith Laker</name><uri>http://www.blogger.com/profile/01039869313455611230</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_MQqVcvGe0t8/R4TgI_SdrcI/AAAAAAAAAJM/vbkN081--7Q/S220/Me2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MQqVcvGe0t8/R-pu99qj6VI/AAAAAAAAATs/BmRU3gPU6QI/s72-c/moz-screenshot-17.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-5048105438524302735</id><published>2008-03-20T20:32:00.000-07:00</published><updated>2008-03-20T08:58:55.652-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>OLAP Option Wiki Update</title><content type='html'>The OLAP Blog team has been adding lots of new content to the Oracle OLAP Option Wiki site.  To link to the Wiki click &lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+Option"&gt;here&lt;/a&gt;.  We have added both general and techie/DBA focused information.  Don't forget the Wiki is open to contributions from everyone within the Oracle community:  customers, partners and oracle employees.   To join the Oracle Wiki community simply click &lt;a href="http://wiki.oracle.com/accountnew"&gt;here&lt;/a&gt;, or go to &lt;a href="http://wiki.oracle.com/accountnew"&gt;http://wiki.oracle.com/accountnew&lt;/a&gt;.  Registration is free.&lt;br /&gt;&lt;br /&gt;This is what we currently have on the Wiki for the OLAP Option:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;General Information&lt;/span&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+Option+Background"&gt;Background and History &lt;/a&gt;- of the OLAP Option.  This covers the key milestones in the development of Express and its evolution into the the OLAP Option.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Getting+Started+With+Oracle+OLAP+Option"&gt;Getting Started with Oracle OLAP&lt;/a&gt; - This is a series of shortcuts to get you up and running with the OLAP Option as quickly as possible.  We have included additional reading material and links to all the relevant documentation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+Olap+Terminology"&gt;Terminology&lt;/a&gt; - Covers the key concepts and terms used when working with multidimensional data and more specifically the OLAP Option.  There are still some blank pages but we are slowly making progress.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+Versions"&gt;Versions&lt;/a&gt; - This page provides the key features  for each version, from the latest version of the OLAP Option (11g Release 1) all the way back to Express Server 4.8.  The Express server product line does go back much further (I started with PCX2.5, I think) but there is no documentation to consult to extract a list of features.  If anyone can fill in the missing products please feel free to add the content.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+Newsletter"&gt;Oracle OLAP Newsletter&lt;/a&gt; - Links to the current newsletter and archive copies.  We have extracted the main headlines from each newsletter to make searching for a specific article a little easier.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;For DBAs and Techies&lt;/span&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+DBA+Sample+Scripts"&gt;Script Samples &lt;/a&gt;- A complete library of 29 scripts to help DBAs and developers manage the OLAP option.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/Oracle+OLAP+How+To"&gt;Oracle OLAP How To&lt;/a&gt; - The purpose of this page is to cover basic principles and recommendations around generic tuning of a database running the Oracle OLAP option. This page makes the assumption that tuning the OLAP option takes precedence over any other application or option on the server.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+Did+You+Know%3F"&gt;Did You Know?&lt;/a&gt; - this covers how to use the OLAP Option with other key database features such as :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Flashback&lt;/li&gt;&lt;li&gt;Recylce Bin&lt;/li&gt;&lt;li&gt;Resumable operations&lt;/li&gt;&lt;li&gt;Virtual Private Databases&lt;/li&gt;&lt;li&gt;Job Scheduler&lt;/li&gt;&lt;li&gt;ADDM/AWR&lt;/li&gt;&lt;li&gt;Real Application Custers&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://wiki.oracle.com/page/OLAP+option+-+Diagnostic+Techniques"&gt;Diagnostic Techniques&lt;/a&gt; - for those using the OLAP option.  At the moment we have two entries but we are planning to add a lot more over time, and feel free to upload your own scripts as well.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Diagnose OLAP API Client Sessions with SYS.OLAP$ALTER_SESSION (i.e., BI Beans, Discoverer for OLAP, Spreadsheet Add-in) (Link)&lt;/li&gt;&lt;li&gt;Relevant Diagnostic Parameters for the Oracle OLAP option (Link)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-5048105438524302735?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/5048105438524302735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=5048105438524302735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5048105438524302735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/5048105438524302735'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/03/olap-option-wiki-update.html' title='OLAP Option Wiki Update'/><author><name>Keith Laker</name><uri>http://www.blogger.com/profile/01039869313455611230</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_MQqVcvGe0t8/R4TgI_SdrcI/AAAAAAAAAJM/vbkN081--7Q/S220/Me2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-2077863164595216790</id><published>2008-03-18T07:30:00.000-07:00</published><updated>2008-12-11T15:25:31.819-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='XML_LOAD_LOG'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>Monitoring OLAP Builds</title><content type='html'>Recently I was working on a project where the customer’s server was in out South Africa office and I was running various build configurations testing data loading performance.  In the past when I have been monitoring build times I always used SQLDeveloper’s excellent auto refresh facility.  Firstly, it is worth downloading the “Scripts for OLAP DBAs” created by Jameson White (who also contributes to this blog and is very active on the Oracle OLAP Wiki).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/bi/olap/OLAP_DBA_scripts.ZIP"&gt;http://www.oracle.com/technology/products/bi/olap/OLAP_DBA_scripts.ZIP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These scripts are extremely valuable during tuning exercises.  Jameson also provided me with two additional scripts for monitoring the XML_LOAD_LOG table, which holds all the build messages generated during a data load process.  In the SQLDeveloper tree below you can see all these scripts&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R96dIcSzidI/AAAAAAAAAR8/s1cSq8tlgiQ/s1600-h/Image1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R96dIcSzidI/AAAAAAAAAR8/s1cSq8tlgiQ/s400/Image1.JPG" alt="" id="BLOGGER_PHOTO_ID_5178749389882231250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Note, the OWB team has also provided a set of predefined scripts/reports as well).  Here is the main report for the XML_LOAD_LOG table that generates a report based on the whole table:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R96e7MSziiI/AAAAAAAAASk/tX8fszEMQjM/s1600-h/Image2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R96e7MSziiI/AAAAAAAAASk/tX8fszEMQjM/s400/Image2.JPG" alt="" id="BLOGGER_PHOTO_ID_5178751361272220194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code for this report is here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select XML_LOADID as "Load ID"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, XML_RECORDID as "Record ID"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, XML_AW as "AW"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, XML_DATE as "Date"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, TO_CHAR(XML_DATE, 'HH24:MM:SS') as "Actual Time"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, substr(XML_MESSAGE, 1, 9) as "Message Time"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, substr(XML_MESSAGE, 9) as "Message"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from olapsys.xml_load_log order by 1 desc, 2 desc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The other report allows you to focus on a single job, which is passed to the report as a parameter:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R96fKcSzijI/AAAAAAAAASs/xFnGVl3PxoU/s1600-h/Image3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R96fKcSzijI/AAAAAAAAASs/xFnGVl3PxoU/s400/Image3.JPG" alt="" id="BLOGGER_PHOTO_ID_5178751623265225266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and the code for this report is here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select XML_LOADID as "Load ID"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, XML_RECORDID as "Record ID"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, XML_AW as "AW"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, XML_DATE as "Date"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, TO_CHAR(XML_DATE, 'HH24:MM:SS') as "Actual Time"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, substr(XML_MESSAGE, 1, 9) as "Message Time"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, substr(XML_MESSAGE, 9) as "Message"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from olapsys.xml_load_log &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;where XML_LOADID = :i_LoadId &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;order by 1 desc, 2 desc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once you have installed the reports into SQLDeveloper you can then use the auto refresh feature to keep each report up to date.  SQLDeveloper lets you set the refresh rate for 5, 10, 15, 20, 25, 30, 60, or120 seconds&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R96fSMSzikI/AAAAAAAAAS0/vonXxT2q5C8/s1600-h/Image4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R96fSMSzikI/AAAAAAAAAS0/vonXxT2q5C8/s400/Image4.JPG" alt="" id="BLOGGER_PHOTO_ID_5178751756409211458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This works well if you have a good connection to your remote server and most importantly you can stay connected during the build process.  Unfortunately, my connection to South Africa was very slow and sometimes it was necessary to run a job in background mode and just disconnect and walk away.  Which causes a problem of know when the build has actually completed?&lt;br /&gt;&lt;br /&gt;To help resolve this I created some utilities to help resolve this particular issue.  Using the utl_smtp package that is part of the database I created a routine that would scan the XML_LOAD_LOG table and once a build was complete it would send me an email.&lt;br /&gt;&lt;br /&gt;For ease of use I created three procedures to monitor:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dimension builds&lt;/li&gt;&lt;li&gt;Cube builds&lt;/li&gt;&lt;li&gt;AW builds&lt;/li&gt;&lt;/ul&gt;Depending on what is being monitored the title and body of the email changes accordingly.  For example when monitoring a dimension build:&lt;br /&gt;&lt;br /&gt;The email that is sent has the title:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Data Load for PRODUCTS finished at 15:43:41&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And the message body can contain either just three simple lines:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08   14:03:20           Started Loading Dimension Members for PRODUCTS.DIMENSION (1 out of 1 Dimensions).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08   14:03:20           Started Loading Dimension Members for PRODUCTS.DIMENSION (1 out of 1 Dimensions).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Total Time  00:00:00&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or the body of the message can contain the complete XML_LOAD_LOG for that job, for example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:33   Completed Build(Refresh) of SH_OLAP.SH_AW Analytic Workspace.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:22     Finished Updating Partitions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21     Started Updating Partitions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21     Finished Loading Dimensions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21       Finished Loading Attributes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21         Finished Loading Attributes for PRODUCTS.DIMENSION. 6 attribute(s) LONG_DESCRIPTION, PACK_SIZE, SHORT_DESCRIPTION, SUPPLIER_ID, UNIT_OF_MEASURE, WEIGHT_CLASS Processed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21         Started Loading Attributes for PRODUCTS.DIMENSION (1 out of 1 Dimensions).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21       Started Loading Attributes.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21       Finished Loading Hierarchies.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:21         Finished Loading Hierarchies for PRODUCTS.DIMENSION. 1 hierarchy(s) STANDARD Processed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:20         Started Loading Hierarchies for PRODUCTS.DIMENSION (1 out of 1 Dimensions).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:20       Started Loading Hierarchies.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:20       Finished Loading Dimension Members.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:20         Finished Loading Members for PRODUCTS.DIMENSION. Added: 0. No Longer Present: 0.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:20         Started Loading Dimension Members for PRODUCTS.DIMENSION (1 out of 1 Dimensions).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:20       Started Loading Dimension Members.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:19     Started Loading Dimensions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:19   Attached AW SH_OLAP.SH_AW in RW Mode.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;07-MAR-08  14:03:19   Started Build(Refresh) of SH_OLAP.SH_AW Analytic Workspace.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Total Time 00:00:14&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The code will monitor both foreground and background jobs but for the background jobs access to the scheduler is required.  For both types of job access to DBMS_LOCK.SLEEP function to allow the code to continuously loop while the job continues to process.  During each loop of checking to see if the specified load has completed the DBMS_LOCK.SLEEP forces the monitoring process to sleep for 60 seconds (if anyone knows of a better way to do this please let me know).&lt;br /&gt;&lt;br /&gt;Overview of the Code&lt;br /&gt;The monitoring code is split into two packages with associated procedures:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AW_Monitor&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Dim_Build&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cube_Build.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Aw_Build &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Send_Complete_Log &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Send_Mail&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Monitor_Sched_Process&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Create_Job&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Drop_Job&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Dim_Build&lt;/span&gt;&lt;br /&gt;This procedure monitors the build process for a dimension, looking for the string 'Finished Loading Members for ' to determine if the build has completed.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Cube_Build&lt;/span&gt;&lt;br /&gt;This procedure monitors the build process for a dimension, looking for the string 'Finished Auto Solve for Measure' to determine if the build has completed.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Aw_Build &lt;/span&gt;&lt;br /&gt;This procedure monitors the build process for a dimension, looking for the string 'Completed Build(Refresh) of ' to determine if the build has completed.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Send_Complete_Log&lt;/span&gt;&lt;br /&gt;Emails the complete log file for a build&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Send_Mail&lt;/span&gt;&lt;br /&gt;This procedure sends an email containing just the Start and End messages from the build being monitored&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Create_Job&lt;/span&gt;&lt;br /&gt;This procedure creates a new job within DBMS_SCHEDULER but does not enable the job&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Drop_Job&lt;/span&gt;&lt;br /&gt;This removes the job from DBMS_SCHEDULER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What to Monitor?&lt;/span&gt;&lt;br /&gt;There are three monitoring options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dimension&lt;/li&gt;&lt;li&gt;Cube&lt;/li&gt;&lt;li&gt;AW&lt;/li&gt;&lt;/ul&gt;All this really does is determine the definition of the string used in the search criteria within the XML_MESSAGE column.  If you want to know when a specific dimension has completed its refresh then use DIM_BUILD procedure.  If you want to know when a specific cube has completed its refresh then use CUBE_BUILD procedure.  The final procedure, AW_BUILD, monitors the refresh of the AW, which can be useful if you are refreshing lots of cubes and/or dimensions within a single job.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to Monitor a Foreground Job&lt;/span&gt;&lt;br /&gt;Monitoring a foreground job is relatively easy.  If you want to run a job that maintains a dimension called product and then have an email sent once the refresh of the dimension has completed then you would use the DIM_BUILD procedure.  The parameters for each procedure are much the same.  You need to provide:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Schema name&lt;/li&gt;&lt;li&gt;AW Name&lt;/li&gt;&lt;li&gt;Object name (dimension name or cube name)&lt;/li&gt;&lt;li&gt;Report Type (Summary or Full)&lt;/li&gt;&lt;li&gt;Job Name (if the monitor process is being scheduled)&lt;/li&gt;&lt;/ul&gt;So the command would be as follows:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;EXEC AW_MONITOR.DIM_BUILD('SH_OLAP', 'SH_AW', 'PRODUCTS', 'SUMMARY', null);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How Monitor a Background Job&lt;/span&gt; It is important to schedule the monitoring of XML_LOAD_LOG to start after the AW job has started.  Therefore, you need to set the time passed to CREATE_JOB procedure to a point in time after the BuildDate details in the AW XML script.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Job Name&lt;/li&gt;&lt;li&gt;Script to run&lt;/li&gt;&lt;li&gt;Date and Time to run&lt;/li&gt;&lt;li&gt;Job Description&lt;/li&gt;&lt;/ul&gt;So the command would be as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;exec monitor_sched_process.create_job('MONITOR_PROD_1','aw_monitor.dim_build(''SH_OLAP'',''SH_AW'', ''PRODUCTS'', ''SUMMARY'', ''MONITOR_PROD_1'')', '07-MAR-2008 15:46:00', 'Starts the monitor of PRODUCTS dimension build');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is important to schedule the monitoring of XML_LOAD_LOG to start after the AW job has started.  Therefore, you need to set the time passed to CREATE_JOB procedure to a point in time after the BuildDate details in the AW XML script.&lt;br /&gt;&lt;br /&gt;You can review the job details via the Scheduler Jobs page in Enterprise Manager.  Here you can see an AW build process is scheduled to run at 3:45 and the monitoring job, ‘MONITOR_PROD_1’, is scheduled to run at 3:46.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R96h3sSzilI/AAAAAAAAAS8/i5YMPYOHV1A/s1600-h/Image5.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R96h3sSzilI/AAAAAAAAAS8/i5YMPYOHV1A/s400/Image5.JPG" alt="" id="BLOGGER_PHOTO_ID_5178754599677561426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can use the features in Enterprise Manager to halt the job at any point in time via the delete button.  Once the job itself has completed, i.e. the email is sent, the job is stopped and removed from the job queue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Possible Code Changes&lt;/span&gt;&lt;br /&gt;Before running the code you may need to change the recipient, from, and mail server details in the AW_MONITOR package.  Each of the monitoring procedures has a call to SEND_MAIL procedure that includes the name of the “To” part of the email.  This would need to be changed unless you want to send all your emails to me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;send_mail('keith.laker@oracle.com', v_title, v_body);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The procedure SEND_MAIL has the following lines that need to changed&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;     msg_from     VARCHAR2(50) := 'keith.laker@oracle.com';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     mailhost     VARCHAR2(30) := 'mail.oracle.com';&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The Code&lt;/span&gt;&lt;br /&gt;A note of caution - I am not a brilliant PL/SQL coder, therefore, I am sure most of the code I have created can be improved.  I am not going to post all the code here, as I suspect it will cause problems. At the moment I cannot find a convenient location to host the Zip file containing the two PL/SQL packages, therefore, if you want the code send me an email (&lt;a href="mailto:keith.laker@oracle.com"&gt;keith.laker@oracle.com&lt;/a&gt;) and then I will send you the zip file.&lt;br /&gt;&lt;br /&gt;There are two basic packages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AW_MONITOR&lt;/li&gt;&lt;li&gt;MONITOR_SCHED_PROCESS&lt;/li&gt;&lt;/ul&gt;The AW_MONITOR package contains the following procedures:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dim_Build - This procedure monitors the build process for a dimension, looking for the string 'Finished Loading Members for ' to determine if the build has completed.&lt;/li&gt;&lt;li&gt;Cube_Build - This procedure monitors the build process for a dimension, looking for the string 'Finished Auto Solve for Measure' to determine if the build has completed.&lt;/li&gt;&lt;li&gt;Aw_Build - This procedure monitors the build process for a dimension, looking for the string 'Completed Build(Refresh) of ' to determine if the build has completed.&lt;/li&gt;&lt;li&gt;Send_Complete_Log - Emails the complete log file for a build&lt;/li&gt;&lt;li&gt;Send_Mail - This procedure sends an email containing just the Start and End messages from the build being monitored&lt;/li&gt;&lt;/ul&gt;Example code:&lt;br /&gt;monitoring a build for a specific dimension.   The parameters are schema, AW Name, Dimension Name, email type:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;exec aw_monitor.dim_build('SH_OLAP', 'SH_AW', 'PRODUCTS', 'SUMMARY');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;monitoring a build for a specific cube.  The parameters are schema, AW Name, Cube Name, email type:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;exec aw_monitor.cube_build('SH_OLAP', 'SH_AW', 'SALES', 'SUMMARY');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;monitoring a build for a specific AW.   The parameters are schema, AW Name, Cube, email type&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;exec aw_monitor.aw_build('SH_OLAP', 'SH_AW', 'SUMMARY');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The above procedures all finish by sending an email to the specified recipients, where the body of the email can either be a summary of the build (just the start and end times) or the complete build log for the dimension, cube or AW.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;exec send_mail('keith.laker@oracle.com', 'Data Load for PRODUCT finished at 12:00pm', 'Start at...., Finished at.....);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;exec send_complete_log(795, 'keith.laker@oracle.com', 'Data Load for PRODUCT finished at 12:00pm');&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The result is an email delivered to your Inbox:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R9-NbMSzimI/AAAAAAAAATE/4p6iZujxejs/s1600-h/Image6.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R9-NbMSzimI/AAAAAAAAATE/4p6iZujxejs/s400/Image6.JPG" alt="" id="BLOGGER_PHOTO_ID_5179013594795444834" border="0" /&gt;&lt;/a&gt;Then depending on the parameter that controls the body of the email, the body will contain either the complete log from XML_LOAD_LOG table:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9-Nf8SzinI/AAAAAAAAATM/UgCm8CuO6B4/s1600-h/Image7.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9-Nf8SzinI/AAAAAAAAATM/UgCm8CuO6B4/s400/Image7.JPG" alt="" id="BLOGGER_PHOTO_ID_5179013676399823474" border="0" /&gt;&lt;/a&gt;or simply a summary containing the start and end times for the build process:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R9-OUMSzipI/AAAAAAAAATc/J0zvX-Ab4t0/s1600-h/Image8.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R9-OUMSzipI/AAAAAAAAATc/J0zvX-Ab4t0/s400/Image8.JPG" alt="" id="BLOGGER_PHOTO_ID_5179014574047988370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The MONITOR_SCHED_PROCESS  package contains the following procedures:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create_job - This procedure creates a new job within DBMS_SCHEDULER but does not enable the job&lt;/li&gt;&lt;li&gt;drop_job - This removes the job from DBMS_SCHEDULER&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Example code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family: courier new;"&gt;exec monitor_sched_process.create_job('AW_DIM_MONITOR',aw_monitor.dim_build('SH_OLAP','AH_AW', 'PRODUCTS', 'AW_DIM_MONITOR', 'SUMMARY'), '23-JAN-2008 12:15:00', 'Starts the monitor of the PRODUCTS dimension build');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;exec monitor_sched_process.drop_job('AW_DIM_MONITOR');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-2077863164595216790?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/2077863164595216790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=2077863164595216790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2077863164595216790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/2077863164595216790'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/03/monitoring-olap-builds.html' title='Monitoring OLAP Builds'/><author><name>Keith Laker</name><uri>http://www.blogger.com/profile/01039869313455611230</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://bp2.blogger.com/_MQqVcvGe0t8/R4TgI_SdrcI/AAAAAAAAAJM/vbkN081--7Q/S220/Me2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MQqVcvGe0t8/R96dIcSzidI/AAAAAAAAAR8/s1cSq8tlgiQ/s72-c/Image1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-8554277225811538563</id><published>2008-03-13T17:56:00.000-07:00</published><updated>2008-12-11T15:25:31.995-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLAP 11g &quot;Materialized Views&quot; &quot;Cube Organized&quot; &quot;query rewrite&quot; summary'/><title type='text'>Comparing Materialized Views and Analytic Workspaces in Oracle Database 11g</title><content type='html'>One of the great new features of Oracle OLAP in 11g is the Cube Organized Materialized Views.  This feature allows OLAP Analytic Workspaces (AWs) to be included in the Summary Management capabilities of the DB including automatic query rewrite and refresh.  This provides the same capabilities of Materialized Views (MVs), a feature which has been part of the database since 8i.  Now that 11g supports both AWs and MVs the question of when to use relational materialized views and when to use OLAP AWs becomes more interesting.&lt;br /&gt;&lt;br /&gt;Oracle has created a new &lt;a href="http://www.oracle.com/technology/products/bi/db/11g/pdf/comparision_aw_mv_11g_twp.pdf"&gt;white paper&lt;/a&gt; that explains the shared capabilities and differences of both of these powerful features.&lt;br /&gt;&lt;br /&gt;A key benefit of this capability, from the whitepaper, is  that "Materialized views are used for pre-computed results for both relational and multi-dimensional data: the cost based optimizer can now rewrite SQL queries to the analytic workspace and materialized views can be defined over the cubes."&lt;br /&gt;&lt;br /&gt;This ultimately provides greater capabilities to increase performance and provide robust analytics without requiring the BI tool or SQL programmer to understanding where the summary data is.  Performance and advanced analytical functions are provided automatically whenever they exist.&lt;br /&gt;&lt;br /&gt;Here is an overview of the materialized view architecture taken from the white paper.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oWxneBwuBnc/R92Gy9xaPNI/AAAAAAAAAAU/Vr_IaEPasbw/s1600-h/mv_aw.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_oWxneBwuBnc/R92Gy9xaPNI/AAAAAAAAAAU/Vr_IaEPasbw/s400/mv_aw.jpg" alt="" id="BLOGGER_PHOTO_ID_5178443356679322834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will be posting more information and examples of how this feature can be used to improve BI and Analytical applications.&lt;br /&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;  &lt;v:stroke joinstyle="miter"&gt;  &lt;v:formulas&gt;   &lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;   &lt;v:f eqn="sum @0 1 0"&gt;   &lt;v:f eqn="sum 0 0 @1"&gt;   &lt;v:f eqn="prod @2 1 2"&gt;   &lt;v:f eqn="prod @3 21600 pixelWidth"&gt;   &lt;v:f eqn="prod @3 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @0 0 1"&gt;   &lt;v:f eqn="prod @6 1 2"&gt;   &lt;v:f eqn="prod @7 21600 pixelWidth"&gt;   &lt;v:f eqn="sum @8 21600 0"&gt;   &lt;v:f eqn="prod @7 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @10 21600 0"&gt;  &lt;/v:formulas&gt;  &lt;v:path extrusionok="f" gradientshapeok="t" connecttype="rect"&gt;  &lt;o:lock ext="edit" aspectratio="t"&gt; &lt;/v:shapetype&gt;&lt;v:shape id="_x0000_s1026" type="#_x0000_t75" style="'position:absolute;"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\bmacdona\LOCALS~1\Temp\msohtml1\03\clip_image001.wmz" title=""&gt;  &lt;w:wrap type="square"&gt; &lt;/v:shape&gt;&lt;![if gte mso 9]&gt;&lt;o:oleobject type="Embed" progid="PowerPoint.Show.8" shapeid="_x0000_s1026" drawaspect="Content" objectid="_1266947835"&gt; &lt;/o:OLEObject&gt; &lt;![endif]&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3820031471524503731-8554277225811538563?l=oracleolap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.oracle.com/technology/products/bi/db/11g/pdf/comparision_aw_mv_11g_twp.pdf' title='Comparing Materialized Views and Analytic Workspaces in Oracle Database 11g'/><link rel='replies' type='application/atom+xml' href='http://oracleolap.blogspot.com/feeds/8554277225811538563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3820031471524503731&amp;postID=8554277225811538563' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8554277225811538563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820031471524503731/posts/default/8554277225811538563'/><link rel='alternate' type='text/html' href='http://oracleolap.blogspot.com/2008/03/comparing-materialized-views-and.html' title='Comparing Materialized Views and Analytic Workspaces in Oracle Database 11g'/><author><name>Brian Macdonald</name><uri>http://www.blogger.com/profile/18408740222558531436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oWxneBwuBnc/R92Gy9xaPNI/AAAAAAAAAAU/Vr_IaEPasbw/s72-c/mv_aw.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820031471524503731.post-3503198964957031767</id><published>2008-03-07T21:00:00.000-08:00</published><updated>2008-12-11T15:25:37.789-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cubes'/><category scheme='http://www.blogger.com/atom/ns#' term='Calculated Measures'/><category scheme='http://www.blogger.com/atom/ns#' term='AWM'/><category scheme='http://www.blogger.com/atom/ns#' term='Workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP DML'/><title type='text'>OLAP Workshop 7 : Creating Calculated Measures</title><content type='html'>Most data warehouses contain a lot of data but also conversely contain very little information.  Many DW teams are content to publish basic facts to their user communities and then leave those communities to fend for themselves in turning data into information.  For example, it is not uncommon to see basic measures such as sales, costs, and stock in many data warehouse schemas, but in reality these types of measures are completely useless in themselves.  Business users are not interested per se in the value of sales today and this can be seen in the general press as well when reporting key trading periods such as Thanksgiving in the US and Christmas in Europe.  Both business and financial communities are both more interested in sales compared to the same time last year, rate of growth of sales, sales compared to forecast.  In other words most people are actually interested in calculated measures such as ratios and percentages derived from the base data.&lt;br /&gt;&lt;br /&gt;Therefore, the key question for many data warehouse teams is how to create and manage these types of calculations?&lt;br /&gt;&lt;br /&gt;In this workshop we will explore some the calculated measures that can be quickly and easily created in your analytic workspace (AW) to enrich its analytic content for end users.&lt;br /&gt;&lt;br /&gt;One of the powerful features of the Oracle OLAP technology is the ability to efficiently and easily create business calculations.  Oracle OLAP contains a powerful calculation engine that allows you to extend the analytic content of your AW by adding into it some useful business calculations as calculated measures.  Some of these business calculations are simple and some of are a lot more involved.  However, none are complex from an end-user perspective, although many of them are challenging to traditional relational-only databases. This is especially true when the calculations are numerous, and when many of the queries are ad hoc and unpredictable in nature.&lt;br /&gt;&lt;br /&gt;Calculated measures are, as the name suggests, calculated from other measures available in the AW. They are implemented as formulas in the AW; that is, their definition is saved, but no calculated data is stored. The calculations happen at run time when a query requires it. Calculated measures are derived from the contents of other measures, including stored measures as well as measures that are calculated at run time.  The calculated measures that you define in the AW are indistinguishable to end users from the stored measures into which data has been loaded and stored in the AW. All measures, according to the dimensional model presented to the end user, are identical. This promotes ease of use by end users.&lt;br /&gt;&lt;br /&gt;There is generally a trade-off between precomputing and storing measures in the AW versus calculating them at query time. However, Oracle AWs are very efficient at preserving query performance at very fast levels, even when there are many calculated measures that are resolved dynamically. It is not uncommon for Oracle OLAP customers to implement multidimensional cubes with many hundreds or even thousands of calculated measures and key performance indicators (KPIs), which are calculated at query time from a relatively small number of physically stored and aggregated (or partially aggregated) measures. It is a striking characteristic of AWs in the Oracle database that query performance generally remains consistent even as data volumes and calculation complexity increase.&lt;br /&gt;&lt;br /&gt;So how do calculated measures works and what happens when the dimensionality of the source measures does not match exactly?&lt;br /&gt;&lt;br /&gt;In the example below a measure called Revenue is a calculated measure based on two other measures:  quantity and price.  The calculation itself is simple: quantity × price.  Notice that the resulting dimensionality of Revenue is inherited from the two measures involved in the calculation. When you use measures with different dimensionality in a calculation, the result always contains the superset of the dimensions of the base measures. The multidimensional data model handles this automatically. You do not have to worry about the possibility that different measures in your AW have different shapes or dimensionality. You specify the calculation rule in the wizard, and the engine automatically resolves the dimensionality. One obvious requirement is that one dimension must be in common for the result to make sense.&lt;br /&gt;&lt;br /&gt;In this example, Quantity is dimensioned by Time, Product, and Customer but Unit Price is not dimensioned by Customer. When Oracle OLAP is asked to calculate quantity × price, it uses its knowledge of the dimensional model to automatically handle the calculation of Revenue for all customers, even though there is no separate price stored for each customer. If there is not a separate price for each customer, then there must be a single price for all customers. Price does not vary by customer.   As Oracle OLAP performs the calculation quantity × price, it applies the appropriate price for the particular product and time dimension intersections being calculated.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MQqVcvGe0t8/R9EjusSziKI/AAAAAAAAAPk/zeHdXiWUEZ0/s1600-h/image1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_MQqVcvGe0t8/R9EjusSziKI/AAAAAAAAAPk/zeHdXiWUEZ0/s400/image1.JPG" alt="" id="BLOGGER_PHOTO_ID_5174956731896400034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There are two methods for creating a calculated measure&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Wizard and template method&lt;/li&gt;&lt;li&gt;Free format&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Using the Calculation Wizard&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;By default both AWM and OWB provide a calculation wizard to help define the most common types of business calculaltions.  There are four categories of calculations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Basic&lt;/li&gt;&lt;li&gt;Advanced&lt;/li&gt;&lt;li&gt;Prior/Future comparison&lt;/li&gt;&lt;li&gt;Time Frame&lt;/li&gt;&lt;/ul&gt;The image below shows the wizard screen and the list of templates within each category (Note there are some changes with AWM 11g).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Eki8SziLI/AAAAAAAAAPs/O9PcoBl8ljM/s1600-h/image2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Eki8SziLI/AAAAAAAAAPs/O9PcoBl8ljM/s400/image2.JPG" alt="" id="BLOGGER_PHOTO_ID_5174957629544564914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EkocSziMI/AAAAAAAAAP0/YhBB0twPxQ0/s1600-h/image2a.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EkocSziMI/AAAAAAAAAP0/YhBB0twPxQ0/s400/image2a.JPG" alt="" id="BLOGGER_PHOTO_ID_5174957724033845442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EktcSziNI/AAAAAAAAAP8/B5ntDie3mFQ/s1600-h/image2b.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EktcSziNI/AAAAAAAAAP8/B5ntDie3mFQ/s400/image2b.JPG" alt="" id="BLOGGER_PHOTO_ID_5174957809933191378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creating a Share Calculation&lt;/span&gt;&lt;br /&gt;The Share template prompts you for the components you need to specify the calculation:&lt;br /&gt;Share Of: A measure or calculated measure that is dimensioned by the Product dimension (in this example)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9EkyMSziOI/AAAAAAAAAQE/txa1EqQ4CWw/s1600-h/image2c.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9EkyMSziOI/AAAAAAAAAQE/txa1EqQ4CWw/s400/image2c.JPG" alt="" id="BLOGGER_PHOTO_ID_5174957891537570018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For: The dimension for which the share is to be calculated&lt;/li&gt;&lt;li&gt;In: The hierarchy to be used while calculating the share for the selected dimension&lt;/li&gt;&lt;li&gt;As a Percent of: The dimension member to be used as a baseline to calculate the share. Select one of the following choices: &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Total: Specifies that the baseline consists of the total of all items on the level that is associated with the current member (that is, the item for which the share is being calculated). This option is disabled for a dimension that has no hierarchies.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Parent: Specifies that the baseline consists of the total on the level of the parent for the current member (that is, the item for which the share is being calculated). This option is disabled for a dimension that has no hierarchies. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Level: Specifies that the baseline consists of the total of a level to be specified. Choosing this item requires the selection of a value in the associated drop-down list. This list displays the names of levels from the selected hierarchy for the selected dimension that are available for calculating the share. This option is disabled for a dimension that has no hierarchies. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Member: Specifies that the baseline consists of the total for a dimension member to be specified. Choosing this item requires the selection of a value in the associated drop-down list. This list displays the names of the dimension members that are available for calculating the share. This type of calculation applies to measures only.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Note that although the most common use of this template is to express the share as a “% of Total” or as a “% of Parent” in the chosen hierarchy, a specific member can be used as the baseline of the calculation. This is useful if you want to compare members of the dimension in question to a specific benchmark or model member, such as an established market leading product, flagship store, or key competitor.&lt;br /&gt;&lt;br /&gt;So, as can be seen with this share calculation template it may be necessary to create multiple calculated measures using the same template to provide different results, such as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9ExeMSziXI/AAAAAAAAARM/wXW3cm5YheQ/s1600-h/Image14.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9ExeMSziXI/AAAAAAAAARM/wXW3cm5YheQ/s400/Image14.JPG" alt="" id="BLOGGER_PHOTO_ID_5174971841591347570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This report is showing the Budget Profit base measure and three Share calculations: Share of Product Total, Share of Product Level, and Share of a Product Member (Hardware).  Note how the “% of Total,” “% of Level,” and “% of HW ” (hardware) category measures behave differently as the user drills down the product hierarchy.  Also note that the third share measure on the report is base-lined to a specific product: the Hardware category. The report shows how Hardware compares to the other categories: Electronics, Peripherals and Accessories, Photo, and Software/Other.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creating a % Different Prior Period Calculation&lt;/span&gt;&lt;br /&gt;Using the “Percent Difference from Prior Period” calculated measure template, you can create a calculated measure that is useful to indicate growth or decline of a business over time. This calculation template is found in the Prior/Future Time Period calculation type folder. This template accepts input for the following items to calculate the percentage difference from a prior period:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Measure: Select a measure or a dimension member for which you want to calculate the percentage difference from the prior period. &lt;/li&gt;&lt;li&gt;Over: If there is more than one time dimension, then a box appears to enable the selection of the proper Time dimension. Otherwise, the default Time dimension is used. &lt;/li&gt;&lt;li&gt;In: Select the hierarchy for the specified dimension. &lt;/li&gt;&lt;li&gt;From: Choose one of the following items to indicate the previous time period that the comparison is to be based on: &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Year ago: Use if your measure is to compare performance with the same time period from the previous year&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Period ago: Use if your measure is to compare performance with the previous period at the same level in the Time hierarchy&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Number of periods or years ago: Use if your measure is to calculate a comparison with a time period of a specified number (entered in the number box) of periods ago, at a particular level (such as Year, Quarter, or Month)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9EyHMSziZI/AAAAAAAAARc/8j9QNKbc5EE/s1600-h/Image15.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9EyHMSziZI/AAAAAAAAARc/8j9QNKbc5EE/s400/Image15.JPG" alt="" id="BLOGGER_PHOTO_ID_5174972545965984146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In a report this would look like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Ex_8SziYI/AAAAAAAAARU/YxwqTqS_au8/s1600-h/Image16.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Ex_8SziYI/AAAAAAAAARU/YxwqTqS_au8/s400/Image16.JPG" alt="" id="BLOGGER_PHOTO_ID_5174972421411932546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This report contains calculations of a number of alternative percentage differences from prior periods.  All the measures automatically handle the situation in which the user needs to drill down into the time dimension and look at time periods at different levels. A single calculated measure in the AW can be used at any level of time, by any query tool, including SQL tools.&lt;br /&gt;&lt;br /&gt;Note the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Last Year calculation works at all levels of time, and compares each time period with the same time period 1 year ago.&lt;/li&gt;&lt;li&gt;The Last Period calculation works at all levels of time, and compares each time period with the previous period at the same level.&lt;/li&gt;&lt;li&gt;The 3 Months Ago calculation works at the appropriate levels of time (in this case, Month and Quarter because a quarter is made up of three months), and compares each time period with the same time period 3 months ago (which is equivalent to one quarter ago). &lt;/li&gt;&lt;li&gt;Similar calculations can be easily generated for Costs, Quantity, Profit, and Budget measures.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creating a Moving Average Calculation&lt;/span&gt;&lt;br /&gt;The Moving Average calculated measure template enables you to create moving averages over any of the measures in your AW. Moving averages are very useful when you analyze volatile data, because they smooth out the peaks and troughs and enable you to more easily visualize the trend in data. In the Moving Average template, you are asked to provide the following input:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Measure: Select the measure for which you want to calculate a moving average. &lt;/li&gt;&lt;li&gt;Over Time In: If there is more than one time dimension, then a box appears to enable the selection of the proper time dimension. Otherwise, the default time dimension is used. In identifies the hierarchy for the specified dimension. &lt;/li&gt;&lt;li&gt;Include Previous: Enter the number of periods to be used for the calculation. &lt;/li&gt;&lt;li&gt;An example of this calculation is as follows:&lt;/li&gt;&lt;li&gt;Moving average of sales for the last three months = (Jan sales + Feb sales + March sales) / 3&lt;/li&gt;&lt;/ul&gt;Note: Similar pages are used for Moving Totals, Moving Maximums, and Moving Minimums.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Eyw8SziaI/AAAAAAAAARk/MpUoahPxx68/s1600-h/Image17.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Eyw8SziaI/AAAAAAAAARk/MpUoahPxx68/s400/Image17.JPG" alt="" id="BLOGGER_PHOTO_ID_5174973263225522594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Below is a combination graph showing how moving averages can be a useful way of smoothing out volatile data, thus enabling you to see the trends in data more easily.&lt;br /&gt;One line is a moving six-month average, and the other line is a three-month average.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9Ey1cSzibI/AAAAAAAAARs/MJtNEydJtuM/s1600-h/Image18.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9Ey1cSzibI/AAAAAAAAARs/MJtNEydJtuM/s400/Image18.JPG" alt="" id="BLOGGER_PHOTO_ID_5174973340534933938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modifying a Calculated Measure&lt;/span&gt;&lt;br /&gt;Existing calculated measures can be edited from within AWM 10g. The descriptions and the calculation details can be changed.  To change a calculated measure, click the calculated measure in the Model view. You see the general information displayed on the right. You can:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make changes to labels and description. You can change the labels and description, but not the name.&lt;/li&gt;&lt;li&gt;Click the Launch Calculation Editor button to change the details of the calculated measure. You can change the details, but not the type, of the measure.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EzHcSzicI/AAAAAAAAAR0/o7dXkus98_s/s1600-h/Image19.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EzHcSzicI/AAAAAAAAAR0/o7dXkus98_s/s400/Image19.JPG" alt="" id="BLOGGER_PHOTO_ID_5174973649772579266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Managing Calculated Measures&lt;/span&gt;&lt;br /&gt;My recommendation is always to create your calculated measures in a separate cube.  This helps insulate you from changes to the physical implementation of your base cubes.  For example, if you want to change the storage definition for a cube AWM forces you to delete the cube, which if it contains calculated measures means these are also delete and need to be recreated.  By keeping your calculated measures in a separate cube it is possible to delete and a rebuild a cube without impacting the calculated measures.  Assuming of course you do not change the dimensionality.&lt;br /&gt;&lt;br /&gt;There are other ways to resolve this issue (deleting a cube but keeping the calculated measures):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Save the calculated measure to an XML template&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Hack&lt;/span&gt; the XML definition for the cube&lt;/li&gt;&lt;/ul&gt;Saving the calculated measures to an XML file is always a good idea since this creates a backup of the definition.  However, you can only save one measure at a time which is fine if you create the XML template when you define the calculated measure but not so good if you have lots and lots of calculated measures in a cube and then you decide to save them all to XML templates.&lt;br /&gt;&lt;br /&gt;Hacking the XML is not something I would normally recommend, however, it is possible to move calculated measures from one template file to another using notepad.  Again, assuming you do not change the dimensionality (as some measures may refer to specific dimensions and/or levels and/or hierarchies) you can cut &amp;amp; paste the XML.  The calculated measures are all defined in the last but one block of the XML definition, using the tag “DerivedMeasure”.  Simply copy all the DerivedMeasure blocks to your new cube XML template and reload that template to restore all your calculated measures.  This works for 10gR2 but has not been tested with 11g.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Creating custom calculated Measures&lt;/span&gt;&lt;br /&gt;Oracle OLAP Option has a very powerful calculation engine that supports a huge library of functions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Numeric Functions&lt;/li&gt;&lt;li&gt;Time Series Functions&lt;/li&gt;&lt;li&gt;Text Functions&lt;/li&gt;&lt;li&gt;Financial Functions&lt;/li&gt;&lt;li&gt;Statistical Functions&lt;/li&gt;&lt;li&gt;Date and Time Functions&lt;/li&gt;&lt;li&gt;Aggregation Functions&lt;/li&gt;&lt;li&gt;Data Type Conversion Functions&lt;/li&gt;&lt;/ul&gt;Any these functions can be used to create a custom calculated measure.  To get more information on these various functions you can refer to the Oracle OLAP DML Reference &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;10g&lt;/span&gt; Release 2 documentation:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B19306_01/olap.102/b14346/toc.htm"&gt;http://download.oracle.com/docs/cd/B19306_01/olap.102/b14346/toc.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and for &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;11g&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/toc.htm"&gt;http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/toc.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a very simple example of how to create a custom calculated measure.  Lets create a measure to show the percent variance for a measure, sales revenue, based on the prior-period. To do this we need to use the lagpct function.  The LAGPCT function returns the percentage difference between the value of a dimensioned variable or expression at a specified offset of a dimension prior to the current value of that dimension and the current value of the dimensioned variable or expression.&lt;br /&gt;&lt;br /&gt;The syntax for the function is :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LAGPCT(variable, n, [dimension], [STATUS|NOSTATUS|limit-clause] )&lt;/li&gt;&lt;/ul&gt;Where&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Variable - A variable or expression that is dimensioned by dimension.&lt;/li&gt;&lt;li&gt;‘n’ - The offset (that is, the number of dimension values) to lag. LAGPCT uses this value to determine the number of values that LAGPCT should go back in dimension to retrieve the value of variable. Typically, n is a positive INTEGER that indicates the number of time periods (or dimension values) before the current one. When you specify a negative value for n, it indicates the number of time periods after the current one. In this case, LAGPCT compares the current value of the time series with a subsequent value.&lt;/li&gt;&lt;li&gt;Dimension - The dimension along which the lag occurs. While this can be any dimension, it is typically a hierarchical time dimension of type TEXT that is limited to a single level (for example, the month or year level) or a dimension with a type of DAY, WEEK, MONTH, QUARTER or YEAR.   When variable has a dimension with a type of DAY, WEEK, MONTH, QUARTER, or YEAR and you want LAGPCT to use that dimension, you can omit the dimension argument.&lt;/li&gt;&lt;li&gt;Status can be one of the following:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;STATUS - Specifies that LAGPCT should use the current status list (that is, only the dimension values currently in status in their current status order) when computing the lag.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;NOSTATUS  - (Default) Specifies that LAGPCT should use the default status (that is, a list all the dimension values in their original order) when computing the lag.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;limit-clause - Specifies that LAGPCT should use the default status limited by limit-clause when computing the lag. You can use any valid LIMIT clause (see the entry for the LIMIT command for further information). To specify that LAGPCT should use the current status limited by limit-clause when computing the lag, specify a LIMIT function for limit-clause.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Based on this syntax, the format of our function would be as follows:&lt;br /&gt;&lt;ul style="font-family: courier new;"&gt;&lt;li&gt;lagpct(sales_revenue, 1, TIME, LEVELREL TIME_LEVELREL)&lt;/li&gt;&lt;/ul&gt;since sales_revenue is the variable, we need to offset by one period to get the prior period, the dimension for the lag is Time and the limit clause is based on the standard form level object TIME_LEVELREL  which ensures the correct prior period is selected based on the level of the dimension member, so months are only compared to months and quarters only compared to quarters and so on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How do you install a Custom Calculation?&lt;/span&gt;&lt;br /&gt;There are two ways to add a custom calculation to a cube:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Special XML Template&lt;/li&gt;&lt;li&gt;Excel Utility&lt;/li&gt;&lt;/ul&gt;It is possible to use an XML template file to define a custom calculated measure.  As we noted in the XML definition of a cube containing a calculated measure the tag “DerivedMeasure” is used to denote a calculated measure.  The template needs to have the following fields:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Name&lt;/li&gt;&lt;li&gt;LongName&lt;/li&gt;&lt;li&gt;ShortName&lt;/li&gt;&lt;li&gt;PluralName&lt;/li&gt;&lt;li&gt;Id&lt;/li&gt;&lt;li&gt;DataType&lt;/li&gt;&lt;li&gt;IsInternal&lt;/li&gt;&lt;li&gt;UseGlobalIndex&lt;/li&gt;&lt;li&gt;ForceCalc&lt;/li&gt;&lt;li&gt;ForceOrder&lt;/li&gt;&lt;li&gt;SparseType&lt;/li&gt;&lt;li&gt;AutoSolve&lt;/li&gt;&lt;li&gt;IsValid&lt;/li&gt;&lt;li&gt;ExpressionText&lt;/li&gt;&lt;/ul&gt;So for our example the following entries would be required:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Name="SR_PPV_PCT" &lt;/li&gt;&lt;li&gt;LongName="Sales Revenue Prior Period % Variance" &lt;/li&gt;&lt;li&gt;ShortName=" Sales Rev Prior Period % Var" &lt;/li&gt;&lt;li&gt;PluralName=" Sales Revenue Prior Period % Variance"&lt;/li&gt;&lt;li&gt;Id="SALES.SR_PPV_PCT.MEASURE"&lt;/li&gt;&lt;li&gt;DataType="Decimal" &lt;/li&gt;&lt;li&gt;isInternal="false" &lt;/li&gt;&lt;li&gt;UseGlobalIndex="false" &lt;/li&gt;&lt;li&gt;ForceCalc="false" &lt;/li&gt;&lt;li&gt;ForceOrder="false" &lt;/li&gt;&lt;li&gt;SparseType="STANDARD" &lt;/li&gt;&lt;li&gt;AutoSolve="DEFAULT" &lt;/li&gt;&lt;li&gt;IsValid="true" &lt;/li&gt;&lt;li&gt;ExpressionText=" lagpct(sales_revenue, 1, TIME, LEVELREL TIME_LEVELREL)"/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Note the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Name is can must match the “custom_calculated_measure_name” value in the Id tag.&lt;/li&gt;&lt;li&gt;Id is derived as follows:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Cube_name.custom_calculated_measure_name.MEASURE&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ExpressionText can refer either to the AWM Object View names or the physical objects from the ModelView.  It can be more efficient to refer directly to the stored variables rather than using the standard form objects since this involves and additional layer of processing that is not always necessary.  But start by referring to the standard form objects and check query performance before pointing directly to the base storage objects.&lt;/li&gt;&lt;/ul&gt;Fortunately, there is a much easier way to install a custom calculated measure.  On OTN there is an Excel utility to that can help.  See the link on the OLAP OTN Home Page, “Creating OLAP Calculations using Excel”:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/otn/java/olap/SpreadsheetCalcs_10203.zip"&gt;http://download.oracle.com/otn/java/olap/SpreadsheetCalcs_10203.zip&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Follow the instructions in the readme file and then open the spreadsheet included in the zip.  This utility can be used to install both custom and standard calculations (those generated by the Calculated Measure Wizard), which makes installing calculations into a cube a quick and simple exercise. However, you do need to understand how the underlying functions are implemented as some of the templates require you to provide inputs such as “offset”, “start”, “stop” and “step”.  Now the example worksheet provided does include examples for each of the types of templates, which makes it much easier to understand the values required for some of these templates.  Using Excel is a good way to back up all your calculation definitions and makes it very easy to install the calculations into different environments, such as test, training,QA, production etc.&lt;br /&gt;&lt;br /&gt;To use this utility follow these steps:&lt;br /&gt;&lt;br /&gt;Step 1: Define your connection&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EmocSziPI/AAAAAAAAAQM/fM3L7ZElOAc/s1600-h/Image6.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EmocSziPI/AAAAAAAAAQM/fM3L7ZElOAc/s400/Image6.JPG" alt="" id="BLOGGER_PHOTO_ID_5174959923057101042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This should match the details you set in AWM to connect to your analytic workspace.&lt;br /&gt;&lt;br /&gt;Step 2: Select an AW&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9Em2cSziQI/AAAAAAAAAQU/r8daeV0L7AI/s1600-h/Image7.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9Em2cSziQI/AAAAAAAAAQU/r8daeV0L7AI/s400/Image7.JPG" alt="" id="BLOGGER_PHOTO_ID_5174960163575269634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once the connection is established the next stage is to select an AW.  Each user is not limited to owning and/or using just one AW.  In most implementations an OLAP user may have access to multiple AWs.  Therefore, it is important to select the required AW before creating any calculations.  A pulldown list of available AWs is provided just below the “Connection Details” button.&lt;br /&gt;&lt;br /&gt;Step 3: Defining the calculation type&lt;br /&gt;This utility will allow you to create both custom and pre-defined calculations.  The column headed “Calculation Type” can be toggled between two values:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Template&lt;/li&gt;&lt;li&gt;Equation&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9EnL8SziRI/AAAAAAAAAQc/yllQNvVn1Dc/s1600-h/Image8.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9EnL8SziRI/AAAAAAAAAQc/yllQNvVn1Dc/s400/Image8.JPG" alt="" id="BLOGGER_PHOTO_ID_5174960532942457106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The “Template” option will install one of the calculations from the AWM Calc Wizard and the “Equation” option allows you to define a free format equation.&lt;br /&gt;&lt;br /&gt;Step 4: Basic details.&lt;br /&gt;Each measure needs to have a name (which is the physical storage name for the measure so it cannot contain spaces or certain characters such as %, $, £ etc.), long label a short label and be assigned to a specific cube.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EnYcSziSI/AAAAAAAAAQk/aKKdZS9OCWc/s1600-h/Image9.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_MQqVcvGe0t8/R9EnYcSziSI/AAAAAAAAAQk/aKKdZS9OCWc/s400/Image9.JPG" alt="" id="BLOGGER_PHOTO_ID_5174960747690821922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A pulldown list can be used to select the target cube.  The next column to the right allows you to assign the measure to a measure folder.&lt;br /&gt;&lt;br /&gt;Step 4a: Template Calculations&lt;br /&gt;If you are defining a calculation based on a template, a pulldown list of available templates is available in the column marked “Calculation Template”&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9EnhMSziTI/AAAAAAAAAQs/fOKU98S2dGE/s1600-h/Image10.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MQqVcvGe0t8/R9EnhMSziTI/AAAAAAAAAQs/fOKU98S2dGE/s400/Image10.JPG" alt="" id="BLOGGER_PHOTO_ID_5174960898014677298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At this point it is a good idea to refer to the sample worksheet as this show you how to complete the additional columns to the right that manage the arguments for the templates:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Enr8SziUI/AAAAAAAAAQ0/yoVFqyJ_Uc0/s1600-h/Image11.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9Enr8SziUI/AAAAAAAAAQ0/yoVFqyJ_Uc0/s400/Image11.JPG" alt="" id="BLOGGER_PHOTO_ID_5174961082698271042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The inputs are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Base measure – a pulldown list of all available measures is provided&lt;/li&gt;&lt;li&gt;Dimension – the base dimension, which for most of the templates tends to be Time (pulldown list is available)&lt;/li&gt;&lt;li&gt;Hierarchy – the main hierarchy from the time dimension (pulldown list is available)&lt;/li&gt;&lt;li&gt;Level – the target level from the time dimension (pulldown list is available)&lt;/li&gt;&lt;li&gt;Other numeric arguments determined by the type of template&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;All this information is taken from the Calculation Wizard so if you want to check your inputs simply run the calculation wizard in AWM and note the inputs for the specific template.&lt;br /&gt;&lt;br /&gt;Step 4b:  Equation Templates:&lt;br /&gt;To create a custom calculation set the calculation type to “Equation” and then in the “Free Form Equation” column enter the formula using either the standard form object names or the physical storage object names.  The equations can be one of three basic data types:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Decimal&lt;/li&gt;&lt;li&gt;Integer&lt;/li&gt;&lt;li&gt;Text&lt;/li&gt;&lt;/ul&gt;In the example below (taken from the sample spreadsheet) two calculated measures are defined, one decimal and one text:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MQqVcvGe0t8/R9EoE8SziVI/AAAAAAAAAQ8/W3MKzQw9FA8/s1600-h/Image12.JPG"&gt;&lt;img style="margin: 0px
