<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>PerformancePoint</title>
        <link>http://geekswithblogs.net/ManicArchitect/category/10868.aspx</link>
        <description>PerformancePoint</description>
        <language>en-US</language>
        <copyright>James Rogers</copyright>
        <managingEditor>rogers.james@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>PerformancePoint Filter Query suggestions</title>
            <link>http://geekswithblogs.net/ManicArchitect/archive/2009/11/04/135996.aspx</link>
            <description> 
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in 0in 0in 0.375in"&gt; As I have moved forward with PerformancePoint I have made extensive use of queries for filter building. This approach has a couple of distinct advantages over the other options.&lt;/div&gt;
&lt;ol style="MARGIN-TOP: 0in; FONT-SIZE: 11pt; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in; DIRECTION: ltr; unicode-bidi: embed" type="1"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="1"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;Allows filters to be dynamic and pick up new data as it becomes available. One good example of this is a date filter. We use it to keep our filters as a dynamic set of &lt;/span&gt;&lt;span style="FONT-SIZE: 11pt; FONT-STYLE: italic"&gt;n&lt;/span&gt;&lt;span style="FONT-SIZE: 11pt"&gt; time periods from the current time period back (i.e. lastperiods(52,exists([Date].[Week].[Week].members,[Date].[Current Date].&amp;amp;[1]).item(0)))&lt;/span&gt;&lt;/li&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="2"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;It allows the query to be tuned or tweaked to exclude empty members (there are some pitfalls here, noted later).&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in 0in 0in 0.375in"&gt; &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in 0in 0in 0.375in"&gt;If you need to build a tree filter based on a hierarchy, a good query is as follows: HIERARCHIZE([Dimension].[Hierarchy].members). &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in 0in 0in 0.375in"&gt; &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in 0in 0in 0.375in"&gt;A couple of things to keep in mind.&lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in 0in 0in 0.375in"&gt; &lt;/div&gt;
&lt;ol style="MARGIN-TOP: 0in; FONT-SIZE: 11pt; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in; DIRECTION: ltr; unicode-bidi: embed" type="1"&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="1"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;Keep your query results below 500 members. PerformancePoint doesn't seem to handle more than that very well, although I have seen cases where we have gone above that.&lt;/span&gt;&lt;/li&gt;
    &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="2"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;Be careful using MDX funtions that require cell inspection (such as NONEMPTY, filter, etc). This is problematic if you have a large cube/measure group. This can cause a scan of the measure group partitions to evaluate your query. NONEMPTY is especially bad about this and is compounded because you cannot chain filters (i.e. I can't pass a date filter into an item filter).&lt;/span&gt;
    &lt;ol style="MARGIN-TOP: 0in; FONT-SIZE: 11pt; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in; DIRECTION: ltr; unicode-bidi: embed" type="a"&gt;
        &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="1"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;Use an additional member filter in the query that causes the query to be more specific (i.e. nonempty items for the current week's sales)&lt;/span&gt;
        &lt;ol style="MARGIN-TOP: 0in; FONT-SIZE: 11pt; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in; DIRECTION: ltr; unicode-bidi: embed" type="i"&gt;
            &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="1"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;NONEMPTY(HIERARCHIZE([Dimension].[Hierarchy].members),(exists([Date].[Week].[Week].members,[Date].[Current Date].&amp;amp;[1]).item(0),[Sales Amount]))&lt;/span&gt;&lt;/li&gt;
        &lt;/ol&gt;
        &lt;/li&gt;
    &lt;/ol&gt;
    &lt;ol style="MARGIN-TOP: 0in; FONT-SIZE: 11pt; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.375in; DIRECTION: ltr; unicode-bidi: embed" type="a"&gt;
        &lt;li style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle" value="2"&gt;&lt;span style="FONT-SIZE: 11pt"&gt;Use a very small measure group (at the query's required granularity) to satisfy the request. This requires cube changes and may not be an option. I don't recommend this as a first option because those measure groups would have little usefulness to other analysis being done in the cube as well as the down stream impact on the ETL process and cube processing.&lt;/span&gt;&lt;/li&gt;
    &lt;/ol&gt;
    &lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135996"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135996" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/ManicArchitect/aggbug/135996.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>James Rogers</dc:creator>
            <guid>http://geekswithblogs.net/ManicArchitect/archive/2009/11/04/135996.aspx</guid>
            <pubDate>Wed, 04 Nov 2009 19:14:52 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/ManicArchitect/comments/135996.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/ManicArchitect/archive/2009/11/04/135996.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/ManicArchitect/comments/commentRss/135996.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/ManicArchitect/services/trackbacks/135996.aspx</trackback:ping>
        </item>
        <item>
            <title>PerformancePoint Dashboard Performance, KPI Properties and Parameter Passing - Issue Found - Solved in SP1</title>
            <link>http://geekswithblogs.net/ManicArchitect/archive/2008/08/12/124398.aspx</link>
            <description>&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt;In PerformancePoint 2007 you have the capability to setup custom properties and pass them into dashboard objects. This is especially useful for simplifying dashboards where you are linking scorecard KPIs to report views. Alyson Powell Erwin outlines how to do this in the PerformancePoint MSDN blog:&lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt; &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt;&lt;a href="http://blogs.msdn.com/performancepoint/archive/2007/12/21/passing-context-from-scorecards-to-other-report-views.aspx"&gt;http://blogs.msdn.com/performancepoint/archive/2007/12/21/passing-context-from-scorecards-to-other-report-views.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt; &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt;This is very handy. By setting up a custom property that contains measure names for the KPI you can use one report for each data source and pass the value of the custom property into the [Measures] endpoint on the report view. If you have a scorecard with 20 KPIs from the same data source and each KPI displays two report views it trims the number of reports required from 40 to 2. &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt; &lt;/div&gt;
&lt;div style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; TEXT-DECORATION: underline"&gt;Issue Found - Solved in SP1&lt;/div&gt;
&lt;div style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; TEXT-DECORATION: underline"&gt; &lt;/div&gt;
&lt;div style="FONT-SIZE: 11pt; MARGIN: 0in"&gt;However, I noticed something going awry when doing my performance testing while running Profiler against the Analysis Services database. Each time I clicked on a KPI it would execute the query for the two report views as expected &lt;span style="TEXT-DECORATION: underline"&gt;AND&lt;/span&gt; submit a query for the scorecard with NO FILTERS. This basically amounts to running the scorecard query for all time because we pass the org and date filters in from the dashboard filter selections. This obviously has a negative effect on overall query performance from the Analysis Services server. However, in testing PerformancePoint 2007 SP1 I found that this problem has been addressed although I saw no mention of it specifically in the SP1 release notes. It is easy for this issue to go unnoticed because of the good caching done by Analysis Services - provided there is sufficient CPU and memory on the Analysis Services server.&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=124398"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=124398" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/ManicArchitect/aggbug/124398.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>James Rogers</dc:creator>
            <guid>http://geekswithblogs.net/ManicArchitect/archive/2008/08/12/124398.aspx</guid>
            <pubDate>Wed, 13 Aug 2008 03:45:09 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/ManicArchitect/comments/124398.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/ManicArchitect/archive/2008/08/12/124398.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/ManicArchitect/comments/commentRss/124398.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/ManicArchitect/services/trackbacks/124398.aspx</trackback:ping>
        </item>
        <item>
            <title>Filtering PerformancePoint Reports and Scorecards by Dimensions Different Than the Filter</title>
            <link>http://geekswithblogs.net/ManicArchitect/archive/2008/03/25/120756.aspx</link>
            <description>&lt;p class="MsoNoSpacing"&gt;In my earlier post &lt;a style="FONT-WEIGHT: bold" name="NON EMPTY Filtering on PerformancePoint Scorecard" href="http://geekswithblogs.net/ManicArchitect/archive/2007/10/08/115932.aspx"&gt;NON EMPTY Filtering on PerformancePoint Scorecard&lt;/a&gt;, I mentioned that you may be able filter scorecards and/or reports by dimensions that are not the same as the filter by using a cross join or other MDX querying technique.&lt;span&gt;  &lt;/span&gt;This is true if the other dimension is in the same cube as the query or member selection used by the filter.&lt;span&gt;  &lt;/span&gt;Consider the following:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;strong&gt;Cube&lt;/strong&gt;: &lt;span&gt;                &lt;/span&gt;Sales&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;: &lt;span&gt;    &lt;/span&gt;Organizational Hierarchy (lowest level is Site)&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                            &lt;/span&gt;Site (this contains attributes that only apply to the site)&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;strong&gt;Filter&lt;/strong&gt;: Org (Member Selection of Organizational Hierarchy)&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;strong&gt;Report&lt;/strong&gt;: Sales by State/Province&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Approach 1:&lt;span&gt;  &lt;/span&gt;We could put the Organizational Hierarchy dimension into the Sales by State/Province and pass the Org filter value directly into that.&lt;span&gt;  &lt;/span&gt;However, this may limit the flexibility of the report and its applicability to other dashboards.&lt;span&gt;  &lt;/span&gt;Additionally, if we were to use the report without passing a value into it we may complicate the resulting query and unnecessarily degrade the report’s query performance.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Approach 2: We apply a MDX function to the filter when it is mapped to the report filter to only show States/Provinces that apply to the Organizational Hierarchy (which are often geographically defined).&lt;span&gt;  &lt;/span&gt;The resulting Filter Formula would look something like the following:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;NONEMPTY([Site].[Geography].[State].members,&amp;lt;&amp;lt;SourceValue&amp;gt;&amp;gt;)&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;A key cube design reminder here – make sure your cubes have a high performing default measure if you do not specify a specific measure in the NONEMPTY filter expression like the following:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;NONEMPTY(NONEMPTY([Site].[Geography].[State].members,&amp;lt;&amp;lt;SourceValue&amp;gt;&amp;gt;),[Measures].[Site Count])&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt; &lt;/span&gt;I like to use something that only returns one row in the base fact table per granular dimension value (i.e. one row per site).&lt;span&gt;   &lt;/span&gt;I generally set aside a measure group just to support this type of filtering or I set up a cube just to support PerformancePoint filters (to be discussed in a later post).&lt;span&gt;  &lt;/span&gt;This requires additional education on the part of publisher so they understand that the measure group or cube has very little analytical value.&lt;span&gt;  &lt;/span&gt;At a bare minimum our aggregation design needs to support the dimensions involved in the filter expression unless we have very small cubes.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;One thing that would be nice would be if we could filter filters (no that is not a typo). Ideally, if we had a date filter, we would want to filter a MDX query or Member Selection filter (such as org) to only show members that have values for the applied date filter.  This has value in industry Same-Store or Comparables dashboards.&lt;br /&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;p class="MsoNoSpacing"&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120756"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120756" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/ManicArchitect/aggbug/120756.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>James Rogers</dc:creator>
            <guid>http://geekswithblogs.net/ManicArchitect/archive/2008/03/25/120756.aspx</guid>
            <pubDate>Wed, 26 Mar 2008 02:09:04 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/ManicArchitect/comments/120756.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/ManicArchitect/archive/2008/03/25/120756.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/ManicArchitect/comments/commentRss/120756.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/ManicArchitect/services/trackbacks/120756.aspx</trackback:ping>
        </item>
        <item>
            <title>Performance, Named Sets, Calculated Measures, PerformancePoint and ProClarity</title>
            <link>http://geekswithblogs.net/ManicArchitect/archive/2008/02/13/119557.aspx</link>
            <description>&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;Many legacy Analysis Services (or OLAP Services) implementations use ProClarity as a querying tool and publishing framework.&lt;span&gt;  &lt;/span&gt;The server infrastructure of ProClarity allows crafty implementers to push much of the customization in KPI’s and additional measures into the “Presentation” layer of the infrastructure.&lt;span&gt;  &lt;/span&gt;This is easier to manage and change in many cases than creating named sets and calculated members in the cubes as this generally takes a SSAS administrator.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;With Microsoft purchasing ProClarity and its inclusion into PerformancePoint leads to a quandary for many solution designers.&lt;span&gt;  &lt;/span&gt;While ProClarity still works well as it was designed and is available as a report type in PerformancePoint, the ProClarity views have a very different look and feel than the native PerformancePoint report views.&lt;span&gt;  &lt;/span&gt;Also, due to the fact that the report views are basically ProClarity Web Standard views, the drill-from-anywhere-to-anywhere capabilities are not available directly though the PerformancePoint interface for these views. Additionally, the library of calculated measures and sets created and published in ProClarity are not available to PerformancePoint and thus cannot be used in scorecards and report views.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;In many cases, the optimum solution here is to build these ProClarity sets and measures into their respective cubes as named sets and calculated members.&lt;span&gt;  &lt;/span&gt;CAVEAT – this is not a silver bullet solution.&lt;span&gt;  &lt;/span&gt;There is a cost in terms of SSAS processing and resources for named sets and calculated measures so this should not be done without ample testing prior to implementation in production environments.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;Let’s first talk about calculated measures.&lt;span&gt;  &lt;/span&gt;Existing ProClarity solutions may have a laundry list of calculated measures in their libraries. Many times these may contain nested measures (i.e. a calculated measure that uses another calculated measure) and as these get more they tend to not perform as well as desired.&lt;span&gt;  &lt;/span&gt;First, it is important to identify which measures will get heavy use in other applications such as PerformancePoint (both scorecards and reports) and Excel.&lt;span&gt;  &lt;/span&gt;Those that have a wide range of applicability justify their creation and maintenance as calculations in their respective cubes.&lt;span&gt;  &lt;/span&gt;These calculation (and set) definitions can be extracted from the ProClarity repository database for those of you who are familiar with it.&lt;span&gt;  &lt;/span&gt;This is not a “recommended” approach in much the same way as using the “sys” tables in production code for SQL Server is discouraged.&lt;span&gt;  &lt;/span&gt;As a rule, I like to take these calculations and run through extensive performance analysis using Query Analyzer and Profiler.&lt;span&gt;  &lt;/span&gt;For instance, let’s convert a calculation that reflects sales growth over the prior week:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;[Measures].[Sales]/paralleperiod([Date].[Week].[Week],1,[Date].[Week].currentmember)&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;The query would look something like:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;With member [Measures].[Sales Growth] as ‘[Measures].[Sales]/paralleperiod([Date].[Week].[Week],1,[Date].[Week].currentmember)’&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Select [Org].members on rows&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;,[Date].[Week].&amp;amp;[01/01/2007 – 01/07/2007] on columns&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;From sales&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Where [Measures].[Sales Growth]&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Make sure to test the query using dimension that can take advantage of your cube partitioning strategy (in this case [Date]).&lt;span&gt;  &lt;/span&gt;Test the query with the measure as a filter, on rows and on columns.&lt;span&gt;  &lt;/span&gt;Checking profiler to make sure that the query does not cause a scan of all process partitions or excessive subcubing.&lt;span&gt;  &lt;/span&gt;Once you have settled on a calculation formula that performs well in these cases it is now time to create the calculated member through Business Intelligence Studio.&lt;span&gt;  &lt;/span&gt;When you create the calculated member in the cube, make sure you define the format and especially the non-empty behavior.&lt;span&gt;  &lt;/span&gt;If the calculation involves division, I tend to use one of the measures from the denominator as the non-empty behavior measure.&lt;span&gt;  &lt;/span&gt;I realize that this may not always be feasible if the resulting non-empty behavior is not correct so do not do this thoughtlessly.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;Next, let’s talk about named sets.&lt;span&gt;  &lt;/span&gt;Many times users and/or publishers have created dimensional sets in ProClarity to ease reporting and facilitate exception-based metrics (I will talk to this in a later post).&lt;span&gt;  &lt;/span&gt;Putting these into the cube involves much the same process as the calculated measures.&lt;span&gt;  &lt;/span&gt;First I test the named set through Query Analyzer watching with Profiler.&lt;span&gt;  &lt;/span&gt;Let’s consider a named set for a dimension Sales Type that identifies gift card sales:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;{[Sales Type].[Sales Type].&amp;amp;[Gift Card], [Sales Type].[Sales Type].&amp;amp;[Vendor Card]}&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Next we use this in the query:&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;With set [Gift Card] as ‘{[Sales Type].[Sales Type].&amp;amp;[Gift Card], [Sales Type].[Sales Type].&amp;amp;[Vendor Card]}’&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;member [Measures].[Sales Growth] as &lt;span&gt; &lt;/span&gt;‘[Measures].[Sales]/paralleperiod([Date].[Week].[Week],1,[Date].[Week].currentmember)’&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Select [Org].members on rows&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;,[Date].[Week].&amp;amp;[01/01/2007 – 01/07/2007] on columns&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;From sales&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Where ([Measures].[Sales Growth], [Gift Card])&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Move the set around in the query to test it from all angles and try using it as part of an aggregate measure as well: &lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;With set [Gift Card] as ‘{[Sales Type].[Sales Type].&amp;amp;[Gift Card], [Sales Type].[Sales Type].&amp;amp;[Vendor Card]}’&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;member [Measures].[Gift Card Sales] as &lt;span&gt; &lt;/span&gt;‘sum([Gift Card],[Measures].[Sales])’&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Select [Org].members on rows&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;,[Date].[Week].&amp;amp;[01/01/2007 – 01/07/2007] on columns&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;From sales&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;Where ([Measures].[Gift Card Sales])&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;If the results are satisfactory then create the set in the cube through Business Intelligence Studio.&lt;span&gt;  &lt;/span&gt;Keep in mind that sets are cached in memory for each connection so extremely large sets are not recommended in some cases as are too many sets.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;I tend to define the named sets at the top of my calculations definition so they can be used in all the subsequent calculations, if necessary.&lt;span&gt;  &lt;/span&gt;The sets and calculations created in Business Intelligence Studio are appended to the cube definition as an MDXScript so order of creation in the Studio is important as you must define parent sets and calculations before their dependent sets and calculations. &lt;span&gt; &lt;/span&gt;Adding and modifying these generally does not require cube reprocessing but I have seen it happen in rare instances.&lt;span&gt;  &lt;/span&gt;Make sure you test the cube modifications first in a non-production environment to make sure that they do not require reprocessing.&lt;span&gt;  &lt;/span&gt;You wouldn’t want to do something that would cause reprocessing the cube partitions as the source data may have been purged and unrecoverable (hopefully you have planned for this with a good archive process).&lt;span&gt;  &lt;/span&gt;Since named sets are cached in memory and calculated members are generally resolved in memory, often the combination of these results in better query performance.&lt;span&gt;  &lt;/span&gt;Using named sets in calculated measures often requires aggregate functions (such as SUM) which have a higher CPU requirement so consider the calculation mdx definition carefully to find the correct balance of query performance and scalability considering your server resources.&lt;span&gt;  &lt;/span&gt;On last advantage of calculated measures is that the mdx definition is static so you lessen the likelihood of the same measure being calculated multiple, different ways which can not only end up with different results but vastly different queries and performance.&lt;/p&gt;
&lt;p class="MsoNoSpacing"&gt;&lt;span&gt;                &lt;/span&gt;With these high-use sets and calculations defined in the cube(s) in an optimum way they are now available to all applications that connect to the cube such as PerformancePoint, Excel and Reporting Services as well as ProClarity and the resulting query performance should be more predictable than when they were in the ProClarity repository and assembled on the fly by ProClarity.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=119557"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=119557" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/ManicArchitect/aggbug/119557.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>James Rogers</dc:creator>
            <guid>http://geekswithblogs.net/ManicArchitect/archive/2008/02/13/119557.aspx</guid>
            <pubDate>Thu, 14 Feb 2008 04:15:46 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/ManicArchitect/comments/119557.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/ManicArchitect/archive/2008/02/13/119557.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/ManicArchitect/comments/commentRss/119557.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/ManicArchitect/services/trackbacks/119557.aspx</trackback:ping>
        </item>
        <item>
            <title>NON EMPTY Filtering on PerformancePoint Scorecard</title>
            <link>http://geekswithblogs.net/ManicArchitect/archive/2007/10/08/115932.aspx</link>
            <description>For those who are familiar with PerformancePoint scorecards and dashboards, you have probably run into a problem where empty dimension values cannot be dynamically filtered on scorecards if you map the dimension to the rows or columns on the scorecard in the dashboard designer.  One simple way around this is to use the NONEMPTY MDX function along with an EXISTS function call.  Consider the following example:&lt;br /&gt;
&lt;br /&gt;
Scorecard: Sales&lt;br /&gt;
Filters: Org, Time (Site is the lowest level of the Org dimension)&lt;br /&gt;
&lt;br /&gt;
Requirement: Only show Sites that have values for the time selected and are Descendants of the Org selected&lt;br /&gt;
&lt;br /&gt;
To solve this, create a link to the Org filter from the Scorecard (columns or rows).  In the filter link formula (button on the filter link editor in dashboard designer) enter the following (with your particular dimension/hierarchy identifiers, of course):&lt;br /&gt;
&lt;br /&gt;
NONEMPTY(EXISTS([Org].[Hierarchy - Org].[Level 08].members,&amp;lt;&amp;lt;SourceValue&amp;gt;&amp;gt;,'Sales'))&lt;br /&gt;
&lt;br /&gt;
'Sales' is the measure group from the cube being used by the scorecard.  This approach should work as well for using dimensions that may not be the same as the applied filter, though a cross-join may be required.  I have not tried that yet so I will follow up on whether or not my theory is correct.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=115932"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=115932" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/ManicArchitect/aggbug/115932.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>James Rogers</dc:creator>
            <guid>http://geekswithblogs.net/ManicArchitect/archive/2007/10/08/115932.aspx</guid>
            <pubDate>Mon, 08 Oct 2007 19:13:13 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/ManicArchitect/comments/115932.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/ManicArchitect/archive/2007/10/08/115932.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/ManicArchitect/comments/commentRss/115932.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/ManicArchitect/services/trackbacks/115932.aspx</trackback:ping>
        </item>
    </channel>
</rss>