<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://prologika.com/CS/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Prologika (Teo Lachev's Weblog)</title><link>http://prologika.com/CS/blogs/blog/default.aspx</link><description>Teo Lachev is a consultant, mentor, and author focusing on the design and development of Microsoft business intelligence solutions. Read about Teo&amp;#39;s work and life. Registered users can post comments.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Best Practices for Implementing Enterprise BI Solution at SQL Saturday 2013</title><link>http://prologika.com/CS/blogs/blog/archive/2013/05/18/best-practices-for-implementing-enterprise-bi-solution-slides.aspx</link><pubDate>Sun, 19 May 2013 02:18:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5739</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5739</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/05/18/best-practices-for-implementing-enterprise-bi-solution-slides.aspx#comments</comments><description>&lt;p&gt;SQL Saturday 2013 in Atlanta was a raging success. Some 555 people attended which made it the most attended SQL Saturday even ever. I&amp;#39;ve uploaded the slides from my presentation &amp;quot;Best Practices for Implementing Enterprise BI Solution&amp;quot; to the &lt;a href="http://prologika.com/CS/media/p/5738.aspx"&gt;Prologika&lt;/a&gt; site and &lt;a href="http://www.slideshare.net/TeoLachev/best-practices-for-implementing-enterprise-bi-solution"&gt;Slideshare&lt;/a&gt;. The presentation had a great attendance and reviews. Thanks to everyone who attended it and it was great meeting all of you! &lt;/p&gt;
&lt;p&gt;&amp;quot;Learn best practices to make your organization a center of BI excellence! I&amp;#39;ll walk you through lessons learned during our implementation of an enterprise end-to-end BI solution. Working experience with the dimensional modeling and the Microsoft BI stack is assumed.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="margin-bottom:5px;"&gt;&lt;strong&gt;&lt;a target="_blank" href="http://www.slideshare.net/TeoLachev/best-practices-for-implementing-enterprise-bi-solution" title="Best Practices for Implementing Enterprise BI Solution"&gt;Best Practices for Implementing Enterprise BI Solution&lt;/a&gt; &lt;/strong&gt;from &lt;strong&gt;&lt;a target="_blank" href="http://www.slideshare.net/TeoLachev"&gt;Teo Lachev&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5739" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Leveraging Data to Revolutionize a Mature Business by Bijal Patel at Atlanta BI Group on May 20th</title><link>http://prologika.com/CS/blogs/blog/archive/2013/05/13/atlanta-bi-group-meeting-on-may-20th.aspx</link><pubDate>Tue, 14 May 2013 01:39:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5737</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5737</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/05/13/atlanta-bi-group-meeting-on-may-20th.aspx#comments</comments><description>&lt;p&gt;Due to Memorial Day, we&amp;#39;ll move our &lt;a href="http://atlantabi.sqlpass.org/"&gt;next Atlanta BI Group meeting&lt;/a&gt; to May 20th. The meeting will be sponsored by Strategy Analyzer. Our speaker will be Bijal Patel (Director of Data and Integration Services at Cox Media Group) and the topic is &amp;quot;Leveraging Data to Revolutionize a Mature Business&amp;quot;. &lt;/p&gt;
&lt;p&gt;&amp;quot;Learn how the integration, management and analysis of data is helping Cox Media Group reinvent its business model. Leveraging SSIS, BizTalk, MDS and several other leading technologies, Cox Media Group is finding new ways to reach its customers and deliver innovative media products and services to its established customer base.&amp;quot; &lt;/p&gt;
&lt;p&gt;This looks like a very interesting &amp;quot;from the trenches&amp;quot; presentation given the experience of the speaker and the business of its organization. I hope you can join us. Please register and RSVP on the &lt;a href="http://atlantabi.sqlpass.org/"&gt;Atlanta BI Group website&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5737" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Presenting at SQL Saturday in Atlanta</title><link>http://prologika.com/CS/blogs/blog/archive/2013/05/05/presenting-at-sql-saturday-in-atlanta.aspx</link><pubDate>Sun, 05 May 2013 15:51:24 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5734</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5734</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/05/05/presenting-at-sql-saturday-in-atlanta.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ll &lt;a href="http://sqlsaturday.com/220/schedule.aspx"&gt;present&lt;/a&gt; at SQL Saturday in Atlanta on May 18&lt;sup&gt;th&lt;/sup&gt;. Initially, I was planning to talk about dashboard options with the Microsoft BI stack but the organizers had a call for more advanced content. To accommodate this request, I&amp;#39;ll present Best Practices for Implementing an Enterprise BI Solution where I&amp;#39;ll share proven practices harvested from real-life projects. 
&lt;/p&gt;&lt;p&gt;&amp;quot;Learn best practices to make your organization a center of BI excellence! I&amp;#39;ll walk you through lessons learned during our implementation of an enterprise end-to-end BI solution, which is discussed in the Records Management Firm Saves $1 Million, Gains Faster Data Access with Microsoft BI case study published by Microsoft. Working experience with the dimensional modeling and the Microsoft BI stack is assumed.&amp;quot;
&lt;/p&gt;&lt;p&gt;I&amp;#39;m looking forward to seeing you on May 18&lt;sup&gt;th&lt;/sup&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5734" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Default Parameters in Power View</title><link>http://prologika.com/CS/blogs/blog/archive/2013/05/04/default-parameters-in-power-view.aspx</link><pubDate>Sat, 04 May 2013 17:22:37 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5733</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5733</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/05/04/default-parameters-in-power-view.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; You need to configure a Power View report to show data for a dynamic date, such as the current date or the last date with data. However, as it stands Power View doesn&amp;#39;t support expressions. 
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Workaround:&lt;/strong&gt; Add a Boolean calculated column to the Date table that returns TRUE for the date of interest. For example, if you want the report to show data for today&amp;#39;s date, the expression might be:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:11pt;"&gt;&lt;span style="font-family:Courier New;"&gt;=if([Date]=TODAY(), True, False)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:11pt;"&gt; where [Date] is the column with date data type. Then, use this column as a filter in Power View.
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.prologika.com/blog/050413_1722_DefaultPara1.png" alt="" /&gt;
	&lt;/p&gt;&lt;p&gt;Unfortunately, this workaround has a significant limitation. If the report needs another filter on the Date table, such as to allow the user to overwrite the default filter on the current date, this approach won&amp;#39;t work because filters on multiple attributes are interpreted as an AND condition (Date is 1/1/2013 &lt;span style="text-decoration:underline;"&gt;AND&lt;/span&gt; TodayDate=True). Inability to specify OR filter condition between attributes is another Power View limitation. So, users needs to be trained to use either the TodayDate or Date filter but not both.
