-
Best Practice and Creative Data Visualization by Jen Underwood for Atlanta BI
April 29, 2013 / No Comments »
It looks like Atlanta BI Group will have a record attendance tonight with 74 people registered! Jen Underwood will present Best Practice and Creative Data Visualization. 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.
-
Windows Azure Infrastructure Services
April 16, 2013 / No Comments »
Microsoft announced 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's blog on this subject is very informative. Pricing get slashed too to be competitive with Amazon. What'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 good (5-15 GB/s) although it's likely that is likely you'll hit a bottleneck with your ISP on your way to and back from the cloud. And, speaking of BI, check the SQL Server Business Intelligence in Windows Azure Virtual Machines...
-
About Tableau 8
April 5, 2013 / 5 Comments »
Jen Underwood highly recommended I attend the Tableau 8 tour on Tuesday to witness firsthand its new features. Naturally, I couldn'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. Simplicity – A few months ago, I blogged 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. Visualization - Visualizations are yet...
-
Data Warehouse Physical Design Best Practices Session by Carlos Rodrigues at Atlanta BI Tonight
March 25, 2013 / No Comments »
It looks like Carlos will deliver another slam tonight with a record number of some 63 people registered and counting… Join our Atlanta BI meeting at 6:30 to see his Data Warehouse Physical Design Best Practices presentation.
-
Query Options for Analytical Models and Transactional Reporting
March 24, 2013 / No Comments »
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 Transactional Reporting with Tabular blog post. There are two query options that might provide some relief with transactional reporting and they both have limitations. DRILLTHROUGH QUERIES You can use a DRILLTHROUGH query 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: DRILLTHROUGH MAXROWS 1000 SELECT FROM [Adventure Works] WHERE ([Measures].[Reseller Sales Amount],[Product].[Category].[Accessories],[Date].[Calendar Year].&[2006]) RETURN [$Product].[Product], [$Date].[Date], [Reseller Sales].[Reseller Sales Amount], [Reseller Sales].[Reseller Tax Amount] And a similar query to Adventure Works Tabular: DRILLTHROUGH MAXROWS 1000 SELECT FROM [Model] WHERE ([Measures].[Reseller Total Sales],[Product].[Category].[Category].&[Accessories],[Date].[Calendar].[Year].&[2005]) RETURN [$Product].[Product Name], [$Date].[Date], [$Reseller Sales].[Sales Amount], [$Reseller Sales].[Tax Amount] Notice that the WHERE clause specifies the coordinate...
-
Transactional Reporting with Tabular
March 18, 2013 / No Comments »
Scenario: We had a requirement to replace the existing implementation of transactional reporting over large data volumes. By "transactional reporting" I mean allowing the user to query individual transactions as they'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 "Why an Analytical Layer?" blog. Challenges: 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...
-
Improving Tabular Design Experience
March 14, 2013 / No Comments »
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 "data-driven" paradigm could be both a blessing and a curse. A blessing, because you always work with data and you don'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. Note: As long as you don't use the Table Properties dialog or explicitly refresh the data, all changes are done directly in the Tabular database and Tabular doesn't re-query the data source to refresh the data. While waiting for Microsoft to make the necessary changes, here are a few tips to improve your Tabular design experience: In my...
-
When Developers and BI Collide
March 9, 2013 / No Comments »
I've been running in this situation quite often so I thought this will make a good topic for a blog. Scenario: Management has asked for some sort of a BI solution, such as a dashboard. BI hasn't happened to the organization in question yet. But they have smart developers and there is no project that they can't do. As the story goes, developers go to work and whip out some code… 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. I don'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's mention some of them: Custom code is expensive to write and maintain – Developers...
-
Adding a Set Total
March 8, 2013 / No Comments »
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. CREATE SET CURRENTCUBE.[12Months] AS { [Date].[Month].&[201302].Lag(11):[Date].[Month].&[201302] }; As useful as the set might be, it has an issue. It doesn't return the total and users might complain about it: Solution: As a first try, you might attempt to add the [All] member to the set: CREATE SET CURRENTCUBE.[Last12Months] AS { [Date].[Month].&[201302].Lag(11):[Date].[Month].&[201302] + [Date].[Month].[All] }; You're on the right path. Now, you'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: CREATE DYNAMIC SET CURRENTCUBE.[12Months] AS { [Date].[Month].&[201302].Lag(11):[Date].[Month].&[201302] + VisualTotals ( { [Date].[Month].[All], [Date].[Month].&[201302].Lag(11):[Date].[Month].&[201302] } ) }; Here, the VisualTotals function returns the All member with the total adjusted to set...
-
Optimizing Massive SQL Joins
March 3, 2013 / No Comments »
Scenario: 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: VOUCHER: 1,802,743 VOUCHER_LINE: 2,183,469 DISTRIB_LINE: 2,658,726 VCHR_ACCTG_LINE: 10,242,414 Observations: 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. Solution: Isolating the issue and coming up with a solution wasn'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't compare with the actual execution plan because we couldn't wait for the query to finish on the slow server). We've notice that the query plans were very different between the two servers. Specifically, the estimated...

We offer onsite and online Business Intelligence classes! Contact us about in-person training for groups of five or more students.


