<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://cwebbbi.spaces.live.com/mmm2008-07-17_13.29/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fcwebbbi.spaces.live.com%2fcategory%2fAnalysis%2bServices%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Chris Webb's BI Blog: Analysis Services</title><description /><link>http://cwebbbi.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catAnalysis%2bServices</link><language>en-US</language><pubDate>Thu, 24 Jul 2008 01:02:02 GMT</pubDate><lastBuildDate>Thu, 24 Jul 2008 01:02:02 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://cwebbbi.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>8900433320278050970</live:id><live:alias>cwebbbi</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Show Hidden Objects in the Calculations tab</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2103.entry</link><description>&lt;p&gt;Here's a new button I've just noticed in the toolbar on the Calculations tab in BIDS 2008: Show Hidden Objects. Quite often when you're writing MDX you want to reference hierarchies that are hidden to the end user, and in BIDS 2005 you had to unhide them to be able to see them (and so find out their unique name) in the metadata pane, which was a pain; now in BIDS 2008 you just need to click the new 'Show Hidden Objects' button to be able to see them. For some bizarre reason it doesn't seem to allow me to see hidden sets or calculated members though - why? &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pGR9FgVunfPTJyY4tL_Yn5b5QpF-m8oukMt69RH8s-l-3MZXi37EXMcIAfNRiC9pq?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=222 alt=showhiddenobjects src="http://blufiles.storage.msn.com/y1pn02v0lT1iSG3WXRFJFjmqndVYVY1RbXnSdVZmwA66BOAW6lo-e90Z9-555pR7Am0?PARTNER=WRITER" width=599 border=0&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Show+Hidden+Objects+in+the+Calculations+tab&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2103.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2103.entry</guid><pubDate>Wed, 23 Jul 2008 16:05:36 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!2103/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2103.entry#comment</wfw:comment><dcterms:modified>2008-07-23T16:05:36Z</dcterms:modified></item><item><title>Caching: can there be too much of a good thing?</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2055.entry</link><description>&lt;p&gt;I was doing some load testing on a cube recently and noticed an interesting thing. When my load tests started, the average query response time was high for the first minute or so, which is reasonable given that all queries were being run on a cold cache; subsequently the average query response time fell dramatically, as you would expect when the cache warmed up. But over a long period (and I was running a lot of queries over several hours) I noticed that the average query response time started creeping up again. Not by a massive amount, it's true, but enough to be noticeable: say a rise from three to four seconds. &lt;p&gt;Naturally I fired off an email to various people who I thought might help, and as usual Mosha came up with the goods. It turns out he'd noticed the same thing happening on the stress tests that MS run internally but come to the conclusion that it wasn't going to be a problem in the real world. I won't try to repeat too much of the technical detail he gave in case I end up garbling it but essentially there were two reasons why this performance degradation was happening: &lt;ul&gt; &lt;li&gt;Most stress tests use template queries into which random parameters are passed. So, for example, I had captured several 'typical' queries with four or five dimensions in the Where clause which in my test I parameterised;I then selected a random member on each of these dimensions to pass in to each query. This resulted in a lot of queries being run which returned no data at all, which in turn meant that the cache filled up with entries in the index that were very small and not much use, which in turn made cache lookups slower. In the real world the proportion of queries that return no data is much smaller.  &lt;li&gt;The AS cache is optimised for ad-hoc query patterns, where a user starts in one place then drills down/up, slices, dices and so on, and where the data that a query returns is very closely connected to the data retrieved by the last query that was run. This is very different from randomised queries, which as a result perform worse. &lt;/ul&gt; &lt;p&gt;So all in all, it's nothing to worry about. I guess if you had a large cube, lots of users, random query patterns and didn't process your cube very often then it might be a slight problem, but that's a lot of ifs. &lt;p&gt;As an aside, if you're thinking of doing stress testing I wouldn't waste any time trying to get the AS Stress tool I blogged about &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1131.entry"&gt;here&lt;/a&gt; working - I found it a real pain and ended up building my own load test tool in SSIS using an approach similar to my &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!994.entry"&gt;cache warmer package&lt;/a&gt;. &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Caching%3a+can+there+be+too+much+of+a+good+thing%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2055.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2055.entry</guid><pubDate>Wed, 09 Jul 2008 16:40:07 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!2055/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!2055.entry#comment</wfw:comment><dcterms:modified>2008-07-09T16:40:07Z</dcterms:modified></item><item><title>Connection String Properties in SQLMS RC0</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1980.entry</link><description>&lt;p&gt;I heard this was going to be possible &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1634.entry"&gt;back in March&lt;/a&gt;, but now I've seen it in RC0 - you can now set connection string properties in SQL Management Studio when opening an MDX query window. Just click the new MDX query button, then click Options and you'll see a third tab: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_so0Ek-Gv44YXYj6z8G6x7pJSKWtQ1DKY8aL40aIvubgo8TLCIv-2s-zZT1R8woA88?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=366 alt=connectionstrings src="http://blufiles.storage.msn.com/y1pAEvk1empm_uqFhDT4ZeDhNaNaLJuHr34Af-A5sYATxKXtj-OqqxVLyCKmbWLqN2A7aZONvrvglI?PARTNER=WRITER" width=315 border=0&gt;&lt;/a&gt;  &lt;p&gt;Although it's much less common to need to set connection string properties, there are still a few scenarios where it's useful. One example is the 'Cube' connection string property, which allows you to write session scoped script assignments in the way Mosha does here:&lt;br&gt;&lt;a title="http://sqlblog.com/blogs/mosha/archive/2008/06/08/mdx-answer-to-nextanalytics-challenge.aspx" href="http://sqlblog.com/blogs/mosha/archive/2008/06/08/mdx-answer-to-nextanalytics-challenge.aspx"&gt;http://sqlblog.com/blogs/mosha/archive/2008/06/08/mdx-answer-to-nextanalytics-challenge.aspx&lt;/a&gt; &lt;p&gt;Another good example is when you're using the Roles or EffectiveUserName properties to test out how queries behave with security.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Connection+String+Properties+in+SQLMS+RC0&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1980.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1980.entry</guid><pubDate>Mon, 09 Jun 2008 16:04:33 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1980/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1980.entry#comment</wfw:comment><dcterms:modified>2008-06-09T16:04:33Z</dcterms:modified></item><item><title>SQL Server 2008 RC0 is out</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1976.entry</link><description>&lt;p&gt;Andrew Fryer has the details here:&lt;br&gt;&lt;a title="http://blogs.technet.com:80/andrew/archive/2008/06/06/sql-server-2008-rc0.aspx" href="http://blogs.technet.com:80/andrew/archive/2008/06/06/sql-server-2008-rc0.aspx"&gt;http://blogs.technet.com:80/andrew/archive/2008/06/06/sql-server-2008-rc0.aspx&lt;/a&gt; &lt;p&gt;If we've got a release candidate, then this means RTM isn't &lt;em&gt;too&lt;/em&gt; far away...&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+SQL+Server+2008+RC0+is+out&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1976.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1976.entry</guid><pubDate>Sat, 07 Jun 2008 06:35:48 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1976/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1976.entry#comment</wfw:comment><dcterms:modified>2008-06-07T06:35:48Z</dcterms:modified></item><item><title>Cell Security: when Read permissions are actually Read Contingent</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1946.entry</link><description>&lt;p&gt;I usually avoid using cell security like the plague for the good reason that it absolutely kills query performance. But sometimes there's no alternative but to use it and I'm working on one such project right now. However I've found a new gotcha: the behaviour of cell security changed between AS2005 SP1 and SP2 and in my opinion it didn't change for the better. The short explanation is that when you are using &lt;strong&gt;just&lt;/strong&gt; Read permissions in cell security, if you have MDX Script assignments at a lower level of granularity you'll find that the higher level members whose values are affected by the assignments have Read Contingent permissions applied to them, even though according to the MDX expression I used in for the Read permissions these values should not be secured. &lt;p&gt;Here's the repro I've got for Adventure Works using AS2005 SP2: &lt;ul&gt; &lt;li&gt;In AW, comment out everything in the MDX Script apart from the Calculate statement &lt;li&gt;Add the following calculations to the Script:&lt;br&gt;CREATE MEMBER CURRENTCUBE.MEASURES.[Show Value] AS&lt;br&gt;IIF(&lt;br&gt;[Date].[Calendar].CURRENTMEMBER IS&lt;br&gt;[Date].[Calendar].[Month].&amp;amp;[2004]&amp;amp;[1],&lt;br&gt;FALSE, TRUE);&lt;br&gt;&lt;br&gt;CREATE MEMBER CURRENTCUBE.MEASURES.[Show Internet Sales Amount] AS [Measures].[Internet Sales Amount]; &lt;li&gt;As an Administrator you see the following results for a query in the cube browser:&lt;br&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_sZRSzrm8b_WfNakwv8POcVYQa2U776SFd6ClvxpRXeBxXRPeyWirxV2F-Nz3yKNfU?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=236 alt="clip_image001" src="http://blufiles.storage.msn.com/y1pAEvk1empm_sOPW7xLzuTAg4QJaDRGFW8CEF43PBCXBOs7lKlVJAQp9K8dN7zrjfS9y_7iCIW0C0?PARTNER=WRITER" width=573 border=0&gt;&lt;/a&gt; &lt;li&gt;Now create a role with the following Read permissions in the cell security tab:&lt;br&gt;IIF(&lt;br&gt;[Date].[Calendar].CURRENTMEMBER IS &lt;br&gt;[Date].[Calendar].[Month].&amp;amp;[2004]&amp;amp;[1]&lt;br&gt;AND&lt;br&gt;[Measures].CURRENTMEMBER IS [Measures].[Internet Sales Amount],&lt;br&gt;FALSE, TRUE) &lt;li&gt;Display the same query in the browser when connecting through this new role, and as expected you see the following:&lt;br&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_s7esWWJ3MeQEGjffDAyAQuxWxfjQwKoRzM8lqO-bYp9f4hGcX_cy7RK1BN8_ond7Q?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=211 alt="clip_image002" src="http://blufiles.storage.msn.com/y1pAEvk1empm_v8c-50sb7r7ItMHRG4BAxUnuYDaA6jWMoLVZctEljPJwSJEp_rhpoG6w9J4i9cs9M?PARTNER=WRITER" width=576 border=0&gt;&lt;/a&gt; &lt;li&gt;Now add the following assignment to the MDX Script:&lt;br&gt;([Date].[Calendar].[Month].&amp;amp;[2004]&amp;amp;[8])=[Date].[Calendar].[Month].&amp;amp;[2004]&amp;amp;[7]; &lt;li&gt;And refresh the query, so you see this:&lt;br&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_vlFpbzkeWk9cnfMli4_-rZ21XV3WNShNi1D7YXgtiOqw_R0p8YIEIPQKGmw-hZQ_E?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=207 alt="clip_image003" src="http://blufiles.storage.msn.com/y1pAEvk1empm_tL3BnBV02-BXh40ozJSwkBCY628rfUd8F0Yf_t0GORidUto4Am-nelgX4-oL_rnKc?PARTNER=WRITER" width=578 border=0&gt;&lt;/a&gt; &lt;li&gt;The big change is that the value for CY2004 and the All Member are now secured too. So we’re now in the situation where we’ve made an assignment that displays a value that wasn’t secured anyway, but we now can’t see the CY2004 value even though the expression in the Read permissions returns true. If you were to change the assignment so it refers to the value for January 2004, as follows:&lt;br&gt;([Date].[Calendar].[Month].&amp;amp;[2004]&amp;amp;[8])=[Date].[Calendar].[Month].&amp;amp;[2004]&amp;amp;[1];&lt;br&gt;You can see the January value either while looking at August or the ‘Show Internet Sales Amount’ calculated measure, as I would expect, because neither are aggregated from anything and the expression for the Read permission always returns True for them:&lt;br&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_tEVwjCD97V9PLgYZzyQSdZXs3CqlSvG6-xwJt354YlVfR_hlZMgRCofkO_o8kHyWw?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=190 alt="clip_image004" src="http://blufiles.storage.msn.com/y1pAEvk1empm_ubvum419yapN-BkCVeV9efkx_r9s2y7BS-tSXrfeeft8wgxLs081DHGvCcBHDw3Vw?PARTNER=WRITER" width=569 border=0&gt;&lt;/a&gt;&lt;/ul&gt; &lt;p&gt;For my customer, who is migrating from AS2005 SP1 direct to Katmai, this is potentially a major problem. And to be honest as my repro shows I don't think this new behaviour makes any sense at all anyway - if I wanted to use Read Contingent permissions I'd have used Read Contingent permissions!&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Cell+Security%3a+when+Read+permissions+are+actually+Read+Contingent&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1946.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1946.entry</guid><pubDate>Tue, 20 May 2008 16:59:16 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1946/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1946.entry#comment</wfw:comment><dcterms:modified>2008-05-20T16:59:16Z</dcterms:modified></item><item><title>SqlSpec</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1927.entry</link><description>&lt;p&gt;I've just come across SqlSpec from Elasoft (&lt;a title="http://www.elsasoft.org/" href="http://www.elsasoft.org/"&gt;http://www.elsasoft.org/&lt;/a&gt;) a tool that can create documentation for Analysis Services databases. You can see some sample output here:&lt;br&gt;&lt;a title="http://www.elsasoft.org/samples.htm" href="http://www.elsasoft.org/samples.htm"&gt;http://www.elsasoft.org/samples.htm&lt;/a&gt; &lt;p&gt;I've downloaded it and given it a quick try, and it seems to do the job pretty well. This is the second documentation tool for SSAS that I'm aware of, the other being &lt;a href="http://www.bidocumenter.com/Public/Default.aspx"&gt;BI Documenter&lt;/a&gt;. Which one is better? Well I guess it depends on what you want to do since the two tools support different data sources and have slightly different features (&lt;a title="http://www.elsasoft.org/compare.htm" href="http://www.elsasoft.org/compare.htm"&gt;http://www.elsasoft.org/compare.htm&lt;/a&gt; vs &lt;a title="http://www.bidocumenter.com/Public/Features.aspx" href="http://www.bidocumenter.com/Public/Features.aspx"&gt;http://www.bidocumenter.com/Public/Features.aspx&lt;/a&gt;). You can see sample output for BI Documenter here:&lt;br&gt;&lt;a title="http://www.bidocumenter.com/Public/SampleOutput.aspx" href="http://www.bidocumenter.com/Public/SampleOutput.aspx"&gt;http://www.bidocumenter.com/Public/SampleOutput.aspx&lt;/a&gt; &lt;p&gt;You pays your money, you takes your choice...&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+SqlSpec&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1927.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1927.entry</guid><pubDate>Thu, 15 May 2008 20:42:13 GMT</pubDate><slash:comments>8</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1927/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1927.entry#comment</wfw:comment><dcterms:modified>2008-05-15T20:42:13Z</dcterms:modified></item><item><title>Analysis Services Browser Views addin</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1905.entry</link><description>&lt;div&gt;Via &lt;a href="http://blogs.msdn.com/bimusings/default.aspx"&gt;Russell Christopher&lt;/a&gt;, news of a new addin for BIDS created by Yossi Elkayam and Eran Sagi of Microsoft Israel that allows you to save the Analysis Services queries created in the browser tab:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bei/archive/2008/04/25/analysis-services-browser-views-add-in.aspx"&gt;http://blogs.microsoft.co.il/blogs/bei/archive/2008/04/25/analysis-services-browser-views-add-in.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Looks very useful... Greg, Darren, perhaps this can be integrated with &lt;a href="http://www.codeplex.com/bidshelper"&gt;BIDS Helper&lt;/a&gt;?&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Analysis+Services+Browser+Views+addin&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1905.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1905.entry</guid><pubDate>Wed, 07 May 2008 11:33:02 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1905/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1905.entry#comment</wfw:comment><dcterms:modified>2008-05-07T11:33:02Z</dcterms:modified></item><item><title>Transact SQL Server Analysis Services Metadata</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1887.entry</link><description>&lt;div&gt;Via &lt;a href="http://www.ssas-info.com/"&gt;http://www.ssas-info.com/&lt;/a&gt; (which is a great site, if you haven't seen it then definitely check it out) I've just come across a new project on Codeplex that aims to allow you to browse and manage AS metadata through T-SQL from Leandro Tubia:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.codeplex.com/TSSASM"&gt;http://www.codeplex.com/TSSASM&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Kind of like what &lt;a href="http://www.codeplex.com/powerSSAS"&gt;Darren Gosbell's doing with Powershell&lt;/a&gt;, only for people who don't want to learn Powershell, and what &lt;a href="http://www.codeplex.com/ASStoredProcedures/Wiki/View.aspx?title=Discover&amp;amp;referringTitle=XmlaDiscover"&gt;Darren also did in the Analysis Services Stored Procedure Project &lt;/a&gt;but which the full flexibility of T-SQL. Nice idea; it's still early days for the project but I hope it develops.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Transact+SQL+Server+Analysis+Services+Metadata&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1887.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1887.entry</guid><pubDate>Thu, 01 May 2008 14:10:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1887/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1887.entry#comment</wfw:comment><dcterms:modified>2008-05-01T14:10:46Z</dcterms:modified></item><item><title>Things I'd like to see in Analysis Services 2011</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1877.entry</link><description>&lt;p&gt;It's that time in the release cycle. I know what the new features are going to be for Analysis Services (for a full list see &lt;a href="http://www.ssas2008-info.com/ssas-2008-change-summary"&gt;here&lt;/a&gt;) and it's rather like Boxing Day: I've just got my presents and I'm starting to wonder to what Santa will bring on his &lt;em&gt;next&lt;/em&gt; visit. And to a certain extent I'm feeling as though I should have been a bit more specific when I was writing my Christmas list last time, given that I'm a teeny bit underwhelmed by the features I did get in AS2008. So here, for the benefit of the elves working away in Redmond, is a list of things I'd love to see in Analysis Services 2011 or whatever it will be called: &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Auto-partitioning&lt;br&gt;&lt;/strong&gt;Building and maintaining partitions is a job that almost everyone needs to do and yet it's something that involves way too much hard work at the moment. As such it's an ideal candidate for some form of automation, and indeed a while back &lt;a href="http://blogs.conchango.com/jamiethomson/"&gt;Jamie Thomson&lt;/a&gt; posted the following suggestion on Connect: &lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=127378" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=127378"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=127378&lt;/a&gt;. Other possibilities include the use of data mining to determine how you should set the slices for your partitions (which I &lt;a href="http://cwebbbi.spaces.live.com/Blog/cns!1pi7ETChsJ1un_2s41jm9Iyg!348.entry"&gt;blogged about&lt;/a&gt; a long time ago) and something like the MDX driven auto-partitioning that &lt;a href="http://www.codeplex.com/ASStoredProcedures/Wiki/View.aspx?title=Partition&amp;amp;referringTitle=Home"&gt;Greg Galloway implemented for the Analysis Services Stored Procedure Project&lt;/a&gt;.  &lt;li&gt;&lt;strong&gt;Do away with the arbitrary shaped sets error&lt;br&gt;&lt;/strong&gt;This is a particular bugbear of mine. The more I work on cubes with complex calculations, the more I find that I want to scope calculations on arbitrary shaped sets, which of course I'm not allowed to do. That means I end up making several identical assignments to get the same result, which leads to way too much duplicate code and a maintenance nightmare. If I can break up an arbitrary shaped set into something acceptable to Analysis Services, why can't Analysis Services do this itself? Here's the Connect I logged on this: &lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=339861" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=339861"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=339861&lt;/a&gt; &lt;li&gt;&lt;strong&gt;Fix parent-child hierarchies&lt;br&gt;&lt;/strong&gt;Parent-child hierarchies are a pain. For a start they cause performance problems so what I would want to see is the ability for AS to create aggregations at intermediate levels in a parent-child hierarchy at the very least; I'm sure there are a lot of other potential engine improvements that could be made for them. Secondly, scoping calculations on them is a real nightmare and on a related note trying to use dimension security with them is an equally thankless task. Given that there are some situations where you have no option but to use them, I think some time needs to be invested in making them better.  &lt;li&gt;&lt;strong&gt;Build parallelism into the calculation engine&lt;br&gt;&lt;/strong&gt;What with all the block computation improvements in AS2008, I'm finding that many calculations are performing a lot better than in AS2005. However I'm still finding scenarios where the calculation engine is the bottleneck and just one CPU is being used on the server when I'm running a query (something I discussed &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1011.entry"&gt;here&lt;/a&gt;). Surely it's possible to get the calculation engine to do some calculations in parallel when a query is being run?  &lt;li&gt;&lt;strong&gt;Be able to rename attributes in role-playing dimensions&lt;br&gt;&lt;/strong&gt;If there was one feature I wanted to see in AS2008 it was this. It would have been so easy to do, I know loads of other people wanted it, and I did log it in Connect ages ago: &lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=144500" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=144500"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=144500&lt;/a&gt;. And it wasn't included. All I want to do is to be able to rename the individual attributes of a role-playing dimension instead of just being able to change the dimension name - for example if I have Order Date and Ship Date role-playing dimensions based on a single Date dimension, then I want my 'Calendar Date' hierarchy in Date to appear as 'Calendar Order Date' and 'Calendar Ship Date' to my end users. Not being able to do this has stopped me using role-playing dimensions on so many occasions simply because seeing multiple hierarchies with the same name is too confusing.  &lt;li&gt;&lt;strong&gt;Support for cross-dimensional user hierarchies&lt;br&gt;&lt;/strong&gt;Sometimes I find myself in the situation where I've got a large dimension, such as a Customer dimension, where the lower-level attributes are queried much less often than the higher level attributes. Now AS2005 handles large dimensions pretty well, in my experience, but it would still be useful to be able to store less useful lower-level attributes in ROLAP mode and more useful higher-level attributes in MOLAP mode. One solution to this could be the ability to set the storage mode on individual attributes rather than the whole dimension but I'm not sure that's practical; instead it would be great if you could split the attributes up into a ROLAP dimension and a MOLAP materialised reference dimension and be able to build a user hierarchy that spans both. So you'd be able to drill down from Country to City to Post Code to Customer, and when you were querying the first three levels you'd be hitting a MOLAP dimension and when you queried Customer you'd be hitting a different ROLAP dimension. In fact I'm sure the ability to set up cross-dimensional drill paths would be useful in other scenarios too and make cubes much easier to use.  &lt;li&gt;&lt;strong&gt;Support for partitioned dimensions&lt;br&gt;&lt;/strong&gt;Dimensions are getting bigger and bigger, and I wonder if at some stage it would be useful to be able to partition dimensions as well as measure groups to get better performance and manageability? Just a thought.  &lt;li&gt;&lt;strong&gt;Be able to manage unary operators and custom member formulas from the MDX Script&lt;br&gt;&lt;/strong&gt;Perhaps this is just me, but sometimes I find it's a bit of a pain when you're using unary operators and custom member formulas that their values have to be stored in the dimension table. Can't we have the option to be able to set or override a unary operator or custom member formula from the MDX Script - after all, that's meant to the one central repository for all my calculations. I wonder if this is possible anyway with an ALTER CUBE statement? Hmm, I don't think so. &lt;li&gt;&lt;strong&gt;New features for calculated members&lt;br&gt;&lt;/strong&gt;As I've mentioned &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1598.entry"&gt;here&lt;/a&gt; before, quite often I see people creating real members in dimensions then overwriting their values with scoped assignments when I'm sure they would be better off with using calculated members. So to meet that and other challenges, here's a list of things it would be cool to allow with calculated members:  &lt;ul&gt; &lt;li&gt;Allow calculated members to have other calculated members as children  &lt;li&gt;Be able to control where calculated members appear in a hierarchy  &lt;li&gt;Allow calculated members to have member properties, either returning static values or the results of MDX expressions  &lt;li&gt;Following on from that, if calculated members can have calculated member property values, real members should have that too. For example, on a Customer dimension I might know a date of birth but I might also want to be able to calculate a customer's age and show that as a property  &lt;li&gt;Following on from that, it would be great to be able to create entire hierarchies based on calculated members or properties. So if I can calculate a customer's age, and then have another calculated property that placed that customer into a bucket based on their age (eg 0-9, 10-19, 20-29 and so on), I'd also like to be able to determine the number of buckets based on some MDX as well (maybe using server parameters - see below) and create a user hierarchy where the top level would consist of calculated members representing these buckets and where I could drill down from these buckets to the individual ages and then down to the real customer members themselves.&lt;/ul&gt; &lt;li&gt;&lt;strong&gt;Server parameters for MDX calculations&lt;/strong&gt;&lt;br&gt;The ability to parameterise an MDX query is cool, but it would also be great if you could also parameterise calculations on the server. For example you could set up a kind of server-wide variable which was the rate of Income Tax, do calculations using that value and then allow users to have the option of changing its value and explore 'what-if' scenarios. This would clearly have an impact on AS's ability to cache calculations but so long as people knew about this then I'm sure it would be ok. These parameters would also be visible through the metadata so client tools would know to show users they could change them. &lt;li&gt;&lt;strong&gt;Be able to define either whole queries or 'selectable chunks' of MDX on the server&lt;br&gt;&lt;/strong&gt;After my &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1555.entry"&gt;posting on how dynamic sets actually work in AS2005&lt;/a&gt; a few months back, I got to thinking about why I was disappointed and what I really wanted to see. The problem is that however well you model your cube, and however easy-to-use your client tool is, there's always a gap between what the tools are capable of and what the user is able to accomplish with them. For example, you might know that your end users want to be able to create reports showing the top 10 customers with an extra value underneath that represents the aggregated values of all other customers outside the top ten. This is certainly possible in MDX and perhaps there are client tools out there that support this, but wouldn't it be cool if you could create this as a kind of pre-canned selection that was parameterisable (eg show the top 20 instead of the top 10, or show products not customers) and visible through the metadata so any client tool could display it to the end user and allow it to be used? This would be a selection that would be designed to work wherever the user placed it in his or her query; it's not the same thing as a dynamic set, more of a parameterisable custom set function. The concept could be extended from pre-canned selections to entire queries too - and if I haven't convinced you (or been entirely successful in explaining) the concept of pre-canned selections then I think the case for entire queries stored on the server is much easier to make. Again these would be parameterisable and discoverable through metadata, so that any client tool would (hopefully) be able to use them; for Reporting Services alone this would be extremely useful, so you could have one query displayed in many reports with a single point of maintenance. I'm sure there would also be an opportunity to introduce some performance benefits for these stored queries too, perhaps in terms of being able to cache entire cellsets rather than just the values of individual cells. &lt;li&gt;&lt;strong&gt;Better management tools for security&lt;br&gt;&lt;/strong&gt;As I mentioned before &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1563.entry"&gt;here&lt;/a&gt;, the tools we've got at the moment are not up to the task of managing large numbers of security roles and some serious work needs to be done in the UI. It would also be great if the tools supported dynamic security and the creation of all the supporting objects, perhaps through a wizard. &lt;li&gt;&lt;strong&gt;Better support for Analysis Services in SQL Management Studio&lt;br&gt;&lt;/strong&gt;This is an easy one to specify: I want all of the functionality in &lt;a href="http://sqlblog.com/blogs/mosha/archive/2007/09/18/announcing-mdx-studio-ctp1-v0-1-alpha.aspx"&gt;MDX Studio&lt;/a&gt; put into SQL Management Studio. And a hundred other little things, like in the metadata pane I want to be able to open a level and expand a member to drill down as well instead of always having to start at the All Member of a hierarchy; oh, and I'd like to have a Reconnect button for when I've got a query and I've killed my session because of cube changes, instead of having to disconnect and reconnect. And the ability to display... &lt;li&gt;&lt;strong&gt;Query execution plans&lt;br&gt;&lt;/strong&gt; A lot of people have been asking for this already; here's the Connect: &lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321161" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321161"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=321161&lt;/a&gt;. This would be soooo useful in performance tuning. &lt;li&gt;&lt;strong&gt;Support for other RDBMSs&lt;br&gt;&lt;/strong&gt;Analysis Services is useful not only as a database engine in its own right, but as a query/calculation layer on top of other database engines. OK no-one uses ROLAP on SQL Server because performance is rubbish compared to MOLAP, but for years people have been experimenting with using AS in ROLAP mode on top of Teradata (see here) and I'm sure that it could be used in a similar way on top of other data warehouse appliances or the new generation of COP databases like Vertica. You'd be selling it as a way of OLAP-ifying these databases, getting the incredible scalability and performance they (allegedly) offer in combination with the power of MDX for calculations and access to the data via Excel. Writing new cartridges for these databases should be pretty easy; I suppose the problem comes with trying to generate SQL optimised for each of these platforms. &lt;li&gt;&lt;strong&gt;Writeback with no allocation&lt;/strong&gt;&lt;br&gt;MOLAP writeback in AS2008 certainly does improve performance, but the need always to allocate your values down to the granularity of the fact table is always going to lead to a performance hit. Wouldn't it be useful if you could write a value back to a cell without having to allocate it down always? You'd get instant writeback. I'm sure that would be useful in many cases, and in fact it would work in the same way as if you'd assigned a value to that cell in the MDX Script. I wrote some code in the &lt;a href="http://www.codeplex.com/ASStoredProcedures"&gt;Analysis Services Stored Procedure Project&lt;/a&gt; that did this, in fact, although it wasn't really anything more than a proof-of-concept exercise. &lt;/ul&gt; &lt;p&gt;Anyway, this post has gone on quite long enough now, although I'm sure if I thought about it I could go on for even longer. I need to do some work! But what would you like to see in Analysis Services 2011? Answers in a comment, please...&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Things+I'd+like+to+see+in+Analysis+Services+2011&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1877.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1877.entry</guid><pubDate>Wed, 30 Apr 2008 15:33:52 GMT</pubDate><slash:comments>19</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1877/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1877.entry#comment</wfw:comment><dcterms:modified>2008-04-30T15:33:52Z</dcterms:modified></item><item><title>ASCMD Beta</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1847.entry</link><description>&lt;div&gt;Dave Wickert of Microsoft has asked me to relay the following message about a new version of ascmd he's working on:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt;“In preparation of SQL Server 2008 Analysis Services RTM’ing, I am starting a small beta program for the next version of ‘ascmd’. This version will have two important new features:&lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt 36pt;text-indent:-18pt"&gt;&lt;font color="#000000"&gt;&lt;em&gt;&lt;font size=2&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;font face=Calibri&gt;1)&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face=Calibri&gt;Built and verified against Analysis Services 2008 – but also directly compatible with AS2K5 – thus I need both AS2K8 and AS2K5 participates.&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt 36pt;text-indent:-18pt"&gt;&lt;font color="#000000"&gt;&lt;em&gt;&lt;font size=2&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;font face=Calibri&gt;2)&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face=Calibri&gt;New multi-user capabilities – the Microsoft SQLCAT team uses ascmd as the multi-user load facility for its Analysis Services benchmarks. Ever want to load up a few hundred users against a SSAS server? We are going to be retrofitting those capabilities (plus a few others) back into the released version of ascmd.&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt; &lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt;I am looking for users to test out this new version: 1) to, at least, slipstream this version into their current use to see if we’ve broken anything (we don’t think so, but we want to fix anything if we did), and 2) test out the new features if you can. &lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt; &lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font color="#000000"&gt;&lt;font face=Calibri&gt;&lt;em&gt;&lt;font size=2&gt;&lt;u&gt;We are also actively soliciting new features and improvements for ascmd at this time&lt;/u&gt; – if we can sneak them in, we will.&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt; &lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt;The “readme” for the current version of ascmd is located here: &lt;/em&gt;&lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms365187.aspx"&gt;&lt;u&gt;&lt;font face=Calibri color="#0000ff" size=2&gt;&lt;em&gt;http://msdn2.microsoft.com/en-us/library/ms365187.aspx&lt;/em&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt; &lt;/em&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt"&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt;If you are an avid user of ascmd and would like to be included in this beta, please contact me directly (&lt;/em&gt;&lt;/font&gt;&lt;a href="mailto:dwickert@microsoft.com"&gt;&lt;u&gt;&lt;font face=Calibri color="#0000ff" size=2&gt;&lt;em&gt;dwickert@microsoft.com&lt;/em&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font face=Calibri color="#000000" size=2&gt;&lt;em&gt;).”&lt;/em&gt;&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+ASCMD+Beta&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1847.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1847.entry</guid><pubDate>Sat, 19 Apr 2008 11:01:44 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1847/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1847.entry#comment</wfw:comment><dcterms:modified>2008-04-19T11:01:44Z</dcterms:modified></item><item><title>Panorama, Google and Analysis Services Support</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1845.entry</link><description>&lt;p&gt;New developments on the Panorama/Google front: users of Panorama's pivot table for Google docs will be able to connect direct to Analysis Services via http (if they want to pay) and also upload local cube files and query them (which will be free). Here's the announcement:&lt;br&gt;&lt;a title="http://www.panorama.com/news/news/archives/2008/apr-17-2008.html" href="http://www.panorama.com/news/news/archives/2008/apr-17-2008.html"&gt;http://www.panorama.com/news/news/archives/2008/apr-17-2008.html&lt;/a&gt;
&lt;p&gt;This comes hot on the heels of Google's Salesforce link-up:&lt;br&gt;&lt;a href="http://blogs.salesforce.com/blogs/2008/04/announcing-sale.html"&gt;http://blogs.salesforce.com/blogs/2008/04/announcing-sale.html&lt;/a&gt;
&lt;p&gt;They're slowly joining the dots...
&lt;p&gt;I was asked not to talk about this until the press release went out, but then I found that Nigel Pendse has already beaten me to it and done an excellent job of summing everything up:&lt;br&gt;&lt;a title="http://www.olapreport.com/Comment_Panorama_Google.htm" href="http://www.olapreport.com/Comment_Panorama_Google.htm"&gt;http://www.olapreport.com/Comment_Panorama_Google.htm&lt;/a&gt; 
&lt;p&gt;I agree with Nigel that I don't think there will be many people &lt;em&gt;at the moment&lt;/em&gt; who will be willing to expose their SSAS server via http. However there are a small number of companies who provide hosted SSAS solutions and this I think will become a much more popular option over the coming years. I do think, though, that the local cube option has some very interesting possibilities especially because it's free. I can imagine it would be a great way of distributing data to disconnected employees like salespeople, or to partners, for small companies on a tight budget. &lt;a href="http://biperformance.spaces.live.com/"&gt;Tim Peterson&lt;/a&gt; must be pleased - this should cause a resurgence of interest in local cubes.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Panorama%2c+Google+and+Analysis+Services+Support&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1845.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1845.entry</guid><pubDate>Sat, 19 Apr 2008 06:35:14 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1845/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1845.entry#comment</wfw:comment><dcterms:modified>2008-04-19T07:08:44Z</dcterms:modified></item><item><title>There will be a SQL2005 SP3!</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1806.entry</link><description>&lt;div&gt;A triumph for people power! Microsoft have announced that there will be a SP3 for SQL2005 and it will be delivered this calendar year. More details here:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://blogs.technet.com/dataplatforminsider/archive/2008/04/15/sql-server-2005-sp3-coming-soon.aspx"&gt;http://blogs.technet.com/dataplatforminsider/archive/2008/04/15/sql-server-2005-sp3-coming-soon.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;There's also been yet another cumulative update released, CU7:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://support.microsoft.com/kb/949095/en-us"&gt;http://support.microsoft.com/kb/949095/en-us&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;UPDATE: there's a blog entry from the guys in PSS on how CU7 changes what happens when backups and processing overlap, here:&lt;br&gt;&lt;a href="http://blogs.msdn.com/psssql/archive/2008/04/16/analysis-services-changes-introduced-in-cu-7-may-impact-backups.aspx"&gt;http://blogs.msdn.com/psssql/archive/2008/04/16/analysis-services-changes-introduced-in-cu-7-may-impact-backups.aspx&lt;/a&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+There+will+be+a+SQL2005+SP3!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1806.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1806.entry</guid><pubDate>Wed, 16 Apr 2008 14:45:42 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1806/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1806.entry#comment</wfw:comment><dcterms:modified>2008-04-16T20:47:44Z</dcterms:modified></item><item><title>Monitoring examples from Richard Lees</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1762.entry</link><description>&lt;div&gt;Continuing the theme of monitoring AS and other applications, I've just come across some of the great live demos Richard Lees has on his site. For example, here are some details on a cube built from Perfmon data:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://richardlees.com.au/Pages/PerfmonCube.aspx"&gt;http://richardlees.com.au/Pages/PerfmonCube.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;...and you can see it in action, in a live PerformancePoint dashboard showing SQL and Analysis Services counters here:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://richardlees.com.au/sites/Demonstrations/Shared Documents/SQL Server Database and OLAP Activity/SQL Server Database Activity and Health.aspx"&gt;http://richardlees.com.au/sites/Demonstrations/Shared%20Documents/SQL%20Server%20Database%20and%20OLAP%20Activity/SQL%20Server%20Database%20Activity%20and%20Health.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;There's also an Excel Services pivot table querying the same cube here:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://richardlees.com.au/sites/Demonstrations/Pages/ExcelServices.aspx"&gt;http://richardlees.com.au/sites/Demonstrations/Pages/ExcelServices.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Monitoring+examples+from+Richard+Lees&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1762.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1762.entry</guid><pubDate>Fri, 28 Mar 2008 12:15:27 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1762/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1762.entry#comment</wfw:comment><dcterms:modified>2008-03-28T12:15:27Z</dcterms:modified></item><item><title>SSAS Monitoring Sample App</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1760.entry</link><description>&lt;div&gt;After my moan the other week about the lack of monitoring tools for the Microsoft BI stack, Carl Rabeler of the &lt;a href="http://sqlcat.com/"&gt;SQLCat&lt;/a&gt; team contacted me with news of a whole load of new, related samples that he and his colleagues have been working on. Most relevant is a sample app for capturing SSAS trace information, storing it in SQL Server then using SSRS to report on it:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://sqlcat.com/toolbox/archive/2008/03/24/sql-server-analysis-services-performance-monitoring-and-visualization-methodology.aspx"&gt;http://sqlcat.com/toolbox/archive/2008/03/24/sql-server-analysis-services-performance-monitoring-and-visualization-methodology.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;I know several people have already done something similar (a friend of mine, Hugo Lopes, told me he'd done the same thing only gone the exta step of putting the data into a cube) and hopefully now all this is in Codeplex the community can pul together and develop it into something more sophisticated.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;There are also some sample Powershell scripts for querying SSAS008 DMVs:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://sqlcat.com/toolbox/archive/2008/03/24/powershell-scripts-for-sql-server-2008-analysis-services-dmvs.aspx"&gt;http://sqlcat.com/toolbox/archive/2008/03/24/powershell-scripts-for-sql-server-2008-analysis-services-dmvs.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+SSAS+Monitoring+Sample+App&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1760.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1760.entry</guid><pubDate>Tue, 25 Mar 2008 07:16:43 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1760/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1760.entry#comment</wfw:comment><dcterms:modified>2008-03-25T07:16:43Z</dcterms:modified></item><item><title>Visualising Analysis Services Trace Information in Reporting Services</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1660.entry</link><description>&lt;p&gt;More fun with Reporting Services. The other week I was working with a customer who I suspected was experiencing query performance problems as a result of the issue described here: &lt;p&gt;&lt;a title="http://blogs.msdn.com/sqlcat/archive/2007/10/19/ssas-small-big-query-interaction.aspx" href="http://blogs.msdn.com/sqlcat/archive/2007/10/19/ssas-small-big-query-interaction.aspx"&gt;http://blogs.msdn.com/sqlcat/archive/2007/10/19/ssas-small-big-query-interaction.aspx&lt;/a&gt; &lt;p&gt;Certainly in Profiler I could see some fairly trivial queries which were taking much longer than they should have done, and which when I ran them on a test system ran much faster. And certainly when I ran a 'big query' and a 'small query' simultaneously I saw the 'small query' run slow, and when I got the secret ini file settings from PSS my 'small queries' ran much faster. But there was still some doubt in my mind over the extent to which the customer was suffering this problem - just by looking at my Profiler traces from the Production servers I couldn't tell whether lots of small queries were overlapping with the big queries. &lt;p&gt;What I then thought was that it would be useful to be able to visualise the information from a Profiler trace in some way. I did some experiments with different chart types and different tools, mainly Excel 2007, but in the end I went with Reporting Services 2005 and the Dundas Gantt chart control. I'm not sure whether the Gantt chart has made it into the current RS2008 CTP but I guess it will soon if it hasn't; in any case the data was coming from a 2005 system so that's what I used. &lt;p&gt;The first step was to get the data out of Profiler into some useful format; the easiest way turned out to be to get Profiler to output directly to a SQL Server table and for the problem here all I needed was the Query End events, and specifically the Duration, SPID, TextData, ConnectionID, EndTime, EventClass, EventSubClass, and NTCanonicalUserName columns. I could now run my Profiler trace against the Production system and capture some data. The next problem was to manipulate the data into a useable format. Gantt charts need a start time and a duration for each event and the problem with trace data is that you only know how long something takes when it's finished, ie when you have an 'End' event. Subtracting the EndTime from the duration gives the derived start time of the event, which is one way of dealing with the problem of working out when queries started and finished. There are Query Begin and Query End events and perhaps another, better, solution would have relied on the knowledge that you can only have one query executing on any given session at any one time and matching, so it should be possible to match each Query End event to a Query Begin event. In fact I started off more ambitiously by including other types of events, such a Progress Reports, but the problem here I found was that the StartTimes and EndTimes given by Profiler were rounded to the nearest second which meant that subtracting the Duration from the EndTime didn't give accurate derived start times and I was finding events were coming out in what was clearly the wrong order when I tried to order them by derived Start Time (some of the SQL I'll give below is more complex than necessary for just the Query End event because it was written for these other event types too). It would be nice to visualise the various internal events that are generated when you run an individual query, such as reads from partition and cache, but I need to do some more work before that's possible. &lt;p&gt;Anyway, with my Query End events I wrote the following SQL query to use in Reporting Services which finds the derived start time for each query, then makes the first query to start at time 0 and calculates all other derived start times relative to that first query. As always I need to apologise for my SQL in advance: &lt;p&gt;with RelativeStartTimes (OriginalRowNumber, RelativeStartTime, EventClass, DurationMSecs&lt;br&gt;, TextData, ConnectionID, EventSubClass, NTCanonicalUserName)&lt;br&gt;as&lt;br&gt;(&lt;br&gt;select &lt;br&gt;a.Rownumber,&lt;br&gt;--Find the Relative Start Time of each event&lt;br&gt;--by finding the difference in seconds between the End Time&lt;br&gt;--of the event and the Earliest End Time in ms&lt;br&gt;--then subtracting the Duration&lt;br&gt;(datediff(ss,&lt;br&gt;c.EarliestEnd,&lt;br&gt;isnull(a.EndTime, a.StartTime)&lt;br&gt;) * 1000) - isnull(a.Duration, 0) as RelativeStartTime,&lt;br&gt;a.EventClass,&lt;br&gt;isnull(a.duration, 0) as DurationMSecs,&lt;br&gt;a.TextData,&lt;br&gt;a.ConnectionID,&lt;br&gt;a.EventSubclass,&lt;br&gt;a.NTCanonicalUserName&lt;br&gt;from dbo.[102QE] a cross join &lt;br&gt;--Get the earliest End Time in the Trace&lt;br&gt;(select min(isnull(b.EndTime, b.StartTime)) as EarliestEnd &lt;br&gt;from dbo.[102QE] b&lt;br&gt;where b.Rownumber&amp;gt;0&lt;br&gt;) c&lt;br&gt;where a.Rownumber&amp;gt;0&lt;br&gt;)  &lt;p&gt;select&lt;br&gt;row_number() over(order by (r.RelativeStartTime - x.EarliestRelStartTime) asc) as row,&lt;br&gt;r.OriginalRowNumber,&lt;br&gt;r.RelativeStartTime,&lt;br&gt;x.EarliestRelStartTime,&lt;br&gt;r.RelativeStartTime - x.EarliestRelStartTime as BeginTime,&lt;br&gt;r.RelativeStartTime - x.EarliestRelStartTime + r.DurationMSecs as EndTime,&lt;br&gt;r.EventClass,&lt;br&gt;r.DurationMSecs,&lt;br&gt;r.TextData,&lt;br&gt;r.ConnectionID,&lt;br&gt;r.EventSubclass,&lt;br&gt;r.NTCanonicalUserName&lt;br&gt;from RelativeStartTimes r&lt;br&gt;cross join&lt;br&gt;(--Find the Earliest Relative Start Time&lt;br&gt;select &lt;br&gt;min(RelativeStartTimes.RelativeStartTime) as EarliestRelStartTime from &lt;br&gt;RelativeStartTimes) x &lt;p&gt;I could then use this as the basis for my Reporting Services report. As always with these things I spent most of my time working out how to use the Gantt chart but when I did, and after I'd done some other funky stuff that allowed me to filter by row number and start/end time, and click on an item in the Gantt chart to view the MDX for the query that a particular line represented, I got a report looking like this: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_uYQIMu0udbLmnXf-hE3maX5k1A_bQtXzhkbCIXqsFvZoJAH_yOGeiLtyVJtnwoXrs?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=529 alt=Gannt1 src="http://v2s0da.blu.livefilestore.com/y1pcy1c4uTfV9YclI29GUvoaiVBzFV7v_1fKLUfTp8kZF1mQg2g7arqEjUuEFmHJvhy-_9NFLw7xnJmvmnO-DLGfQ?PARTNER=WRITER" width=607 border=0&gt;&lt;/a&gt;  &lt;p&gt;Another problem to mention here is that, as with this report, when you've got a lot of queries to look at the Gantt chart takes a loooooong time to render. Anyway, from this initial view you can see that almost all queries executed very quickly but fairly early on there was a very long query, represented by the longish brown line at around event 250 that I've circled. Filtering the view down to show this query and those around it in more detail gets you this: &lt;p&gt;&lt;a href="http://v2s0da.blu.livefilestore.com/y1pRnoSuVBazAZxopAniM-uSzbiWtE6Da6GEVBk4b2kMFe2P_UhDCIVHbUsd9oUBuXRNywraxX7AXuYID5XRQylotMK9cwwtFBA?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=466 alt=gantt2 src="http://v2s0da.blu.livefilestore.com/y1pcy1c4uTfV9b795kd3pvxWWmhRM75aaerHW-yY0j7DXC8XHyFL-tI32diJSziVieYryEHdJ5xt-FP_oKNNy1mtQ?PARTNER=WRITER" width=608 border=0&gt;&lt;/a&gt;  &lt;p&gt;Although the vast majority of queries here execute immediately (they're just small queries the front end uses to retrieve metadata etc and are represented as single blobs) I've circled a few queries around the main query that look like they are taking a few seconds to run. And indeed, running at least one of these queries on the test server showed it runs faster on its own than it did when this Profiler trace was running. Which proved my point. &lt;p&gt;Moving away from this particular exercise, I'm fairly surprised that none of the big SQL Server tool vendors have tackled the problem of monitoring Analysis Services performance and activity. The only tool I know of that does this is Companion for Analysis Services: &lt;p&gt;&lt;a title="http://www.sqlminds.com/Products/CompanionforMSAnalysisServer/tabid/119/Default.aspx" href="http://www.sqlminds.com/Products/CompanionforMSAnalysisServer/tabid/119/Default.aspx"&gt;http://www.sqlminds.com/Products/CompanionforMSAnalysisServer/tabid/119/Default.aspx&lt;/a&gt; &lt;p&gt;Where are the others though? I would have though Analysis Services would be the obvious next step for them, given that many SQL Server relational shops also use the MS BI stack too. Whenever I talk to enterprise customers they always ask me what tools are available, certainly... I guess there's three things going on here: first of all the all-too-common ignorance of Analysis Services in the wider SQL Server community; second the problem that no-one (not even the SSAS experts) has really sat down and thought about what needs to be monitored in an Analysis Services deployment; and thirdly, at least before AS2008, the hooks for getting at data that can be used for monitoring either haven't been available or have been well hidden. This and &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1652.entry"&gt;my last post on viewing and killing queries in Reporting Services&lt;/a&gt; have given a few ideas on what's possible, though, and hopefully within the next few years Microsoft and/or third party vendors will give us the tools we need.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Visualising+Analysis+Services+Trace+Information+in+Reporting+Services&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1660.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1660.entry</guid><pubDate>Tue, 18 Mar 2008 17:10:16 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1660/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1660.entry#comment</wfw:comment><dcterms:modified>2008-03-18T17:10:16Z</dcterms:modified></item><item><title>Killing Queries From Reporting Services</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1652.entry</link><description>&lt;p&gt;I guess anyone who has had to demo the new DMVs in Analysis Services 2008 has, like me, put together a few Reporting Services reports to show off what they can do. Now I don't have anything much to add about the content of the DMVs and schema rowsets beyond what &lt;a href="http://geekswithblogs.net/darrengosbell/archive/2008/02/21/ssas-2008-whats-new-in-the-schema-rowsets.aspx"&gt;Darren&lt;/a&gt; and &lt;a href="http://www.ssas-info.com/VidasMatelisBlog/39_katmai-analysis-services-2008-november-ctp5-tests-on-metadata-rowsets#more-39"&gt;Vidas&lt;/a&gt; have already blogged, but I did discover an interesting trick while I was creating my reports that I thought would be good to share. &lt;p&gt;One of my example reports was displaying the results of the following DMV query: &lt;p&gt;select * from $system.discover_commands &lt;p&gt;What this does is display information on currently executing command or the last command that executed on every open session on the server (see &lt;a href="http://msdn2.microsoft.com/en-us/library/bb934103(SQL.100).aspx"&gt;here&lt;/a&gt; for more details). Pretty useful information in that if someone is running the query from hell on your AS server you'll be able to see it here; what you'd really want to do though is act on this information and be able to kill the query. You can certainly get the same information and can kill the query if you're using the Activity Viewer sample app that comes with the SQL Server samples (Jesse Orosz blogged about its features and shortcomings &lt;a href="http://jesseorosz.spaces.live.com/blog/cns!E322FD91218E57CF!198.entry"&gt;here&lt;/a&gt;); but can you do the same thing from within Reporting Services without writing any code? It turns out you can. &lt;p&gt;Here's what my report looks like in BIDS 2008: &lt;p&gt;&lt;a href="http://v2s0da.blu.livefilestore.com/y1pcy1c4uTfV9ZYKCZwSl6NGmkUhjNvsERx9ioyFppHLwPujy5ONkT0CHaiN7qU13YumNn0eGBHuq18FzRgtQV32w?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=223 alt=DMV1 src="http://v2s0da.blu.livefilestore.com/y1pcy1c4uTfV9ZVTy9aDU3_g3lwLpW74ojShXKtszFQGVmuHg8NmAboX9_yF5uvCKewk8YRQOoK1uttxiir9cUDEQ?PARTNER=WRITER" width=608 border=0&gt;&lt;/a&gt;  &lt;p&gt;So far, so straightforward. Notice the column on the far right that contains the text &amp;quot;Kill This&amp;quot;: this is static text and is a link to another report which takes one parameter, the SPID of the session that represents the current row. When you click on this link you jump to another report and it's the act of running this report that kills the query on the session whose SPID you pass in. This second report looks like this in BIDS: &lt;p&gt;&lt;a href="http://v2s0da.blu.livefilestore.com/y1pRnoSuVBazAZgdSPwA1VRyYq8hPmvTRgzejqFfZXNC5YgvyevtqXfg3JDsq6Zi-rY3WdCtQ9Kwpp0X4RbwMrN0h6hpbtmokEH?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=214 alt=DMV2 src="http://v2s0da.blu.livefilestore.com/y1pcy1c4uTfV9ZiIEKnZJpdPBL-NkJfFMIl9mdVBVSrzC3Q_YsywgL6VGhaqD8bMPzrsKUIk25vIOgud0fRW802GA?PARTNER=WRITER" width=613 border=0&gt;&lt;/a&gt;  &lt;p&gt;You'll see that the design surface of the report contains a single text box with the message that your query has been killed successfully. The killing is done by the query in the sole dataset, and the query is generated by a Reporting Services expression that looks like this: &lt;p&gt;&lt;strong&gt;=&amp;quot;&amp;lt;Cancel xmlns=&amp;quot;&amp;quot;&lt;/strong&gt;&lt;strong&gt;http://schemas.microsoft.com/analysisservices/2003/engine&amp;quot;&amp;quot;&lt;/strong&gt;&lt;strong&gt;&amp;gt;&lt;br&gt;  &amp;lt;SPID&amp;gt;&amp;quot; + Parameters!SPID.Value.ToString() + &amp;quot;&amp;lt;/SPID&amp;gt;&lt;br&gt;&amp;lt;/Cancel&amp;gt;&amp;quot;&lt;/strong&gt; &lt;p&gt;It's an XMLA Cancel command with the SPID injected into it from the report parameter mentioned above. Two things to know to make it work: &lt;ol&gt; &lt;li&gt;You have to execute it on an OLEDB-type connection, ie not Reporting Services' &amp;quot;Analysis Services&amp;quot; connection &lt;li&gt;The command doesn't return any data and RS expects all its datasets to return at least one field. To work around this, you need to create a new dummy calculated field on the dataset that returns any value you like (you may see some error messages along the way but they can safely be ignored):&lt;/ol&gt; &lt;p&gt;&lt;a href="http://blu1.storage.msn.com/y1pc4kFTqwRzpXJLdwFjiVIGnseycn2OpsvKeTPwWV3lZc2Hj6wJAmgM7I7N_jhasO3RWl2Y3iGA1jViMIMGHNt7bDhACWjfmz3?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=589 alt=DMV3 src="http://v2s0da.blu.livefilestore.com/y1pcy1c4uTfV9b6Wu5a4dlIbH6NWdsRjJBxEvaDGFcgKQa_KZAlQVy_wN4SeeKK3YUfjyjLu95DR9YhmrA6V_MDBw?PARTNER=WRITER" width=601 border=0&gt;&lt;/a&gt;  &lt;p&gt;And bingo, you've got a basic activity monitor implemented in RS2008! I haven't tested it, but you should be able to do exactly the same thing in RS2005 if you use the functionality in the &lt;a href="http://www.codeplex.com/ASStoredProcedures/Wiki/View.aspx?title=XmlaDiscover&amp;amp;referringTitle=Home"&gt;XMLADiscover&lt;/a&gt; class Darren put into the Analysis Services Stored Procedure Project; the reason I like the approach I've just described more than this option is that whenever I've wanted to use some ASSP functionality in a production environment the customer has, for obvious reasons, not been comfortable uploading a dll onto their server.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Killing+Queries+From+Reporting+Services&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1652.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1652.entry</guid><pubDate>Fri, 14 Mar 2008 23:39:41 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1652/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1652.entry#comment</wfw:comment><dcterms:modified>2008-03-14T23:39:41Z</dcterms:modified></item><item><title>Analysis Services and Trimming</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1611.entry</link><description>&lt;p&gt;Interesting post here on the PSS SQL Server Engineers blog on SQL Server working set trim problems:&lt;br&gt;&lt;a href="http://blogs.msdn.com/psssql/archive/2008/03/03/sql-server-working-set-trim-problems-consider.aspx"&gt;http://blogs.msdn.com/psssql/archive/2008/03/03/sql-server-working-set-trim-problems-consider.aspx&lt;/a&gt; 
&lt;p&gt;There's also a related KB article here:&lt;br&gt;&lt;a title="http://support.microsoft.com/default.aspx/kb/938486" href="http://support.microsoft.com/default.aspx/kb/938486"&gt;http://support.microsoft.com/default.aspx/kb/938486&lt;/a&gt;&lt;br&gt;And a representative blog entry on the subject here:&lt;br&gt;&lt;a title="http://weblogs.asp.net/omarzabir/archive/2007/10/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx" href="http://weblogs.asp.net/omarzabir/archive/2007/10/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx"&gt;http://weblogs.asp.net/omarzabir/archive/2007/10/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx&lt;/a&gt; 
&lt;p&gt;I'm working with a customer where PSS think this is happening with Analysis Services. Certainly Perfmon shows some massive drops in memory usage for no obvious reason (ie the system is nowhere near the LowMemoryLimit). Something to look out for... I'll post more details if/when I get them.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Analysis+Services+and+Trimming&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1611.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1611.entry</guid><pubDate>Mon, 03 Mar 2008 19:52:07 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1611/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1611.entry#comment</wfw:comment><dcterms:modified>2008-03-04T14:25:59Z</dcterms:modified></item><item><title>Using Non_Empty_Behavior With YTD calculations</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1607.entry</link><description>&lt;p&gt;I always believe in giving credit where credit's due, and before I go on with this blog entry I have to declare that this isn't my idea. I heard about the general approach from Eric Jacobsen (or possibly Richard Tkachuk) at the BI Conference last year and he said it originally came from &lt;a href="http://schastar.spaces.live.com/"&gt;Thomas Kejser&lt;/a&gt; who is now on the &lt;a href="http://sqlcat.com/"&gt;SQLCat&lt;/a&gt; team; I'll be working with him on a project fairly soon so I'll ask him about it! I've not actually seen it implemented or written about anywhere though, and since I've only just got around to testing it out and seen how useful it can be I thought I'd blog about it. 
&lt;p&gt;Let's start by taking a look at the following Adventure Works query: 
&lt;p&gt;with member measures.ytdsales as&lt;br&gt;sum(&lt;br&gt;periodstodate([Date].[Calendar].[Calendar Year],[Date].[Calendar].currentmember)&lt;br&gt;, [Measures].[Internet Sales Amount])&lt;br&gt;&lt;br&gt;select {[Date].[Calendar].[Month].&amp;amp;[2003]&amp;amp;[12].children} on 0,&lt;br&gt;non empty&lt;br&gt;[Customer].[Customer Geography].[Customer].members&lt;br&gt;*&lt;br&gt;[Promotion].[Promotion].[Promotion].members&lt;br&gt;on 1&lt;br&gt;from [adventure works]&lt;br&gt;where(measures.ytdsales, [Product].[Subcategory].&amp;amp;[2]) 
&lt;p&gt;It runs in 1 minute 10 seconds on my laptop and returns 33 columns and 2585 rows. YTD calculations are now very efficient in AS2005 SP2 and as far as I can see the real cause of the problem is the extremely large crossjoin on rows and the associated non empty. Relatively few customers actually bought anything in 2003 in this particular subcategory and when they did it was usually associated with no discount, so there's a lot of empty tuples that we are going to need to remove on rows; but in order to be able to filter them out, at the moment, we have to calculate the ytd sales for every single one of them. Now if we had control over the MDX of this query we could probably do some clever stuff with the NonEmpty function that would improve performance a lot, but what if users are querying with an ad hoc tool like Excel or Proclarity? It would be nice if we could set the Non_Empty_Behavior property on this calculated member, but that involves having a real measure on the cube whose value is null when ytd sales is null, and we don't have one of those... 
&lt;p&gt;So why don't we build one? In fact it's much easier to do this than you think especially when you remember that we're not interested in the value of this measure at all, just whether it's null or not. What we need to do is take our existing fact table, do a group by to find the minimum date for every key combination and then generate a row in the new fact table from that date to the end of the year. So to take a simplified example if you had a fact table with two dimensions, Product and Time, and the granularity of Time was Month, you would start with this: 
&lt;table cellspacing=0 cellpadding=2 width=400 border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=top width=133&gt;&lt;strong&gt;Product&lt;/strong&gt; 
&lt;td valign=top width=133&gt;&lt;strong&gt;Time&lt;/strong&gt; 
&lt;td valign=top width=133&gt;&lt;strong&gt;Sales&lt;/strong&gt; 
&lt;tr&gt;
&lt;td valign=top width=133&gt;Apples 
&lt;td valign=top width=133&gt;October 
&lt;td valign=top width=133&gt;100 
&lt;tr&gt;
&lt;td valign=top width=133&gt;Oranges 
&lt;td valign=top width=133&gt;November 
&lt;td valign=top width=133&gt;150&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;and want to get to this: 
&lt;table cellspacing=0 cellpadding=2 width=361 border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=top width=198&gt;&lt;strong&gt;Product&lt;/strong&gt; 
&lt;td valign=top width=161&gt;&lt;strong&gt;Time&lt;/strong&gt; 
&lt;tr&gt;
&lt;td valign=top width=219&gt;Apples 
&lt;td valign=top width=169&gt;October 
&lt;tr&gt;
&lt;td valign=top width=224&gt;Apples 
&lt;td valign=top width=172&gt;November 
&lt;tr&gt;
&lt;td valign=top width=225&gt;Apples 
&lt;td valign=top width=173&gt;December 
&lt;tr&gt;
&lt;td valign=top width=224&gt;Oranges 
&lt;td valign=top width=174&gt;November 
&lt;tr&gt;
&lt;td valign=top width=224&gt;Oranges 
&lt;td valign=top width=174&gt;December&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Here's a SQL query which does just that for the FactInternetSales fact table in Adventure Works DW: 
&lt;p&gt;select &lt;br&gt;f.ProductKey, f.DueDateKey, f.ShipDateKey,&lt;br&gt;f.CustomerKey, f.PromotionKey, f.CurrencyKey, f.SalesTerritoryKey, &lt;br&gt;c.TimeKey, f.SalesOrderNumber, f.SalesOrderLineNumber&lt;br&gt;from &lt;br&gt;(select i.ProductKey, i.DueDateKey, i.ShipDateKey,&lt;br&gt;i.CustomerKey, i.PromotionKey, i.CurrencyKey, i.SalesTerritoryKey&lt;br&gt;, i.SalesOrderNumber, i.SalesOrderLineNumber&lt;br&gt;, min(i.OrderDateKey) as mindate, t.CalendarYear&lt;br&gt;from &lt;br&gt;dbo.FactInternetSales i inner join dbo.DimTime t &lt;br&gt;on i.orderdatekey = t.timekey&lt;br&gt;--where SalesOrderNumber='SO43701'&lt;br&gt;group by t.CalendarYear, i.ProductKey, i.DueDateKey, i.ShipDateKey,&lt;br&gt;i.CustomerKey, i.PromotionKey, i.CurrencyKey, i.SalesTerritoryKey, i.SalesOrderNumber, i.SalesOrderLineNumber) f&lt;br&gt;inner join&lt;br&gt;DimTime c on f.CalendarYear = c.CalendarYear&lt;br&gt;and f.mindate&amp;lt;=c.TimeKey 
&lt;p&gt;You'll have to excuse my SQL - it's pretty ropey - but even though I'm sure this could be optimised it still runs very quickly; if you uncomment that line with the where clause in the middle, so the table is filtered down to one SalesOrderNumber, you'll see what it's doing more easily. Now you'll probably be worried, quite rightly, that doing this creates a fact table that's much larger than your original fact table and that's certainly true. In this case FactInternetSales is just over 60000 rows and the query above returns almost 7.5 million rows; however depending on the granularity of your fact table and the nature of your data the explosion could be a lot less, and we're not interested in any of the measure columns in the original fact table either so this new table will not be as wide. 
&lt;p&gt;The next step is to take the query above and use it as the basis of a named query in the Adventure Works dsv, and then build a new measure group in the Adventure Works cube from it containing a single Count measure. Partitioning and aggregation might be useful here too, but I didn't bother with them and just went ahead and processed; I was pleasantly surprised at how quickly it processed, I guess because of the lack of measures. 
&lt;p&gt;Anyway, now we've got a measure in our cube we can use for our Non_Empty_Behavior property. I called it [Fact NEB Count] and here's the new version of the calculation in the original query: 
&lt;p&gt;with member measures.ytdsales as&lt;br&gt;sum(&lt;br&gt;periodstodate([Date].[Calendar].[Calendar Year],[Date].[Calendar].currentmember)&lt;br&gt;, [Measures].[Internet Sales Amount])&lt;br&gt;, non_empty_behavior=[Measures].[Fact NEB Count]&lt;br&gt;select {[Date].[Calendar].[Month].&amp;amp;[2003]&amp;amp;[12].children} on 0,&lt;br&gt;non empty&lt;br&gt;[Customer].[Customer Geography].[Customer].members&lt;br&gt;*&lt;br&gt;[Promotion].[Promotion].[Promotion].members&lt;br&gt;on 1&lt;br&gt;from [adventure works]&lt;br&gt;where(measures.ytdsales, [Product].[Subcategory].&amp;amp;[2]) 
&lt;p&gt;The query now runs in, wait for it, in 7 seconds on a cold cache in SQLMS and if you look in Profiler you'll see that in fact the majority of that time is taken up by SQLMS rendering the resultset - it takes just over 2.5 seconds to actually run on the server. A lot of effort, certainly, but a big improvement. Of course I've cheated a little bit and used a query that shows a particularly large change - the larger percentage that rows with data make up of the overall number of rows in the crossjoin, the less the difference will be. That said, I'm working with a customer at the moment for whom this is a very valid scenario: they have a lot of customers and a lot of products, but a customer only tends to buy one or two products and the users love to run big queries with YTD measures.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Using+Non_Empty_Behavior+With+YTD+calculations&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1607.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1607.entry</guid><pubDate>Wed, 27 Feb 2008 18:30:47 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1607/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1607.entry#comment</wfw:comment><dcterms:modified>2008-03-03T09:32:54Z</dcterms:modified></item><item><title>CTP6 and CU6 are now available</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1596.entry</link><description>&lt;p&gt;The February CTP of SQL2008, aka CTP6 is now available for download here:&lt;br&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=749bd760-f404-4d45-9ac0-d7f1b3ed1053&amp;amp;displaylang=en&amp;amp;tm"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=749bd760-f404-4d45-9ac0-d7f1b3ed1053&amp;amp;displaylang=en&amp;amp;tm&lt;/a&gt;&lt;br&gt;&lt;br&gt;Also now available, although not something you can download freely, is cumulative update 6 of SQL 2005 SP2:&lt;br&gt;&lt;a href="http://support.microsoft.com/kb/946608/en-us"&gt;http://support.microsoft.com/kb/946608/en-us&lt;/a&gt; &lt;p&gt;Several of those bugs there are ones I found (chest swells up with pride)... Meanwhile, in the SQL Server community, the calls for Microsoft to reverse their decision to not release a SP3 are getting louder. As I've said before, Analysis Services SP2 contained way too many bugs in my opinion and given that many shops either don't know about CU releases, can't get hold of them or won't install anything other than an official service pack the fact that these bugs have since been fixed is irrelevant until the fixes get rolled up into an official service pack. It just sends a message to the customer that Microsoft is more concerned with shipping a profitable new release than making the product that everyone's actually using at the moment (and most people will be using for a long time to come) more reliable.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+CTP6+and+CU6+are+now+available&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1596.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1596.entry</guid><pubDate>Wed, 20 Feb 2008 16:35:27 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1596/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1596.entry#comment</wfw:comment><dcterms:modified>2008-02-20T16:35:27Z</dcterms:modified></item><item><title>Dimension Security Tips, Tricks and Problems</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1563.entry</link><description>&lt;p&gt;I've been doing some work with complex dimension security recently and come across a number of issues which I've either known about but never blogged about, or only just become aware of. It's a bit of a random list but hopefully it'll help someone out there... &lt;p&gt;First of all, how do you use dimension security to deny access to an entire dimension? It was one of those things that I &lt;em&gt;thought&lt;/em&gt; was possible out of the box even back in the days of AS2K but it turned out my memory was playing tricks with me and it's a lot harder to do than you might think. Dimension security lets you deny access to individual members, so to deny access to the entire dimension you have to deny access to all the members on every single attribute hierarchy on the dimension - which is a right pain in the **** to do. From reading the relevant pages in the book &amp;quot;&lt;a href="http://www.amazon.co.uk/gp/redirect.html?ie=UTF8&amp;amp;location=http://www.amazon.co.uk/Microsoft-Server-2005-Analysis-Services/dp/0672327821%3Fie%3DUTF8%26s%3Dgateway%26qid%3D1200933218%26sr%3D8-1&amp;amp;tag=chriswebbsbib-21&amp;amp;linkCode=ur2&amp;amp;camp=1634&amp;amp;creative=6738"&gt;Microsoft Analysis Services 2005&lt;/a&gt;&amp;quot; (which is very good on the subject of security) I had thought it would be enough to set the Allowed Set on the key attribute to be an empty set, ie {}, and indeed this is what I'd been told would work. However this only has the effect of denying access to the key attribute itself and as I said you need to set the Allowed Set to {} for every attribute. Furthermore, once you've done that you'll still see the dimension itself visible even though all you'll see on each attribute hierarchy is an All Member, and there isn't a really a good way of hiding it apart from creating a perspective and trying to get all users who are denied access to the dimension to connect using that perspective. Not very nice. I posted something on Connect &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=233410"&gt;here&lt;/a&gt; and even though it's been closed as Won't Fix I had an email conversation with various people in Redmond a while ago and I'm hopeful there'll be a good solution to this one day. &lt;p&gt;Then there's the problem of calculations and security. If you read Mosha's blog entry &lt;a href="http://sqljunkies.com/WebLog/mosha/archive/2005/12/31/cube_init.aspx"&gt;here&lt;/a&gt; on the subject of cube initialisation you'll see that the MDX Script is executed after dimension security is applied - so if you reference a member in your MDX Script that has been secured, then it could result in an error. For example, imagine you have the following calculated measure defined on Adventure Works: &lt;p&gt;Create Member Currentcube.Measures.Test as Measures.[Internet Sales Amount]; &lt;p&gt;If you create a role that denies access to [Internet Sales Amount] and then browse the cube, you'll still see this calculated measure but it will return an error. The stock answer to this problem is that you should set the cube's ScriptErrorHandlingMode property from IgnoreNone to IgnoreAll, so that when the MDX Script executes when someone connects through the role the calculated measure doesn't get created because there's an error in its definition. I'm not too keen on this solution, and nor is anyone else I've talked to who has faced this problem, because what happens when there's a real bug in your MDX Script? You run the risk of calculations you actually want being ignored and no error being displayed, and in the worse case scenario this could result in incorrect data being returned. Imagine you've got a script assignment like this on Adventure Works: &lt;p&gt;Scope({Measures.[Internet Sales Amount],Measures.[Internet Tax Amount]});&lt;br&gt;    This=Measures.Currentmember * 2;&lt;br&gt;End Scope;  &lt;p&gt;If you connect to the cube through a role where [Internet Sales Amount] is denied and if ScriptErrorHandlingMode is set to IgnoreNone, you'll see a &amp;quot;END SCOPE statement does not match the opening SCOPE statement&amp;quot; error. Set ScriptErrorHandlingMode to IgnoreAll though, and you don't get an error because the Scope block is ignored - but the value of [Internet Tax Amount] will be half the value that is displayed when someone connects through a role which has access to [Internet Sales Amount]. &lt;p&gt;The best solution to this problem is one I found in &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=375371&amp;amp;SiteID=1"&gt;this thread on the MSDN forum&lt;/a&gt; suggested by Deepak and Mosha. While it doesn't seem to be possible to conditionally hide calculated members (again using a perspective seems to be the best option although still not ideal) it is possible to make sure they don't return errors, and similarly it is possible to write scoped assignments that can still work if one or more members they're scoped on is secured. The key is to use named sets in scoped assignments, as follows: &lt;p&gt;Create Member Currentcube.Measures.Test as null;  &lt;p&gt;Create Set myset1 As &lt;br&gt;iif(iserror(strtomember(&amp;quot;Measures.[Internet Sales Amount]&amp;quot;)), {},&lt;br&gt;{Measures.Test});  &lt;p&gt;Scope(myset1);&lt;br&gt;    This=Measures.[Internet Sales Amount];&lt;br&gt;End scope;  &lt;p&gt;Create Set myset2 As&lt;br&gt;iif(iserror(strtomember(&amp;quot;Measures.[Internet Sales Amount]&amp;quot;)), {Measures.[Internet Tax Amount]},&lt;br&gt;{Measures.[Internet Sales Amount],Measures.[Internet Tax Amount]});  &lt;p&gt;Scope(myset2);&lt;br&gt;    This=Measures.Currentmember * 2;&lt;br&gt;End Scope;  &lt;p&gt;For both the calculated measure and the scoped assignment, a named set is created that uses the IsError function to check to see whether [Internet Sales Amount] is secured or not - if it is, then an attempt to use the StrToMember function with its unique name will return an error. The outcome of this then determines the contents of a named set; for the calculated member this named set is used with a scoped assignment that assigns a definition to the member, and in the second example the named set is used instead of the hard-coded set in the Scope statement. This approach is a bit fiddly but it will work even when ScriptErrorHandlingMode is set to IgnoreNone because it avoids an error being raised. &lt;p&gt;Another thing to note is that if you are using role-playing dimensions in your cube, you will need to set dimension security on the cube dimensions rather than the underlying database dimension. For example, in Adventure Works, if you go to the Date dimension in the list of database dimensions (in the dimensions drop down on the Dimension Data tab of the Roles editor, database dimensions are listed first, then cube dimensions second) and set dimension security say to allow access to one year in the Calendar Year attribute, you'll get an error like &amp;quot;The 'Calendar Year' attribute on the 'Ship Date' dimension has a generated dimension security expression that is not valid&amp;quot;. Setting the same permissions on each of the role-playing dimensions in the cube based on Date, ie Ship Date, Delivery Date and Date does not cause a problem.  &lt;p&gt;Lastly, what I will say after spending a week or so playing around with dimension security is that even in SP2 it is way more buggy that it should be. I've had no end of problems setting up the roles I want: usually everything works for a while and then suddenly the roles stop accepting any changes I make to them, ie you'll make a change, save it, then test it and find that the change you've made has been forgotten about. I suspect something is getting corrupt somewhere. I've not managed to get a clear repro so that I can open a case with Microsoft about this, unfortunately, but it's something to do with large dimensions and/or membership of multiple roles and/or visualtotals and/or securing measures and it's happening enough to force us to rethink our entire approach to security. Hohum. &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Dimension+Security+Tips%2c+Tricks+and+Problems&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1563.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1563.entry</guid><pubDate>Tue, 22 Jan 2008 17:07:22 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1563/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1563.entry#comment</wfw:comment><dcterms:modified>2008-01-22T17:07:22Z</dcterms:modified></item><item><title>ASSP 1.2</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1535.entry</link><description>&lt;div&gt;Darren Gosbell has just done a new release of the Analysis Services Stored Procedure Project; he's blogged about it here:&lt;br&gt;&lt;a href="http://geekswithblogs.net/darrengosbell/archive/2007/12/22/ssas-assp-1.2-released.aspx"&gt;http://geekswithblogs.net/darrengosbell/archive/2007/12/22/ssas-assp-1.2-released.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;And of course, you can download it from Codeplex here:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=ASStoredProcedures&amp;amp;ReleaseId=7228"&gt;http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=ASStoredProcedures&amp;amp;ReleaseId=7228&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;It includes the partition healthcheck code that I blogged about &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1478.entry"&gt;here&lt;/a&gt;, as well as various other cool stuff.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+ASSP+1.2&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1535.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1535.entry</guid><pubDate>Sun, 23 Dec 2007 22:32:04 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1535/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1535.entry#comment</wfw:comment><dcterms:modified>2007-12-23T22:32:04Z</dcterms:modified></item><item><title>M2M Dimension Optimisation Techniques Paper</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1534.entry</link><description>&lt;div&gt;Another new paper from the SQLCat team, this time on techniques that can be used to optimise cubes that use many-to-many relationships:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3494E712-C90B-4A4E-AD45-01009C15C665&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=3494E712-C90B-4A4E-AD45-01009C15C665&amp;amp;displaylang=en&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I've only skimmed through it so far, but I thought I'd mention two other tricks to try with m2m dimensions. One is breaking up large dimensions if you don't ever need to see them, which I blogged about in detail here: &lt;a href="http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!777.entry"&gt;http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!777.entry&lt;/a&gt;, and which can be very powerful. The other is introducing other dimensions to the intermediate measure group: for example, imagine you have a measure group showing the relationship between Products and the Components that make them up, you could try adding the Time dimension to that measure group; even though it will increase the size of the measure group because you are repeating the Product/Component combinations for each Time period, if all of your queries are sliced by a Time period and you know that the majority of your Products were only sold for a short space of time then it can be beneficial, although if neither of these conditions is true then doing this can have a negative impact on performance too.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+M2M+Dimension+Optimisation+Techniques+Paper&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1534.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1534.entry</guid><pubDate>Fri, 21 Dec 2007 23:43:45 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1534/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1534.entry#comment</wfw:comment><dcterms:modified>2007-12-21T23:43:45Z</dcterms:modified></item><item><title>Comparing MDX Query Results With Tablediff</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1524.entry</link><description>&lt;p&gt;Recently I was working on a project where the customer wanted to upgrade from SP1 to SP2 but found that when they did so the results of some of the calculations on their cube changed. Unfortunately these changes weren't easy to spot: their MDX Script was &amp;gt;1500 lines long and the bugs they were running into were dependent on the query being run and whether the cache was cold or warm (in fact one of them was the bug I blogged about &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1506.entry"&gt;here&lt;/a&gt;). When testing various workarounds and hotfix builds, the problem I ran into was a problem I've run into before on numerous occasions: when I changed something on the MDX Script, how did I know it didn't break something else? &lt;p&gt;In the past what I've done was take a few MDX queries, run them, copy and paste the results into Excel, make my changes and then rerun the same queries and paste the new results into Excel again and use Excel formulas to compare the old and new resultsets. However in this case this approach just wasn't feasible and I started looking for a better way of comparing large numbers of MDX resultsets. Now there is definitely a tool to be written here, probably one which runs batches of queries, serialises the cellsets and saves them to disk, and then compares the cellsets and highlights any cells with differences, but I didn't have time to write it. I was talking the problem over with Didier Simon of PSS, though, and he made a great suggestion - use tablediff.exe, the command line utility you get with SQL Server to compare relational tables. You can read more about it here:&lt;br&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/ms162843.aspx" href="http://msdn2.microsoft.com/en-us/library/ms162843.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms162843.aspx&lt;/a&gt; &lt;p&gt;This turned out to be the key. I cannibalised bits of my Analysis Services cache warmer and created two SSIS packages, the first of which ran a batch of MDX queries retrieved from a relational table (originally saved from a Profiler trace) through SQL Server using OpenRowset and saving the results in a table using a SELECT INTO. Here's what the control flow looked like: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_s_lKcxCO23Xj1EYtsCkSbpijayisl_dtAVlQjdcuCFKay93nZEM2YTbj3VmoyIXHA?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=337 alt=CreateResults src="http://blufiles.storage.msn.com/y1pAEvk1empm_secsl2lCkOuWclatJt3jU39UB4Pxe5hOQue-pjnajija_AmhLNIX-pr46E5TWZMF8?PARTNER=WRITER" width=449 border=0&gt;&lt;/a&gt;  &lt;p&gt;And here's an example of the kind of SQL query I was generating: &lt;p&gt;select identity(int, 1,1) as idcolumn, * into Query1&lt;br&gt;from openrowset('MSOLAP', 'Datasource=localhost; Initial Catalog=Adventure Works DW',&lt;br&gt;' with cell calculation test for ''(*)'' as ''cstr(round(measures.currentmember,5))'' &lt;br&gt;select Measures.[Internet Sales Amount] on 0,&lt;br&gt;[Date].[Calendar Year].Members on 1&lt;br&gt;from [Adventure Works]')  &lt;p&gt;A couple of things to note - Tablediff needs a column which can uniquely identify each row in the tables its comparing, hence the identity column. I also found that I was running into the precision problems described here and as a result, tablediff was flagging up cells as having different values when in fact the values were differing only by a miniscule amount, so I created a calculated cell assignment in the WITH clause which rounded up every value to five decimal places. I could do this because I knew none of my queries had WITH clauses, but another solution would have been to create a session calculated cell assignment which did the same thing. &lt;p&gt;After running this package I had a SQL Server database with as many tables containing results as I had queries. I could then make my changes to the cube and rerun the same package to dump a new set of results to a different database, and then run my second package to compare the results. This was, again, a fairly simple package to put together: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_sNeJI_MkQmtilnXfcor9sUcUZrJYbgZbXwvOaF0HX9YzODyRwy4B7gifUkLjM1stI?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=282 alt=compareresults src="http://blufiles.storage.msn.com/y1pAEvk1empm_vc_MdTIqsPbVl937NHg0UEsllf8qHObwhl7RxB8u7ZbATiQQV9B52OMldLH8umx_c?PARTNER=WRITER" width=463 border=0&gt;&lt;/a&gt;  &lt;p&gt;All I did was use a ForEach loop to loop over the tables in the database containing the first set of results, and then use an Execute Process task to call tablediff to compare each table with the equivalent table in the second database; if it found any, I used the -et argument to save the output to another table. I also used the -c argument to get column-level differences and the -b argument to specify the number of bytes to compare for large objects, necessary because the SELECT INTO creates an ntext column for all the member names on the Rows axis. &lt;p&gt;Overall, it's not an ideal solution (coding a proper app is definitely the way to go) but it did the job, and hopefully this will be useful to someone else...&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Comparing+MDX+Query+Results+With+Tablediff&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1524.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1524.entry</guid><pubDate>Mon, 10 Dec 2007 23:18:16 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1524/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1524.entry#comment</wfw:comment><dcterms:modified>2007-12-10T23:18:16Z</dcterms:modified></item><item><title>Partitions and Aggregations</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1511.entry</link><description>&lt;p&gt;Something that's easy to forget (at least I'm always forgetting it) when creating an aggregation design is the impact that partitioning can have on it. Aggregations are only created on a per-partition basis - you can't aggregate across partitions - so that means, for example, when you're partitioning by Month then there's little point building aggregations at granularities higher than Month; after all, if you only have one Month of data in your partition and you aggregate that data to the Month, Quarter or Year levels then the figures for each aggregation will be identical! In fact building aggregations above the granularity of Month can be a bit of a waste: an aggregation at Month granularity can be used by queries at Quarter and Year, but an aggregation for the same partition at Year granularity that is in all other respects identical can only be used by queries at the Year granularity. &lt;p&gt;The best thing to do to ensure this doesn't happen is to set the AggregationUsage property to None for all attributes above the granularity that you're partitioning by, and also to make sure your partition row counts are set correctly, before you run either of the Aggregation Design wizards. This should ensure that your aggregation design properly reflects your partitioning strategy. &lt;p&gt;One of the questions I've always meant to research further on this topic is whether partitioning could hurt query performance, given that it effectively prevents certain aggregations being built. Taking the example we've been using so far, what happens if you're partitioning by Month and you've got a slow query at Year granularity that you'd like to build an aggregation for - would partitioning by Year rather than Month, so you could build a true Year-level aggregation, make sense? Well, I've just had a chance to test this out on a fairly large cube (with approx 100 million rows in the main fact table, and Product and Customer dimensions with 1 million+ members on their key attributes) and interestingly partitioning seems to make no difference at all. I created two measure groups, one partitioned by Month and one partitioned by Year, and then created one aggregation on the former at Month/Product and one aggregation on the latter at Year/Product. I then ran a query that returned the top 10 Products at Year on each measure group and the performance was identical. Clearly this is not something to be worried about, thank goodness... &lt;p&gt;[Thanks are due to Eric Jacobsen of the SQLCat team for talking through some of these issues after the BI Conference earlier this year. He accurately predicted that partitioning wouldn't hurt performance because the AS query engine is very efficient at merging the data caches of partitions.]&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Partitions+and+Aggregations&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1511.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1511.entry</guid><pubDate>Mon, 03 Dec 2007 23:32:23 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1511/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1511.entry#comment</wfw:comment><dcterms:modified>2007-12-03T23:32:23Z</dcterms:modified></item><item><title>SQL2008 November CTP released</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1498.entry</link><description>&lt;div&gt;I'm a bit late on this (ie about a day, but that's late in the blog world) but the November CTP of SQL2008 has been released and you can download it here:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3BF4C5CA-B905-4EBC-8901-1D4C1D1DA884&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=3BF4C5CA-B905-4EBC-8901-1D4C1D1DA884&amp;amp;displaylang=en&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I won't go into the details of what it contains because various other people have already done so; the best round up I've seen is from Vidas Matelis:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.ssas-info.com/VidasMatelisBlog/38_ms-sql-server-analysis-services-2008-november-ctp-quick-review#more-38"&gt;http://www.ssas-info.com/VidasMatelisBlog/38_ms-sql-server-analysis-services-2008-november-ctp-quick-review#more-38&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Apparently the only feature missing from this CTP for AS is the ability to share a single AS database between multiple instances; there don't seem to be any new features coming that I didn't know about apart from some new Perfmon counters and some new Profiler trace events, and the rumoured query plans have not made the cut. Am I alone in feeling a little... underwhelmed by the new features in AS2008? Maybe that's because I haven't had a chance to test out the block computation changes yet (I might do this week though) - they're not very obvious or demoable but they should hopefully make a big, big improvement to the performance of many calculations.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+SQL2008+November+CTP+released&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1498.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1498.entry</guid><pubDate>Tue, 20 Nov 2007 19:14:40 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1498/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1498.entry#comment</wfw:comment><dcterms:modified>2007-11-21T09:59:50Z</dcterms:modified></item><item><title>Viewing Partition Slice Information</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1478.entry</link><description>&lt;p&gt;&lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1440.entry"&gt;The other week&lt;/a&gt; I discovered that it was possible to view the partition slice information discussed &lt;a href="http://blogs.msdn.com/sqlcat/archive/2007/03/05/ssas-partition-slicing.aspx"&gt;here&lt;/a&gt; using the DISCOVER_PARTITION_DIMENSION_STAT schema rowset. I've always thought it would be cool to be able to visualise this information so you could easily check to see whether your dataid ranges overlapped or not; to do this, though, you would need to see the slice information for all your partitions in one resultset and DISCOVER_PARTITION_DIMENSION_STAT only returns data for one partition. So this week I dusted off my coding skills and wrote a sproc that loops through every partition in a measure group, calls DISCOVER_PARTITION_DIMENSION_STAT and concatenates the results as well as checking to see which partitions have ranges which overlap each other. I've added it to the source code for the Analysis Services Stored Procedure Project, which you can get hold of here: &lt;p&gt;&lt;a title="http://www.codeplex.com/ASStoredProcedures" href="http://www.codeplex.com/ASStoredProcedures"&gt;http://www.codeplex.com/ASStoredProcedures&lt;/a&gt; &lt;p&gt;Note that the function isn't part of the latest release, you will have to download the code and compile it yourself. As an example of what it does, in SQLMS if you connect to the Adventure Works database and then run the following statement: &lt;p&gt;call assp.DiscoverPartitionSlices(&amp;quot;Adventure Works&amp;quot;, &amp;quot;Internet Sales&amp;quot;)  &lt;p&gt;...you'll get a resultset showing all the partition slice information for every attribute on every partition in the Internet Sales measure group. &lt;p&gt;Having done this I was able to put together a simple SSRS report to display this information. I say simple, it probably took me longer to create the report than to write the sproc because I couldn't work out how to visualise the ranges in a useful way; in the end I used the &lt;a href="http://support.dundas.com/OnlineDocumentation/WinChart2005/RangeColumnChart.html"&gt;RangeColumn&lt;/a&gt; chart style from Dundas, which seemed to be the best fit. Here's an example of what the report returned for the Date attribute on the Date dimension and the Internet Sales measure group: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_sZtXr27Af2CpOWSevKOpz1UVGBCcIHHx5x7wYy8HQtiwrbporzBQtzZ8pprNPIAZ4"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=402 alt=sliceDate src="http://blufiles.storage.msn.com/y1pAEvk1empm_u_Pbq4KbCVVi7IPbtXzoVl8IvT2uKw4PRh18jIbIK4oE-VwrLsMD7cF0c7eBZDZ-g" width=597 border=0&gt;&lt;/a&gt;  &lt;p&gt;I cheated a bit by setting the IndexBuildTheshold very low so that indexes would be created for the 2001 and 2002 partitions, but it shows what a healthy set of slices looks like (the Internet Sales measure group is partitioned by Calendar Year). Another attribute worth looking at is the Product attribute on the Product dimension: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_tzYnIZd4sWaCIXnE1YKvZklkav2H9bdlCHiG8UcuWB8WE6C_SiNb4PWnAX_G9ZbRw"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=378 alt=sliceProd src="http://blufiles.storage.msn.com/y1pAEvk1empm_uwWuTmlc35_V7dX1vHbAtQw3PyBAaDoG_UP5L5BGumSPK8teHHSWfHE0B1nEdUZks" width=609 border=0&gt;&lt;/a&gt;  &lt;p&gt;What we see here is that in 2001 and 2002 only a small number of products were actually sold compared to 2003 and 2004. In this situation it might be worth trying to reorder the members or set a slice on 2001 and 2002 so that AS knows about this distribution: it would mean that if you were running a query for the sales of a Product that was only sold in 2003/4 for all time periods, AS would not need to scan the 2001 and 2002 partitions because it would know in advance that there would be no data for that product in those partitions. One of the improvements I would like to make to the sproc is to display member names and unique names as well as dataids so that the slice ranges are easier to understand; Mosha also had the idea that it would be good to be able to take these unique names and use them to set a slice on a partition for exactly the scenario I've just described. &lt;p&gt;Lastly, I found what is almost certainly a bug in AS when I was looking at the Calendar Semester attribute on the Date dimension: &lt;p&gt;&lt;a href="http://blufiles.storage.msn.com/y1pAEvk1empm_uUehy35grSQzq6zL-LZOjX-M_tJiCqAx5A9qUc3GHu27HkXA_B1nUlBOX67315WGo"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=392 alt=sliceCalSem src="http://blufiles.storage.msn.com/y1pAEvk1empm_teI5n6mqBtH33VLZH7EcAkV1LRzZCZ5Ri8YWMlffIKImZuCn8aqxSGbTt3ZoNZMQU" width=606 border=0&gt;&lt;/a&gt;  &lt;p&gt;Calendar Semester has, as you would expect, a one-to-many relationship with the Year attribute and we would expect to see no overlaps as a result -but as the report shows, that isn't the case. When you run a query on this attribute, for example: &lt;p&gt;select measures.[internet sales amount] on 0,&lt;br&gt;{[Date].[Calendar Semester].&amp;amp;[2004]&amp;amp;[1]} on 1 &lt;br&gt;from [adventure works]  &lt;p&gt;You see partitions being hit when they shouldn't be hit - in this case the 2003 and 2004 partitions - and this even sometimes seems to happen when you have a slice explicitly set on the partition using the Year attribute, which is pretty bad. &lt;a href="http://www.artisconsulting.com/Blogs/tabid/94/BlogId/3/Default.aspx"&gt;Greg Galloway&lt;/a&gt; did a bit of digging on this and discovered that the SQL generated returned rows in the same mixed-up order as the dataids of the members, and fixing the SQL to return members in the order you want the dataids stops this happening to a certain extent. Mosha says that it's a problem with the decode tables created within the dimensions, but whatever the cause you may want to check your dimensions to see if it's happening to you. This kind of problem has been noticed before and I knew about the Disable Prefetch Facts connection string property that was introduced to deal with it, so I wonder if this is related in some way? Anyway, I logged the bug on Connect and I'll blog about any new information that I get on it: &lt;p&gt;&lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=308793" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=308793"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=308793&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=8900433320278050970&amp;page=RSS%3a+Viewing+Partition+Slice+Information&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=cwebbbi.spaces.live.com&amp;amp;GT1=cwebbbi"&gt;</description><comments>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1478.entry#comment</comments><guid isPermaLink="true">http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1478.entry</guid><pubDate>Thu, 08 Nov 2007 22:10:46 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!1478/comments/feed.rss</wfw:commentRss><wfw:comment>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1478.entry#comment</wfw:comment><dcterms:modified>2007-11-08T22:10:46Z</dcterms:modified></item><item><title>Fun and Games with Schema Rowsets</title><link>http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!1440.entry</link><description>&lt;p&gt;One of the (few) new features in AS2008 are Data Management Views, which give you a table-like way of looking at all kinds of useful metadata and management style information. However, as Darren points out here:&lt;br&gt;&lt;a title="http://geekswithblogs.net/darrengosbell/archive/2007/08/13/SSAS-2008-Data-Management-Views.aspx" href="http://geekswithblogs.net/darrengosbell/archive/2007/08/13/SSAS-2008-Data-Management-Views.aspx"&gt;http://geekswithblogs.net/darrengosbell/archive/2007/08/13/SSAS-2008-Data-Management-Views.aspx&lt;/a&gt;&lt;br&gt;...this isn't really anything you can't get from schema rowsets at the moment, and the great set of functions that Darren wrote for the Analysis Services Stored Procedure Project (&lt;a title="http://www.codeplex.com/ASStoredProcedures/Wiki/View.aspx?title=XmlaDiscover&amp;amp;referringTitle=Home" href="http://www.codeplex.com/ASStoredProcedures/Wiki/View.aspx?title=XmlaDiscover&amp;amp;referringTitle=Home"&gt;http://www.codeplex.com/ASStoredProcedures/Wiki/View.aspx?title=XmlaDiscover&amp;amp;referringTitle=Home&lt;/a&gt;) make it very easy to get at this information in MDX. &lt;p&gt;I've been playing around with schema rowsets a bit over the last week or so, mostly because I'm working on an updated version of my SSIS cache-warmer (more of which soon), but it's given me a number of interesting ideas for other things that could be possible. For instance, one of the big missing features from AS at the moment in my opinion in a query governor: it's all too easy for one user to bring your server to its knees by running the query from hell. In the article above, Darren talks about the information in the DISCOVER_SESSIONS and DISCOVER_CONNECTIONS rowsets, and how you can use the ids they return to kill sessions and connections; both of them contain other interesting information (which I think probably need some time spent researching to make sure I know exactly what they mean) on the time since the last command, the CPU time taken by the last command, what the last command was, how long the last command took to run etc. With this information I guess it would be possible to build a rudimentary query governor in SSIS: basically a package that was scheduled to run every ten seconds or something, checked the overall CPU usage (or other perfmon counters) on the machine and if it was greater than a certain threshold looked at the sessions that were open, tried to work out which were the guilty parties and killed them. &lt;p&gt;There's other useful stuff available from schema rowsets too that doesn't seem to be documented anywhere. If you look at the DISCOVER_SCHEMA_ROWSETS rowset (try running call assp.Discover(&amp;quot;DISCOVER_SCHEMA_ROWSETS&amp;quot;) if you have ASSP installed) you can see what schema rowsets are available. One interesting one I found was DISCOVER_PARTITION_DIMENSION_STAT; for example run &lt;p&gt;cal