&lt;/p&gt;&lt;p&gt;Looking ahead, it will be nice if Power View supports VB or DAX expressions as regular SSRS reports do. 
&lt;/p&gt;&lt;p&gt;Many thanks to Darren Gosbell for suggesting the workaround.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5733" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Reporting+Services/default.aspx">Reporting Services</category></item><item><title>Best Practice and Creative Data Visualization by Jen Underwood for Atlanta BI</title><link>http://prologika.com/CS/blogs/blog/archive/2013/04/29/best-practice-and-creative-data-visualization-by-jen-underwood-for-atlanta-bi.aspx</link><pubDate>Mon, 29 Apr 2013 15:17:35 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5732</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5732</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/04/29/best-practice-and-creative-data-visualization-by-jen-underwood-for-atlanta-bi.aspx#comments</comments><description>&lt;p&gt;It looks like &lt;a href="http://atlantabi.sqlpass.org/"&gt;Atlanta BI Group&lt;/a&gt; will have a record attendance tonight with 74 people registered! Jen Underwood will present Best Practice and Creative Data Visualization. 
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Tahoma;font-size:10pt;"&gt;This fun, informative, and inspirational session covers both best practices and creative options for data visualization. We will showcase data visualization techniques in Excel, Power View, Reporting Services, Visio, and a variety of other Open Source projects and Third-Party data visualization offerings. The possibilities are endless with the right mix of tools, tips, and tricks.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5732" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Windows Azure Infrastructure Services</title><link>http://prologika.com/CS/blogs/blog/archive/2013/04/16/windows-azure-infrastructure-services.aspx</link><pubDate>Tue, 16 Apr 2013 21:02:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5727</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5727</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/04/16/windows-azure-infrastructure-services.aspx#comments</comments><description>&lt;p&gt;Microsoft &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2013/04/16/the-power-of-and.aspx"&gt;announced&lt;/a&gt; today the availability of Windows Azure Infrastructure Services which is a collective name for running Virtual Machines and Virtual Networks in the cloud. Scott Guthrie&amp;#39;s &lt;a href="http://weblogs.asp.net/scottgu/archive/2013/04/16/windows-azure-general-availability-of-infrastructure-as-a-service-iaas.aspx"&gt;blog&lt;/a&gt; on this subject is very informative. Pricing get slashed too to be competitive with Amazon. What&amp;#39;s interesting is that these cloud VMs can be configured as an extension to your existing network. In the BI world, this would allow us to source data from existing on-premises data sources albeit probably over a much slower connection, such as to host your ETL, data mart and SSAS in the cloud or just the analytical layer. Speaking of connection speeds, the Azure bandwidth is actually &lt;a target="_blank" href="http://blogs.msdn.com/b/windowsazure/archive/2012/11/02/windows-azure-s-flat-network-storage-and-2012-scalability-targets.aspx"&gt;good&lt;/a&gt; (5-15 GB/s) although it&amp;#39;s likely that is likely you&amp;#39;ll hit a bottleneck with your ISP on your way to and back from the cloud.&lt;/p&gt;
&lt;p&gt;And, speaking of BI, check the SQL Server Business Intelligence in Windows Azure Virtual Machines &lt;a href="http://msdn.microsoft.com/en-us/library/jj992719.aspx"&gt;document&lt;/a&gt; if you&amp;#39;re interested in cloud BI deployments. Notice that there are VM templates that install SSRS (native mode), SSAS (Multidimensional), as well as SharePoint 2013 but you can install manually the other components as well if you need to, such as Tabular. Microsoft recommends Extra Large VM size for BI deployments although its memory capacity (14 GB) might be on the lower end especially for Tabular.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5727" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Cloud/default.aspx">Cloud</category></item><item><title>About Tableau 8</title><link>http://prologika.com/CS/blogs/blog/archive/2013/04/05/about-tableau-8.aspx</link><pubDate>Fri, 05 Apr 2013 20:00:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5713</guid><dc:creator>tlachev</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5713</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/04/05/about-tableau-8.aspx#comments</comments><description>&lt;p&gt;Jen Underwood highly recommended I attend the Tableau 8 tour on Tuesday to witness firsthand its new features. Naturally, I couldn&amp;#39;t resist of comparing everything I saw with Microsoft BI. I took some time after the pretention to take 8.0 for a spin and reconfirm my understanding. Here are the top five things I liked about Tableau. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Simplicity &amp;ndash; A few months ago, I &lt;a href="http://prologika.com/CS/blogs/blog/archive/2012/12/25/happy-holidays.aspx"&gt;blogged&lt;/a&gt; about my top 5 Microsoft BI wish list. My number 1 wish was a continued focus on integration and simplification. Tableau 8.0 nailed it down as far as simplicity, at least on the visualization side of things. One desktop tool and its server-based counterpart. A tool whose sole purpose is BI. Not something that was bolted on another tool as a BI add-on. No layers to integrate with and configure on the server side, and error logs to sieve through. &lt;/li&gt;
&lt;li&gt;Visualization - Visualizations are yet simple and powerful. The presenter was quick to point out the areas where the tool excels in comparison with Power View. Tree maps and bubble maps were all over the place, as well as the ability to customize them, e.g. change the color of a pie slice. I liked the ability to dynamically group items (similar to custom MDX sets in Excel). For example, the presenter lassoed a bunch of cities in North America and created a North America dynamic group that was subsequently used to analyze sales. Another interesting in-the-box feature is ability to forecast data. In the Microsoft world, this would require some flavor of data mining (not a native feature in both Excel and Power View). &lt;/li&gt;
&lt;li&gt;Mobility &amp;ndash; This is one area where Tableau has at least a year lead over Microsoft BI (see my number 2 wish item in the above blog). Once the dashboard is published to the server, it can be viewed and edited on mobile devices (iPad was demonstrated). By contrast, due to its Silverlight nature, Power View is currently supported only in Internet Explorer. However, as we&amp;#39;ve heard at conferences, Microsoft is hard at work to change this. &lt;/li&gt;
&lt;li&gt;JavaScript API - Developers creating web applications can integrate and embed interactive Tableau content into their applications via the new &lt;a href="http://www.tableausoftware.com/new-features/javascript-api"&gt;JavaScript API&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Data reach &amp;ndash; Apparently, Tableau customers are asking for specialized connectors to cloud data and emerging data sources. Version 8.0 introduces connectors for Salesforce.com, Google Analytics, Hadoop, SAP Hana, etc. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Being a self-service BI tool, in my opinion the backend is where Tableau trails behind Microsoft BI, including: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No continuum for self-service to organizational BI &amp;ndash; While you can publish a workbook to the server, you can&amp;#39;t upgrade the workbook to an organizational BI model. Nor can you connect to a published workbook as a data source, e.g. by using Excel as a front end. &lt;/li&gt;
&lt;li&gt;In-memory engine &amp;ndash; Based on my experiments, xVelocity (the in-memory engine of PowerPivot and Tabular) excels the Tableau in-memory technology both in compression and speed. &lt;/li&gt;
&lt;li&gt;Programming &amp;ndash; Tableau supports custom calculations but the potential is not even close to what you can do with DAX. For example, I couldn&amp;#39;t find a way to use many-to-many relationship (not natively supported in Power Pivot but can be handled with DAX formulas). &lt;/li&gt;
&lt;li&gt;Scalability &amp;ndash; I haven&amp;#39;t tested the server edition yet but I would expect Analysis Services to scale much better than Tableau due to the desktop origin of the latter.&amp;nbsp; &lt;/li&gt;
&lt;li&gt;Security &amp;ndash; Tableau supports action-level security, e.g. allowing the user to edit workbooks, and basic user filters that allow user access to specific members, such as Bob can see only USA. There is no dynamic data security. &lt;/li&gt;
&lt;li&gt;Usability &amp;ndash; Besides the presentation layer where Tableau excels, I&amp;#39;ve noticed areas that would be surprisingly difficult for a self-service BI tool. For example, there isn&amp;#39;t option to visualize tables and relationships in a diagram view. For some obscure reason (I guess so it knows what to aggregate and not), Tableau insists on separating entities as dimensions and measures. Tableau stores data and connection definition as external files, and maintains connections per entity. For example, I couldn&amp;#39;t find a way to import more tables using the same connection definition. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In summary, choosing between Tableau and PowerPivot for self-service BI would require careful examination of requirements and comparing pros and cons of the two. On the corporate BI side of things, you should definitely consider Tableau as a front end to Analysis Services if you need an alternative to Microsoft Excel and/or Power View.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5713" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Data Warehouse Physical Design Best Practices Session by Carlos Rodrigues at Atlanta BI Tonight</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/25/data-warehouse-physical-design-best-practices-session-by-carlos-rodrigues-at-atlanta-bi-tonight.aspx</link><pubDate>Mon, 25 Mar 2013 20:32:25 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5708</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5708</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/25/data-warehouse-physical-design-best-practices-session-by-carlos-rodrigues-at-atlanta-bi-tonight.aspx#comments</comments><description>&lt;p&gt;It looks like Carlos will deliver another slam tonight with a record number of some 63 people registered and counting… Join our &lt;a href="http://atlantabi.sqlpass.org/"&gt;Atlanta BI meeting&lt;/a&gt; at 6:30 to see his Data Warehouse Physical Design Best Practices presentation. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5708" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Events/default.aspx">Events</category></item><item><title>Query Options for Analytical Models and Transactional Reporting</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/24/query-options-for-analytical-models-and-transactional-reporting.aspx</link><pubDate>Sun, 24 Mar 2013 18:27:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5707</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5707</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/24/query-options-for-analytical-models-and-transactional-reporting.aspx#comments</comments><description>&lt;p&gt;Requesting both historical and transactional reports is a very common requirement. As they stand, neither Multidimensional nor Tabular are designed to support well transactional (detail-level) reporting with large datasets, as I discussed in my &lt;a href="http://prologika.com/cs/blogs/default.aspx"&gt;Transactional Reporting with Tabular&lt;/a&gt; blog post. There are two query options that might provide some relief with transactional reporting and they both have limitations. &lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;DRILLTHROUGH QUERIES &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can use a &lt;a href="http://technet.microsoft.com/en-us/library/ms145964.aspx"&gt;DRILLTHROUGH query&lt;/a&gt; to request data at the lowest level. The syntax differs somewhat between Multidimensional and Tabular. Here is a sample drillthrough query to Adventure Works cube: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;DRILLTHROUGH&lt;/span&gt; &lt;span style="color:blue;"&gt;MAXROWS&lt;/span&gt; 1000 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; [Adventure Works] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; ([Measures].[Reseller Sales Amount],[Product].[Category].[Accessories],[Date].[Calendar Year].&amp;amp;[2006]) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;RETURN&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[$Product].[Product], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[$Date].[Date], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Reseller Sales].[Reseller Sales Amount], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Reseller Sales].[Reseller Tax Amount]&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And a similar query to Adventure Works Tabular: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;DRILLTHROUGH&lt;/span&gt; &lt;span style="color:blue;"&gt;MAXROWS&lt;/span&gt; 1000 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; [Model] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; ([Measures].[Reseller Total Sales],[Product].[Category].[Category].&amp;amp;[Accessories],[Date].[Calendar].[Year].&amp;amp;[2005]) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;RETURN&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[$Product].[Product Name], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[$Date].[Date], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[$Reseller Sales].[Sales Amount], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[$Reseller Sales].[Tax Amount]&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Notice that the WHERE clause specifies the coordinate that is drilled through. The optional RETURN statement enumerates the columns you need in the output with dimensions prefixed with a dollar sign. Since Tabular doesn&amp;#39;t have measure groups, you treat all tables as dimensions. &lt;/p&gt;
&lt;p&gt;Drillthrough queries are very fast. They honor the data security (both dimension data security in Multidimensional and Row Filters in Tabular). Not allowed members simple don&amp;#39;t exist as far as DRILLTHROUGH is concerned. For example, attempting to request a dimension member outside the allowed set would return the following error: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;Drillthrough failed because the coordinate identified by the SELECT clause is out of range. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is the same error you will get if your request a non-existent or wrong dimension member. &lt;/p&gt;
&lt;p&gt;DRILLTHROUGH queries have limitations: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You can&amp;#39;t request measures from different measure groups in Multidimensional, such as Internet Sales and Reseller Sales. If you attempt to do so, you&amp;#39;ll get the following error:&lt;br /&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;Errors from the SQL query module: Drillthrough columns must belong to exactly one measure group. The columns requested by the drillthrough statement are referencing multiple measure groups. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;The WHERE coordinate must resolve to a single coordinate. In other words, you can&amp;#39;t specify a set, such as {[Product].[Category].[Accessories],[Product].[Category].[Bikes]. You can avoid the error by using SUBSELECT instead of WHERE but you&amp;#39;ll find that the SUBSELECT clause doesn&amp;#39;t set the default member and you&amp;#39;ll get all products. This limitation will prevent you from using multi-select parameters in SSRS. &lt;/li&gt;
&lt;li&gt;Related to the previous item, you can&amp;#39;t specify FILTER conditions either, e.g. where the transaction date is between a range of dates. Again, you can only use a tuple in the WHERE clause. &lt;/li&gt;
&lt;li&gt;You must use the Analysis Services OLE DB provider in SSRS. If you need to parameterize the query, you need to use an expression-based query statement. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;SQL QUERIES &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can also use SQL-like queries as Chris Webb &lt;a href="http://cwebbbi.wordpress.com/2006/06/14/can-i-run-sql-against-an-analysis-services-cube/"&gt;explains&lt;/a&gt; in the &amp;quot;Can I run SQL against an Analysis Services cube?&amp;quot; blog. Here is a SQL query against the Adventure Works cube: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Adventure Works].[$Customer].[City], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Adventure Works].[Internet Sales].[Internet Sales Amount] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;from&lt;/span&gt; [Adventure Works].[Internet Sales] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;natural&lt;/span&gt; &lt;span style="color:blue;"&gt;join&lt;/span&gt; [Adventure Works].[$Date] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;natural&lt;/span&gt; &lt;span style="color:blue;"&gt;join&lt;/span&gt; [Adventure Works].[$Customer] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; [Adventure Works].[$Date].[Calendar Year] = &lt;span style="color:#a31515;"&gt;&amp;#39;CY 2008&amp;#39;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;SQL queries have limitations as well: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You must specify SQLQueryMode=DataKeys in the connection string if you connect to Tabular. &lt;/li&gt;
&lt;li&gt;SQL queries don&amp;#39;t work with data security (row filters) in Tabular but they appear to work with dimension data security in Multidimensional. Attempting to execute a SQL query against a Tabular model with row filters will throw the following exception:&lt;br /&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;Tabular queries are not supported with row level security. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Unlike T-SQL, SSAS SQL queries support only the equal operator. Anything else and you&amp;#39;ll get the following error. This limitation precludes more complicated filtering, such as returning only transactions within a given date range.&lt;br /&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;Errors from the SQL query module: There is an unexpected operator in the WHERE clause. Only the Equals operator ( = ) is supported. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;You must use the Analysis Services OLE DB provider in SSRS. Unlike DRILLTHROUGH, you can use AND in the WHERE clause to support multi-valued parameters. However, since the Analysis Services OLE DB provider doesn&amp;#39;t support parameters, you must resort to using an expression-based query statement. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Feel-free to &lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/781992/improve-transactional-reporting-with-tabular"&gt;join me&lt;/a&gt; to escalate this issue to Microsoft because historical and transactional reporting are both very common scenarios. Thanks to its in-memory nature and more relaxed schema requirements, Tabular is best positioned to support both in a long run so I hope that Microsoft will make improvements in this area. For now, when SSAS doesn&amp;#39;t give you the performance you need, consider delegating transactional reporting to the Database Engine. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5707" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Analysis+Services/default.aspx">Analysis Services</category></item><item><title>Transactional Reporting with Tabular</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/17/transactional-reporting-with-tabular.aspx</link><pubDate>Mon, 18 Mar 2013 00:23:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5702</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5702</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/17/transactional-reporting-with-tabular.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: We had a requirement to replace the existing implementation of transactional reporting over large data volumes. By &amp;quot;transactional reporting&amp;quot; I mean allowing the user to query individual transactions as they&amp;#39;re stored in the fact table. In some cases, this style of reporting requires simply reading data without aggregations. This, of course is what RDBMS are designed for but in our case, requirements call for extending the reporting model with metadata about the item, such as the item barcode, alias, etc., as well as supporting fast aggregation analysis (for trend reports) and data security. In general, when implementing BI solutions, you should always have an analytical layer between the database and presentation layer for the reasons I discussed in the &amp;quot;Why an Analytical Layer?&amp;quot; &lt;a href="http://prologika.com/CS/blogs/blog/archive/2012/05/26/why-we-need-an-analytical-layer.aspx"&gt;blog&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Challenges&lt;/strong&gt;: Because of the in-memory nature of Tabular and more relaxed schema requirements, such as no separation of dimension and fact tables and ability to keep text-based columns in fact tables, we opted for Tabular on top of a data warehouse and star schema. Our initial schema included an Item dimension table (700 million rows) where the item metadata is kept and Transactions table (1.5 billion rows) that stores the item transactions. However, as we found out quickly, this design presented challenges for Tabular: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Excessive processing time - It took very long to process the initial model. By default, SSMS generates a transactional processing batch that supports processing multiple tables in parallel. However, if there is an error during processing the entire transaction is rolled back and you need start from scratch. To avoid this, we tried scripting the batch and changing it to non-transactional (Transaction=&amp;#39;false&amp;#39;). This option preserves the processed partitions but it doesn&amp;#39;t allow tables to be processed in parallel. This is by design to avoid unexpected interactions due to the potential cross-object dependencies in the recalculation chain. Since both the Item and Transactions tables were portioned, the net effect was that the processing was serialized by table and partition when two scripts for processing Item and Transactions are simultaneously executed (partition 1 of Transactions is processed, partition 1 of Item is processed, partition 2 of Transactions is processed, partition 2 of Item is processed, and so on). To make things worse, there is currently a bug with Tabular where the server builds relationships even when Process Data is used as a processing option which further slows down processing. &lt;/li&gt;
&lt;li&gt;Excessive memory footprint &amp;ndash; For some reason, Tabular used a lot of memory with the two table approach. Granted, we had to load the dataset twice (one for Item and a second time for Transactions) but still it should have taken less memory (see the memory footprint in the Solution section). The development server had 80 GB of RAM. We ran out of memory half-way during the full load and ended up with the in-memory model taking 65 GB of RAM. &lt;/li&gt;
&lt;li&gt;Excessing query time &amp;ndash; This was the worst. When we tried Power View as a reporting tool, each time the Item table was involved in the query, the report took more than a minute to finish. The report filter would return only in a few rows from the Transactions table but when the join was made to the Item table (one the one side of the Item-Transactions relationship), the report performance would degrade significantly. As it turned out, Tabular hasn&amp;#39;t been tuned for such scenarios where queries involve large dimension tables and the filter is applied on the fact table. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: To work around the Tabular limitations, we merged the two datasets by joining the Item and Transactions tables in a SQL view. This approach resolved all issues: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Processing time was reduced x10 because Tabular had to process only one large table. &lt;/li&gt;
&lt;li&gt;The memory footprint of the entire database with all the data was reduced to 13.5 GB. &lt;/li&gt;
&lt;li&gt;The query times went down to seconds. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only caveat is that processing would incur a hit because of the join between two large tables but we&amp;#39;d rather spend more time during processing than sacrificing query performance. &lt;/p&gt;
&lt;p&gt;At least for now, don&amp;#39;t be confused by the &amp;quot;relational&amp;quot; nature of Tabular. It&amp;#39;s still optimized for queries that request a restricted set of columns and aggregate data. Currently, it&amp;#39;s not optimized for transactional (detail-level) style of reporting that requires many columns and requests data at the lowest level. Microsoft is aware of this and would probably introduce optimizations in time. &lt;/p&gt;
&lt;p&gt;In a future blog, I&amp;#39;ll discuss techniques to optimize the query performance with transactional reporting and Tabular. Many thanks to Marius Dumitru (Principal Architect on the SSAS team) for answering my questions.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5702" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Analysis+Services/default.aspx">Analysis Services</category></item><item><title>Improving Tabular Design Experience</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/14/improving-tabular-design-experience.aspx</link><pubDate>Thu, 14 Mar 2013 12:17:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5699</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5699</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/14/improving-tabular-design-experience.aspx#comments</comments><description>&lt;p&gt;When you develop an organizational Tabular model in SSDT, there is always an implicit processing phase for each action you perform, such as renaming columns, creating hierarchies, changing formatting, and so on. This &amp;quot;data-driven&amp;quot; paradigm could be both a blessing and a curse. A blessing, because you always work with data and you don&amp;#39;t have to explicitly process the model to see the effect of the changes. And a curse, because each time you make a change the UI blocks until the change is committed and this can get old pretty soon. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: As long as you don&amp;#39;t use the Table Properties dialog or explicitly refresh the data, all changes are done directly in the Tabular database and Tabular doesn&amp;#39;t re-query the data source to refresh the data. &lt;/p&gt;
&lt;p&gt;While waiting for Microsoft to make the necessary changes, here are a few tips to improve your Tabular design experience: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In my experience, the size of the dataset doesn&amp;#39;t affect the duration of the &amp;quot;refresh&amp;quot; step. However, I always use a small dataset during development for faster processing. To do this, if you have a large table, partition the table in Tabular and load only one (e.g. the smallest) partition. If you have already loaded all partitions, you can clear all but one with Process Clear. Now, you have a small dataset to work with during development. Once you deploy to the QA or production server, you can process all partitions. &lt;/li&gt;
&lt;li&gt;Disable Automatic Calculation &amp;ndash; To do this, go to the Model menu and click Calculation Options -&amp;gt; Manual Calculation. Sometimes (depending on model/calculation complexity) disabling automatic calculation in SSDT may help make modeling operations more responsive. To update the calculated columns, once you&amp;#39;re done with the changes, do Model-&amp;gt;Calculate Now. Thanks to Marius for this tip. &lt;/li&gt;
&lt;li&gt;
&lt;div&gt;While the size of the dataset doesn&amp;#39;t affect the refresh duration, the hardware configuration of your development machine does. Suppose you have an underpowered company laptop and a more powerful personal laptop (lots of memory, solid state drive, many cores, etc.) If your company policy allows using your personal laptop, follow these steps to temporarily switch development during the change-intensive part of the design process: &lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Copy the source from the first laptop to your personal laptop. &lt;/li&gt;
&lt;li&gt;Back up and restore the workspace database to your local Analysis Services Tabular instance. If you follow my first tip, the workspace database should be fairly small. &lt;/li&gt;
&lt;li&gt;Load the project in SSDS and double-click the Model.bim file to initialize your environment. This will create a second empty workspace database to your local Tabular instance. Close the solution in SSDT. Now, open the Model.bim_&amp;lt;your name&amp;gt;.settings file in Notepad, find the &amp;lt;Database&amp;gt;element and change it to the name of the original workspace database. Open the solution in SSDT. Now you should see the data in your original workspace database. &lt;/li&gt;
&lt;li&gt;Perform the design changes. As a comparison, it takes about 5 seconds to commit a change on my laptop vs. 15 seconds on an underpowered laptop. &lt;/li&gt;
&lt;li&gt;Once you&amp;#39;re done with the changes, replace Model.bim and Model.bim.layout files on your company&amp;#39;s laptop.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5699" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Analysis+Services/default.aspx">Analysis Services</category></item><item><title>When Developers and BI Collide</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/09/when-developers-and-bi-collide.aspx</link><pubDate>Sat, 09 Mar 2013 23:36:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5698</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5698</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/09/when-developers-and-bi-collide.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been running in this situation quite often so I thought this will make a good topic for a blog. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; Management has asked for some sort of a BI solution, such as a dashboard. BI hasn&amp;#39;t happened to the organization in question yet. But they have smart developers and there is no project that they can&amp;#39;t do. As the story goes, developers go to work and whip out some code&amp;hellip; lots of it. Code for doing ETL, code for the database layer, and code for implementing the presentation layer, such as as a custom web application with cool third-party widgets. Everyone is happy... at least for a while. &lt;/p&gt;
&lt;p&gt;I don&amp;#39;t have an issue with developers. In fact, I spent most of my career writing code. However, there are several pitfalls with this approach so let&amp;#39;s mention some of them: &lt;/p&gt;
&lt;ol style="margin-left:54pt;"&gt;
&lt;li&gt;Custom code is expensive to write and maintain &amp;ndash; Developers are pulled away from their primary tasks to implement the BI solution. When the initial enthusiasm wears off, managers find it difficult to allocate developers to extending and maintaining the BI solution. &lt;/li&gt;
&lt;li&gt;You end up with a proprietary, tightly-coupled solution &amp;ndash; The solution would probably meet the initial goals but it might be difficult to extend. What if the custom web application is not enough and users prefer to analyze data in another tool, such as Microsoft Excel? Where are business calculations defined? How do you handle security? &lt;/li&gt;
&lt;li&gt;Not the right tools - There are many scenarios when writing custom code makes sense but BI is not one of it. There are specialized tools that are geared specifically toward BI. If you write custom code, more than likely you&amp;#39;ll face performance and maintenance challenges in a long run. &lt;/li&gt;
&lt;li&gt;Not a best practice &amp;ndash; Most projects start simply but grow in complexity over time. It&amp;#39;s not uncommon for management to ask for more features, such as analyzing data by other subject areas or drilling to details. What&amp;#39;s has started as a dashboard project might evolve to an end-to-end BI solution that requires a data warehouse, analytical layer, and different presentation options. &lt;/li&gt;
&lt;li&gt;Coders are not BI pros - I hate to say this but even the smartest programmers don&amp;#39;t know much or care about BI. More than likely, you&amp;#39;ll end with a normalized database and summary tables for improving performance with aggregates. Again, there tools and methodologies for BI so there is no point reinventing the wheel. If you don&amp;#39;t know better, hire someone who does. &amp;quot;When all you have is a hammer everything looks like a nail&amp;quot; paradigm won&amp;#39;t bring you too far. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: I&amp;#39;m sure you can add to the list, but what&amp;#39;s the solution? When you hear about BI or its manifestations, such as dashboards, reporting, analytics, etc., the following architecture should immediately come to mind. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://prologika.com/CS/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/blog/3806.biarch.png"&gt;&lt;img height="433" width="716" src="http://prologika.com/CS/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/blog/3806.biarch.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This architecture is somewhat simplified. For example, it doesn&amp;#39;t show a staging database but it has the main pieces and their corresponding technologies in the Microsoft BI platform: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A data warehouse whose schema is designed with reporting in mind. &lt;/li&gt;
&lt;li&gt;Integration services packages for ETL processes. They still have to be maintained but I dare to declare that maintaining SSIS is much easier that maintaining custom code. For example, it doesn&amp;#39;t require coding skills, it scales well, and it has a comprehensive logging infrastructure. &lt;/li&gt;
&lt;li&gt;An analytical layer, either as a multi-dimensional cube or a tabular model. This is the most overlooked piece but it&amp;#39;s the most important for the reasons I explained in my &amp;quot;Why an Analytical Layer?&amp;quot; &lt;a href="http://prologika.com/CS/blogs/blog/archive/2012/05/26/why-we-need-an-analytical-layer.aspx"&gt;blog&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Finally, just like a car manufacturer, you should strive to assemble your solution with prefabricated parts instead of writing custom code. For example, you can implement very compelling dashboards with Power View that uses your analytical layer as a data source without having to write a single line of code. Not to mention that you can delegate this task to business users. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, with custom code you can do anything, including features that you can&amp;#39;t get out of the box with prepackaged BI tools. However, you&amp;#39;ll be surprised how willing your management might be to compromise with features especially in this economy. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5698" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/General/default.aspx">General</category><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category></item><item><title>Adding a Set Total</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/08/adding-a-set-total.aspx</link><pubDate>Fri, 08 Mar 2013 20:47:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5697</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5697</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/08/adding-a-set-total.aspx#comments</comments><description>&lt;p&gt;Scenario: You have defined an MDX set in the cube script, such as a set that returns a few months. For the sake of simplicity, we will hardcode the months. &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CURRENTCUBE&lt;/span&gt;.[12Months] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;{ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].&amp;amp;[201302].&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(11):[Date].[Month].&amp;amp;[201302] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;}; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;As useful as the set might be, it has an issue. It doesn&amp;#39;t return the total and users might complain about it: &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.prologika.com/blog/030813_2047_AddingaSetT1.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Solution: As a first try, you might attempt to add the [All] member to the set: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CURRENTCUBE&lt;/span&gt;.[Last12Months] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;{ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].&amp;amp;[201302].&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(11):[Date].[Month].&amp;amp;[201302] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;+ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].[All] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;}; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You&amp;#39;re on the right path. Now, you&amp;#39;ll get the grand total row in Excel but it shows the unrestricted (non-visual total) total instead of the total across set members only. Instead, use the VisualTotals() function: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue;"&gt;&lt;strong&gt;DYNAMIC&lt;/strong&gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CURRENTCUBE&lt;/span&gt;.[12Months] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;{ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].&amp;amp;[201302].&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(11):[Date].[Month].&amp;amp;[201302] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;+ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:maroon;"&gt;VisualTotals&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;( &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;{ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].[All], &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].&amp;amp;[201302].&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(11):[Date].[Month].&amp;amp;[201302] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;} &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;}; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.prologika.com/blog/030813_2047_AddingaSetT2.png" alt="" /&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here, the VisualTotals function returns the All member with the total adjusted to set members only. Notice also that I&amp;#39;ve changed the set definition to by dynamic (DYNAMIC keyword) to force re-evaluation of the set. &lt;/p&gt;
&lt;p&gt;In a slightly more complicated scenario, what if you want the total to appear as an additional member of the set as opposed to a grand total row. One implementation approach will be to add a dimension calculated member to the Month hierarchy that does the aggregation and then add the new member to the set: &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;CREATE MEMBER&lt;/span&gt; CurrentCube.[Date].[Month].Agg &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;span style="color:maroon;"&gt;Aggregate&lt;/span&gt;(&lt;/span&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].&amp;amp;[201302].&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(11):[Date].[Month].&amp;amp;[201302]&lt;/span&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;)&lt;/span&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;&lt;span style="color:blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue;"&gt;SET&lt;/span&gt; &lt;span style="color:blue;"&gt;CURRENTCUBE&lt;/span&gt;.[12Months] &lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;{ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;[Date].[Month].&amp;amp;[201302].&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(11):[Date].[Month].&amp;amp;[201302] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;+ &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:10pt;"&gt;[Date].[Month].Agg&lt;/span&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;font-size:9pt;"&gt;}; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5697" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Analysis+Services/default.aspx">Analysis Services</category></item><item><title>Optimizing Massive SQL Joins</title><link>http://prologika.com/CS/blogs/blog/archive/2013/03/02/optimizing-massive-sql-joins.aspx</link><pubDate>Sun, 03 Mar 2013 01:12:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5695</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5695</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/03/02/optimizing-massive-sql-joins.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Run ETL to perform a full data warehouse load. One of the steps requires joining four biggish tables in a stating database with 1:M logical relationships. The tables have the following counts: &lt;/p&gt;
&lt;p&gt;VOUCHER: 1,802,743 &lt;/p&gt;
&lt;p&gt;VOUCHER_LINE: 2,183,469 &lt;/p&gt;
&lt;p&gt;DISTRIB_LINE: 2,658,726 &lt;/p&gt;
&lt;p&gt;VCHR_ACCTG_LINE: 10,242,414&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Observations&lt;/strong&gt;: On the development server, the SELECT query runs for hours. However, on the UAT server it finished within a few minutes. Both servers have the same data and hardware configuration, running SQL Server 2012 SP1.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Isolating the issue and coming up with a solution wasn&amp;#39;t easy. Once we ruled out resource bottlenecks (both servers have similar configuration and similar I/O throughput), we took a look at the estimated query plan (we couldn&amp;#39;t compare with the actual execution plan because we couldn&amp;#39;t wait for the query to finish on the slow server).&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We&amp;#39;ve notice that the query plans were very different between the two servers. Specifically, the estimated query plan on the fast server included parallelism and hash match join predicates. However, the slow server had merge M:M join predicates. This requires a tempdb work table for inner side rewinds which surely can cause performance degradation.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.prologika.com/blog/030313_0112_OptimizingM1.png" alt="" /&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Interestingly, the cardinality of the tables and estimated number of rows didn&amp;#39;t change much between the two plans. Yet, the query optimizer decided to choose very different plans. At this point, we figured that this could be an issue with statistics although both servers were configured to auto update statistics (to auto-update statistics SQL Server requires modifications to at least 20% of the rows in that table). The statistics on the slow server probably just happened to have a sample distribution that led to a particular path through the optimizer that ended up choosing a serial plan instead of a parallel plan. Initially, we tried sp_updatestats but we didn&amp;#39;t get an improvement. Then, we did &lt;span style="font-family:Courier New;"&gt;Update Statistics &amp;lt;table name&amp;gt; With Fullscan&lt;/span&gt; on the four tables. This resolved the issue and the query on the slow server executed in par with the query on the fast server.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Updating statistics with full scan is an expensive operation that probably shouldn&amp;#39;t be in your database maintenance plan. Instead, consider:&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. Stick with default sampled statistics &lt;/p&gt;
&lt;p&gt;2. Try hints for specific queries that exhibit slow performance, such as OPTION (HASH JOIN, LOOP JOIN) to preclude the expensive merge joins. &lt;/p&gt;
&lt;p&gt;Special thanks to fellow SQL Server MVPs, Magi Naumova, Paul White, Hugo Kornelis, and Erland Sommarskog for shedding light in dark places!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5695" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Data+Warehousing/default.aspx">Data Warehousing</category></item><item><title>CU2 for SQL Server 2012 SP1</title><link>http://prologika.com/CS/blogs/blog/archive/2013/02/27/cu2-for-sql-server-2012-sp1.aspx</link><pubDate>Wed, 27 Feb 2013 17:31:00 GMT</pubDate><guid isPermaLink="false">bb61d221-b363-4d22-8192-4aa25b39c5db:5694</guid><dc:creator>tlachev</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://prologika.com/CS/blogs/blog/rsscomments.aspx?PostID=5694</wfw:commentRss><comments>http://prologika.com/CS/blogs/blog/archive/2013/02/27/cu2-for-sql-server-2012-sp1.aspx#comments</comments><description>&lt;p&gt;Microsoft released a while back a cumulative update 2 for SQL Server 2012 SP1. Besides other things, it includes a fix for the &amp;quot;wide&amp;quot; MDX query performance degradation issue with Analysis Services that I previously &lt;a href="http://prologika.com/CS/blogs/blog/archive/2012/09/16/fix-for-wide-mdx-query-performance-degradation.aspx"&gt;reported&lt;/a&gt;. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/2778200"&gt;Knowledge base&lt;/a&gt; for the performance issue &lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/2790947"&gt;Knowledge base&lt;/a&gt; with SP1 CU2 download link &lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://prologika.com/CS/aggbug.aspx?PostID=5694" width="1" height="1"&gt;</description><category domain="http://prologika.com/CS/blogs/blog/archive/tags/Analysis+Services/default.aspx">Analysis Services</category></item></channel></rss>