<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Dave Rodabaugh's Cube</title><link>http://sqljunkies.com/WebLog/davescube/default.aspx</link><description>Cube trekking through the business intelligence universe with SQL Server, and drinking the blue Kool-Aid.</description><dc:language>en-US</dc:language><generator>CommunityServer 1.0 (Build: 1.0.1.50214)</generator><item><title>Deleted All Logins to SQL Server 2005 and Lost sa Password: You Did WHAT?  And BizTalk 2006 Is Using It?</title><link>http://sqljunkies.com/WebLog/davescube/archive/2008/04/11/111944.aspx</link><pubDate>Fri, 11 Apr 2008 13:46:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:111944</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/111944.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=111944</wfw:commentRss><description>&lt;P&gt;&lt;FONT&gt;It's been a while since I blogged but I had a circumstance yesterday that I thought was noteworthy.&amp;nbsp; Recently my employer cut our staff to about 1/4 of what it was nine months ago, so all of us in "management" are now hands-on.&amp;nbsp; I've inherited DBA work (since we cut the DBA), something of which I've not done much in the past eight years during a BI career.&amp;nbsp; I have always appreciated what competent DBA's do for those of us in BI development.&amp;nbsp; I'm sure I'll appreciate it more as time progresses.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;As the title suggests, I committed an egregious error.&amp;nbsp; I was working on a dev server and needed to reload a database which hasn't yet gone to production.&amp;nbsp; I inherited the database and the application from a consultant (yup, cut him too) and it hasn't been fully loaded.&amp;nbsp; As part of the work, I thought I'd build an "initial load" procedure and add it to the documentation.&amp;nbsp; One of the methods for initialization is to create the database with a script, so I had SSMS write a script.&amp;nbsp; I told it to script the database logins.&amp;nbsp; Did I read the script before punching the go-giddy button?&amp;nbsp; No.&amp;nbsp; In a few seconds, the script errored out saying that I didn't have permission to create logins.&amp;nbsp; Huh?&amp;nbsp; Of course I do!&amp;nbsp; I'm a sysadmin.&amp;nbsp; A few more minutes of sleuthing revealed the disaster:&amp;nbsp; I had deleted every single login in that server.&amp;nbsp; Every last one, including myself.&amp;nbsp; I had even whacked Builtin/administrators.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Shortly thereafter I realized we didn't have the sa password.&amp;nbsp; I had completely locked myself out of my own server.&amp;nbsp; What to do?&amp;nbsp; I considered a full rebuild of the server, but there were 17 user-defined database on the server.&amp;nbsp; Additionally, the majority of those databases were for a dev instance of BizTalk 2006, and while I'm not an experienced DBA, I worked with our DBA during initial installation of BizTalk 2006 and knew that it wasn't backed up or restored conventionally.&amp;nbsp; Plus, there was a dev SharePoint installation using the SQL Server as well and I knew even less about the restore procedures for that.&amp;nbsp; I was felling a little sick at that point.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;A quick Web search revealed that Microsoft has left a trap door in SQL Server 2005 for this problem.&amp;nbsp; You may find a simple and correct procedure for resetting a lost sa password when you cannot otherwise get access to the server, in the following link: &lt;/FONT&gt;&lt;FONT&gt;&lt;A href="http://blogs.msdn.com/raulga/archive/2007/07/12/disaster-recovery-what-to-do-when-the-sa-account-password-is-lost-in-sql-server-2005.aspx"&gt;http://blogs.msdn.com/raulga/archive/2007/07/12/disaster-recovery-what-to-do-when-the-sa-account-password-is-lost-in-sql-server-2005.aspx&lt;/A&gt;.&amp;nbsp; I did exactly what Raul Garcia told me to do, and it worked!&amp;nbsp; Restart the server in maintenance mode and then add a user to the the sysadmin role with sp_addsrvrolemember.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Next, I ran only the portions of the offending script which created logins.&amp;nbsp; But was I done?&amp;nbsp; Hardly.&amp;nbsp; Inspection of the script (in which I asked for descriptive headers) told me that all SQL Server logins would be recreated with a random password and automatically disabled.&amp;nbsp; I only had four of those, but I had to find the application passwords and make them match, and then enable the accounts.&amp;nbsp; I also noticed that the associations between those logins and their database users seemed to be incorrect.&amp;nbsp; I reset those with SSMS and they seemed to be working fine.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Next, I noticed that none of my backup jobs were running.&amp;nbsp; SQL Agent could not access SQL Server.&amp;nbsp; I use the same domain account to start both the SQL Server service and SQL Agent, but I had wiped out the permissions of that domain account.&amp;nbsp; I fixed the problem by adding a login for the service account to SQL Server and gave it sa rights.&amp;nbsp; I'm sure this is not the best possible way I could have solved that problem, but I can go back and fix it later.&amp;nbsp; The highest priority of any DBA is to safeguard the company's data and this was only a dev server.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Finally, the SQL Server log showed that the BizTalk accounts could not log on to SQL Server.&amp;nbsp;&amp;nbsp; The message shown in the log was something like this:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;STRONG&gt;&lt;EM&gt;Login failed for user '&amp;lt;domain&amp;gt;\&amp;lt;domain user&amp;gt;'. [CLIENT: 10.1.2.17]&lt;/EM&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;STRONG&gt;&lt;EM&gt;Error: 18456, Severity: 14, State: 16&lt;/EM&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;State 16 seems to indicate that a login has no permissions in a database which it is querying.&amp;nbsp; Running sp_change_users_login with the "Report" option showed nothing.&amp;nbsp; All of the BizTalk users had proper associations in their databases, just as SSMS said they did.&amp;nbsp; Furthermore, we got the Windows password for one of the BizTalk Windows accounts and logged in to the server.&amp;nbsp; We were able to connect to all the proper databases and query tables, just the permissions said we would.&amp;nbsp; In other words, BizTalk was having no real problem connecting to SQL Server and querying its databases.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;So, what kept causing the problem?&amp;nbsp; We noted that the errors only occurred after restarting the SQL Server service, and then only one time.&amp;nbsp; A ha!&amp;nbsp; Is it possible that BizTalk was trying to connect to SQL Server and access its databases before the restart recovery is complete?&amp;nbsp; Yes!&amp;nbsp; Had I been more observant, I would have seen this in the log file.&amp;nbsp; We put this to the test by stopping the BizTalk services on the BizTalk dev server and restarting the SQL Server service.&amp;nbsp; Sure enough, the errors disappeared.&amp;nbsp; It was nothing more than an order of operations issue.&amp;nbsp; BizTalk tries to connect very quickly when it loses its SQL Server connection.&amp;nbsp; It was trying to access a database before recovery was complete.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;So that's the saga.&amp;nbsp; Here's what we learned:&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT&gt;Don't let Dave be your DBA on production servers if he can't stop destroying dev servers.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT&gt;Always have current backups.&amp;nbsp; We did, so I knew I could get back if the method described herein didn't work.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT&gt;BizTalk is a very complicated system.&amp;nbsp; You'd better practice restoring it because if you really have to do it, it could take hours just to know the process for recovery.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT&gt;Always record your sa passwords and securely store them.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT&gt;Read database creation scripts BEFORE you execute them.&amp;nbsp; Five minutes of reading may save four hours' work.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT&gt;Microsoft has provided a way to create a new admin account on SQL Server even if you are boneheaded enough to completely sever access to SQL Server.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=111944" width="1" height="1"&gt;</description></item><item><title>Drillthrough failed because the coordinate identified by the SELECT clause is out of range: Cause and Solution</title><link>http://sqljunkies.com/WebLog/davescube/archive/2007/07/26/50475.aspx</link><pubDate>Thu, 26 Jul 2007 18:10:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:50475</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/50475.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=50475</wfw:commentRss><description>&lt;FONT face="Courier New"&gt;
&lt;P&gt;&lt;EM&gt;&lt;FONT&gt;Drillthrough failed because the coordinate identified by the SELECT clause is out of range.&lt;/FONT&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT&gt;Ever gotten message shown above when using DRILLTHROUGH in SSAS?&amp;nbsp;I prepared the &lt;I&gt;Integrating Analysis Services 2005 and Reporting Services 2005 with DRILLTHROUGH&lt;/I&gt; series after encountering significant problems with drillthrough on a real project that absolutely required drillthrough. Solving the drillthrough mystery was not the easiest problem ever solved, and just when we thought every problem was conquered, another one struck.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;My teammate encountered this error while authoring a report that quried a sample SSAS database I built with data only for October 2006.&amp;nbsp; (The database was for a client.)&amp;nbsp;Despite only one month if fact data, the Date dimension had several years’ members. He wrote a multidimensional selector component which extended Reporting Services to navigate a multidimensional hierarchy, and he was testing this with the report using our newfound drillthrough solution. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;His initial query looked like this:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;DRILLTHROUGH&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;SELECT&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;NON EMPTY &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;[Measures].[SomeMember]&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt; ON COLUMNS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;[SomeCube]&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;WHERE&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;[Date].[Calendar].[Month].[Oct 2006]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT&gt;He then parameterized the query to insert any month into the WHERE clause after the user picked a month in the selector component. While testing, everything worked as long as he picked October 2006, which actually had data. As soon as he picked any month other than October 2006, a strange error occurred, shown below:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%201.JPG"&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;How can a coordinate identified by the SELECT clause of an MDX query be out of range? By definition, SSAS requires one coordinate from every hierarchy, andd if one is not supplied by the query then SSAS uses default members. It seems impossible to "identify" a coordinate that is "out of range."&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;I conjured two possible&amp;nbsp;causes.&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT&gt;In SSRS, a DMX query is used to make drillthrough work. Perhaps this was an error related to DMX.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT&gt;The error had nothing to do with MDX or DMX at all. Since drillthrough queries are not answered as MDX queries, perhaps this error was actually thrown by the code executing the DRILLTHROUGH statement.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT&gt;I had no way of directly testing the first possibility. But I was able to triangulate to the second possibility because the MDX query worked perfectly when the DRILLTHROUGH keyword was removed. I also knew that the query could only return one cell because by definition, drillthrough acts upon a single cell.&amp;nbsp; For Oct 2006, the returned cell had a numerical value because the dates descended from Oct 2006 had data. For Sep 2006, the returned cell had a NULL numerical value because none of the dates descended from Sep 2006 had data. Said in the vernacular, the cell was empty.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;To illustrate this, I’ve modified Adventure Works DW by deleting the Reseller_Sales_2003 partition in the Reseller Sales measure group. The following query shows that there is now no data for [Ship Date].[Calendar].[Calendar Year].&amp;amp;[2003].&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;SELECT&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT&gt;Measures.[Reseller Sales Amount] &lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;ON&lt;/FONT&gt; &lt;FONT&gt;COLUMNS&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT&gt;[Ship Date].[Calendar].[Calendar Year].&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;Members&lt;/FONT&gt; &lt;FONT&gt;ON&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt;ROWS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;[Adventure Works]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT&gt;That query returns the following cellset.m&amp;nbsp; Note that CY 2003 is now empty, a result of deleting the the partition with CY 2003's data.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%202.JPG"&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;The following query is analogous to the real-world query which produced the error, but without the DRILLTHROUGH keyword.&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT&gt;SELECT&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;NON&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt; &lt;FONT&gt;EMPTY&lt;/FONT&gt; Measures.[Reseller Sales Amount] &lt;FONT&gt;ON&lt;/FONT&gt; &lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;COLUMNS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;[Adventure Works]&lt;/P&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;WHERE&lt;/P&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;[Ship Date].[Calendar].[Calendar Year].&amp;amp;[2003]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT&gt;That query returned the following cellset.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%203.JPG"&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Two interesting observations emerge from the answer returned to Microsoft SQL Server Management Studio.&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT&gt;The Results tab is completely blank.&amp;nbsp; (Not shown in the screenshot above.)&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT&gt;The Messages tab, however, displays the information pictured below.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT&gt;This message indicates that the cell set consists of 1 row and 0 columns. To be honest, I’m not sure what this means, but I know it is significant because things change when the NON EMPTY keyword is removed. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;First, the Results tab is no longer blank, as shown below.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%204.JPG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Second, the Messages tab has a different message than before.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%205.JPG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;So, comparing the two, when the NON EMPTY keyword is present, no cells are returned, and "1 rows and 0 columns" is the technical way of describing this. When the NON EMPTY keyword is removed, one empty cell is returned (as expected) and "2 rows and 1 columns" is the technical way to say this.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;At this point I had a major clue. This must be a problem when DRILLTHROUGH was combined with NON EMPTY. Removing NON EMPTY and putting DRILLTHROUGH back in the query returned the following result.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%206.JPG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;And this was the Messages tab.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;IMG src="file:///E:/Drillthrough%20pictures/Picture%207.JPG"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;Bingo! &lt;STRONG&gt;The error at the beginning of this article is caused when drillthrough executes on a cellset that does not exist.&lt;/STRONG&gt;&amp;nbsp;The following two items are now evident.&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT&gt;DRILLTHROUGH will not work when the cell set consists of zero cells, which would be produced by a NON EMPTY query against a cell which has no data.&amp;nbsp; This is perfectly sensible since drillthrough acts upon a single cell.&amp;nbsp; Naturally, when there is no cell, there can be no drillthrough.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT&gt;DRILLTHROUGH will work when the cell set consists of one empty cell. In such a case, DRILLTHROUGH returns no rowset, which is the expected case for an empty cell since it has no value. There is no fact row for this cell; DRILLTHROUGH should return nothing.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT&gt;In other words, DRILLTHROUGH must have a real cell set upon which to act, even if that cell set is a lone empty cell.&amp;nbsp;This gives rise to an important rule for drillthrough queries.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;STRONG&gt;Do not use the NON EMPTY keyword in a DRILTHROUGH query.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;IMPORTANT NOTE: This rule applies ONLY to queries using the DRILLTHROUGH keyword. As noted in my four parter on drillthrough, it is possible to emulate a drillthrough query by using a crossjoin MDX query. The NON EMPTY prohibition does NOT apply to the crossjoin approach; indeed, NON EMPTY may be desired in certain circumstances.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=50475" width="1" height="1"&gt;</description></item><item><title>Integrating Analysis Services 2005 and Reporting Services 2005 with DRILLTHROUGH:  Part IV of IV</title><link>http://sqljunkies.com/WebLog/davescube/archive/2007/07/26/50471.aspx</link><pubDate>Thu, 26 Jul 2007 18:02:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:50471</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/50471.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=50471</wfw:commentRss><description>&lt;P&gt;&lt;STRONG&gt;CONCLUSION&lt;/STRONG&gt;&lt;/P&gt;&lt;FONT&gt;
&lt;P&gt;Drillthrough is changed substantially in SSAS because Microsoft rearchitected it. SSAS will no longer prepare an SQL statement to pass through the data provider to the data source, and pass along a rowset returned by the data source. All drillthrough queries must be answered from SSAS, using the information present in UDM. &lt;/P&gt;
&lt;P&gt;The goal of drillthrough in SSAS should be the same as it was for MSAS: return one row for each row in the fact table, regardless of how many detail cells are underneath the cell upon which drillthrough occurs. (NOTE:&amp;nbsp; I am aware that drillthrough is actually more sophisticated than this and can return rowsets at nearly any grain, but if it will not produce the fact row set, then flexibility is limited.)&amp;nbsp;&amp;nbsp;Since SSAS now answers all drillthrough queries directly, savvy DW/BI designers must adhere to several prominent design elements, most notably enforcement of fact row uniqueness. The goal is to produce a one-to-one relationship between fact rows and detail cube cells. One cell should have one and only one fact row.&lt;/P&gt;
&lt;P&gt;While SSAS will work fine without unique fact rows for aggregate and analytical queries, it simply cannot produce&amp;nbsp;the most granular&amp;nbsp;drillthrough query without fact row uniqueness. Decide whether drillthrough requirements require fact row uniqueness&amp;nbsp;&lt;EM&gt;before&lt;/EM&gt; ETL and cube builds, because it&amp;nbsp;may be very difficult to add once a cube is in production.&lt;/P&gt;
&lt;P&gt;Add a dimension with an attribute to hold the column or columns that make fact rows unique. This attribute will have as many members as rows in the fact table, so it could be very large. Take steps to control it. Techniques include making it a ROLAP dimension and perhaps hiding it if it is useful only to drillthrough queries.&amp;nbsp;This dimension ties into a measure group by using the fact dimension relationship.&amp;nbsp; CAUTION:&amp;nbsp; ROLAP dimensions must be processed the first time they are queried, which could result in extraordinarily long query times.&amp;nbsp; Cnosider MOLAP first.&lt;/P&gt;
&lt;P&gt;Once the one-to-one relationship between fact rows and detail cells is enforced, drillthrough queries can be written with two divergent techniques. The first is to use the DRILLTHROUGH keyword in an MDX query. The DRILLTHROUGH keyword requires an MDX query that returns a single cell, and then returns one row for each detail cell under the single cell. The second is to use an MDX statement to emulate drillthrough and produce a cell set. This is done with an inordinate number of crossjoins, but it works.&lt;/P&gt;
&lt;P&gt;Even though these two query options produce the same answer, choose one or the other carefully based on performance. The query using the DRILLTHROUGH keyword does not execute as an MDX query and basic testing shows it is faster than its crossjoin counterpart. Indeed, be very wary of the crossjoin alternative. Crossjoin queries slow down considerably as the number of members being crossed increased, and since the fact dimension contains one member for each fact row, the crossjoin approach can become unwieldly very quickly.&amp;nbsp; Remember, the point of this series is to integrate SSRS with SSAS using drillthrough, and drillthrough returns a nice, flattened rowset convenient for SSRS.&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=50471" width="1" height="1"&gt;</description></item><item><title>Integrating Reporting Services 2005 and Analysis Services 2005 with DRILLTHROUGH: Part III of IV</title><link>http://sqljunkies.com/WebLog/davescube/archive/2007/07/26/50470.aspx</link><pubDate>Thu, 26 Jul 2007 18:02:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:50470</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/50470.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=50470</wfw:commentRss><description>&lt;P&gt;&lt;FONT&gt;I have been most delinquent in finishing this multi-part series on drillthrough with SSAS and SSRS.&amp;nbsp; I wrote all the parts of this series at one time in December, 2006, but only posted two.&amp;nbsp; Four weeks ago a client asked about specific problems with drillthrough, and I had all the answers he needed in the total blog series, including pieces that I hadn't published.&amp;nbsp; I though&amp;nbsp;that perhaps I should finish posting the series.&lt;/P&gt;
&lt;P&gt;Parts I and II of this series demonstrated the differences in drillthrough from MSAS to SSAS, and listed design implications for the entire DW/BI manufacturing pipeline. This section discusses ways to write effective drillthrough queries.&lt;/P&gt;
&lt;P&gt;The introduction of this series stated that web research did not provide a single, conclusive way to handle drillthrough in SSAS. As noted, the first hint of trouble was the inability of SSRS to use DRILLTHROUGH in an MDX query. SSRS returned the following error: "Failed to parse the query to detect if it is MDX or DMX. (MDXQueryGenerator)".&lt;/P&gt;&lt;/FONT&gt;&lt;U&gt;&lt;FONT&gt;
&lt;P&gt;&lt;A href="http://connect.microsoft.com/SQLServer/feecback/ViewFeedback.aspx?FeedbackID=126175"&gt;http://connect.microsoft.com/SQLServer/feecback/ViewFeedback.aspx?FeedbackID=126175&lt;/A&gt;&amp;nbsp;&lt;/U&gt;&lt;/FONT&gt;&lt;FONT&gt;shows the bug and Microsoft’s response, which is that drillthrough queries are not supported in the SSAS integration with SSRS because MDX can effectively duplicate the fact rowset. Part I of this series demonstrated empirically that this statement is not always true. Part II outlined the conditions in which the statement is true, and how those conditions influence design.&lt;/P&gt;
&lt;P&gt;A Web search reveals two workarounds.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Use the OLE DB for OLAP 9.0 provider. &lt;/FONT&gt;&lt;U&gt;&lt;FONT&gt;&lt;A href="http://groups.google.com/group/microsoft.public.sqlserver.olap/msg/85a65872f286686b"&gt;http://groups.google.com/group/microsoft.public.sqlserver.olap/msg/85a65872f286686b&lt;/A&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;FONT&gt; &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT&gt;Darren Gosbel posted a second workaround, using a DMX query with the DRILLTHROUGH keyword. This works surprisingly well. &lt;/FONT&gt;&lt;U&gt;&lt;FONT&gt;&lt;A href="http://connect.microsoft.com/SQLServer/feedback/Workaround.aspx?FeedbackID=126175"&gt;http://connect.microsoft.com/SQLServer/feedback/Workaround.aspx?FeedbackID=126175&lt;/A&gt; &lt;/U&gt;&lt;/FONT&gt;&lt;FONT&gt;&amp;nbsp;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;So, apparently there are three ways to write drillthrough when integrating SSRS with SSAS.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use the OLE DB for OLAP 9.0 provider instead of a native provider. This approach is undesirable if the source is SQL Server, since the native provider probably performs better OLE DB. It may also affect parameterization in SSRS, and it makes little sense to use a query that limits reporting functionality. This is "the old way" complete with the drawbacks of "the old way." 
&lt;LI&gt;Use a DMX query with the DRILLTHROUGH keyword. As noted, this works quite well but it requires any new report writer to know the workaround. 
&lt;LI&gt;Write a crossjoin MDX query that returns the correct rowset.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Option (1) is discarded. That leaves options (2) and (3). The following examples illustrate how they work.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT&gt;Example for Option (2): DRILLTHOUGH with an MDX query.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The following example illustrates how the DRILLTHROUGH keyword works with an MDX query (and also with a DMX query in SSRS). Like Parts I and II, this example uses the Adventure Works DW cube and the Reseller Sales measure group. (All of these queries may be run in SQL Server Management Studio.)&lt;/P&gt;
&lt;P&gt;The following is the most basic drillthrough MDX query:&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT&gt;DRILLTHROUGH&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;MAXROWS&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; 100000&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;SELECT&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt;[Measures].[Reseller Sales Amount] &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;ON&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT&gt;COLUMNS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&lt;FONT&gt;[Adventure Works]&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;It returns the following columns:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Sales Amount]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Order Quantity]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Extended Amount]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Tax Amount][Reseller Sales].[Reseller Freight Cost]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Discount Amount]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Unit Price]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Unit Price Discount Percent]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Total Product Cost]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales].[Reseller Standard Product]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Reseller].[Reseller]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Promotion].[Promotion]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Employee].[Employee]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Delivery Date].[Date]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Sales Territory].[Sales Territory Region]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Reseller Sales Order Details].[Carrier Tracking Number]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Reseller Sales Order Details].[Customer PO Number]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Reseller Sales Order Details].[Sales Order Number]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Reseller Sales Order Details].[Sales Order Line]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Product].[Product]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Ship Date].[Date]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Source Currency].[Source Currency Code]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Date].[Date]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Geography].[City]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Geography].[State-Province]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Geography].[Country]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;[$Destination Currency].[Destination Currency Code]&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;Several observations emerge from the results set:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The query returns 80,655 rows. This is the exact number of rows in the fact table underneath the Reseller Sales measure group, and is the correct answer. Since SSAS answers all drillthrough queries and does not pass the request on to the data source, the one-to-one relationship between detail cell and fact row is evidenced. 
&lt;LI&gt;Dimension columns are prefixed with a "$". Measure columns have no such prefix. 
&lt;LI&gt;Ten measures are returned by the query. These are the ten measures with their Visible property set to True. Those measures with their Visible property set to False are not returned by default. They can be returned if the optional RETURN keyword is used and the columns are explicitly listed therein. 
&lt;LI&gt;Both the Reseller Sales Order Details and Geography dimension returned non-key attributes. This is because their key attributes have their AttributeHierarchyVisible property set to False. 
&lt;LI&gt;All other dimensions have key attributes with AttributeHierarchyVisible property set to True. These dimensions return only their key attribute.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Additional attributes and hidden measures may be returned with this query if the RETURN keyword is used. However, this will require all return columns to be explicitly listed in the RETURN clause. RETURN also permits column aliasing, which may particularly useful to comply with organizational standards for SSRS data set column names.&lt;/P&gt;
&lt;P&gt;Additional considerations apply.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Of course, a WHERE clause may be added to this query as required. 
&lt;LI&gt;It does not matter which measure is called in AXIS (0); the query always returns the same set of columns (absent the RETURN clause). 
&lt;LI&gt;The query sends CPU utilization for msmdsrv.exe to maximum capacity. This test was conducted on a laptop with a P4 HT, and only one of the virtual CPU’s answered the query. 
&lt;LI&gt;There appears to be some caching effect. The first query took about four minutes to run. Repeating the query reduced completion time to 10’s of seconds. 
&lt;LI&gt;DRILLTHROUGH will not return calculated members. Anything returned by DRILLTHROUGH must be tied directly to an attribute or measure, which in turn relies directly upon a DSV column.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT&gt;&lt;STRONG&gt;Example for Option (3): Emulating DRILLTHROUGH with an MDX Query.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The following example illustrates how MDX may be used to emulate a DRILLTHROUGH query. This example assumes that the proper design criteria have been met to emulate drillthrough with MDX. (See part II of this series.) This example uses the Adventure Works DW cube and the Reseller Sales measure group. (All of these queries may be run in SQL Server Management Studio.)&lt;/P&gt;
&lt;P&gt;Deepak Puri correctly assessed the lone requirement to emulate a drillthrough query with MDX when he said, "…you need to include the fact dimension key attribute, so that each fact table row is returned, regardless of how many contribute to each cell." Any other attribute or measure in the query may add content, but it will not change the number of rows returned by the query.&lt;/P&gt;
&lt;P&gt;The following query returns 60,855 rows from Reseller Sales in Adventure Works DW.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;SELECT&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&lt;FONT&gt;[Measures].&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt;Members&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;ON&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;COLUMNS&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;,&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;&lt;FONT&gt;NON&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;EMPTY&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;[Reseller Sales Order Details].[Reseller Sales Orders].[Order Line] &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT face="Courier New"&gt;ON&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT&gt;ROWS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;
&lt;P&gt;[Adventure Works]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;Observations about this query include the following:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The query returns 60,855 rows. This is the exact number of fact rows and provides evidence that MDX queries can be used to emulate drillthrough so long as the proper design techniques are employed. 
&lt;LI&gt;This query returned all physical measures in the cube. Since not all measures originate with the Reseller Sales measure group, not all measures can be sliced by the Reseller Sales Order Details dimension. The values returned by those measures will be for the All member in that dimension and will have the same large value in every row. Be sure to explicitly list the measures to be returned in the query. 
&lt;LI&gt;This query returned no calculated members. 
&lt;LI&gt;A WHERE clause may be added as required. 
&lt;LI&gt;Caching effect is large. The first time the query was run execution time was 10:12. The second time the query was run execution time was 3:06. 
&lt;LI&gt;Performance conditions were identical to the previous example since the same machine was used, in the same configuration.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Additional attributes may be added as desired to the previous query.&lt;/P&gt;
&lt;P&gt;Is it possible to prove that the only important part of drillthrough emulation is to include the key attribute of the fact dimension? Indeed it is. Suppose the previous query is altered so that &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales Order Details].[Reseller Sales Orders].[Order Line] &lt;/FONT&gt;&lt;FONT&gt;is replaced by&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; [Date].[Date].[Date]&lt;/FONT&gt;&lt;FONT&gt; to form the query shown below.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Times New Roman"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;SELECT&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT&gt;[Measures].&lt;FONT&gt;Members&lt;/FONT&gt; &lt;FONT&gt;ON&lt;/FONT&gt; &lt;FONT&gt;COLUMNS&lt;/FONT&gt;,&lt;/FONT&gt;&lt;/P&gt;&lt;FONT&gt;
&lt;P&gt;&lt;FONT&gt;NON&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt; &lt;FONT&gt;EMPTY&lt;/FONT&gt; [Date].[Date].[Date] &lt;FONT&gt;ON&lt;/FONT&gt; &lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;ROWS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT&gt;[Adventure Works] &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;FONT&gt;
&lt;P&gt;This query returns 1,159 rows and clearly does NOT emulate drillthrough. &lt;/P&gt;
&lt;P&gt;What is required to make this query return multiple attributes while still emulating drillthrough? Crossjoins. Lots and lots of crossjoins. The previous query is modified to reinsert &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;[Reseller Sales Order Details].[Reseller Sales Orders].[Order Line] &lt;/FONT&gt;&lt;FONT&gt;to make it a drillthrough query again, as shown below.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Times New Roman"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;SELECT&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT&gt;[Measures].&lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;Members&lt;/FONT&gt; &lt;FONT&gt;ON&lt;/FONT&gt; &lt;FONT&gt;COLUMNS&lt;/FONT&gt;,&lt;/P&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;&lt;FONT&gt;NON&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt; &lt;FONT&gt;EMPTY&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt; { [Date].[Date].[Date] *&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;[Reseller Sales Order Details].[Reseller Sales Orders].[Order Line] } &lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;ON&lt;/FONT&gt; &lt;/FONT&gt;&lt;FONT&gt;&lt;FONT&gt;ROWS&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT&gt;FROM&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;[Adventure Works]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;FONT&gt;
&lt;P&gt;This particular query takes a very long time to run but it returns 60,855 rows, as expected. Specifying a single measure instead of [Measures].Members on Axis 0 would make the query much faster.&lt;/P&gt;
&lt;P&gt;So, Microsoft really DID know what they were talking about.&amp;nbsp; You can either use the DRILLTHROUGH keyword, or model UDM so that MDX produces a granular rowset.&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=50470" width="1" height="1"&gt;</description></item><item><title>Integrating Analysis Services 2005 and Reporting Services 2005 with DRILLTHROUGH: Part II of IV</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/12/02/25830.aspx</link><pubDate>Sat, 02 Dec 2006 21:03:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:25830</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/25830.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=25830</wfw:commentRss><description>&lt;P&gt;&lt;SPAN&gt;Part II of IV: Design Implications of the New Drillthrough&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Part I of this series showed that using drillthrough in SSAS is hit-or-miss.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Drilling through the top cell in the Adventure Works cube returned a rowcount identical to that of the FactResellerSales table underpinning the Reseller Sales measure group.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Another example, from a real-world project, showed that this is not a reliable indicator of drillthrough’s behavior.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In that example, drillthrough returned fewer rows than the fact table contained, even though the sum of dollars was correct.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Microsoft has intentionally changed the behavior of drillthrough to return one row per nonempty detail cell that feeds the cell upon which drillthrough acts.&lt;BR&gt;This is decidedly unsatisfactory if the goal is to show the actual fact rows that contributed to a cell, not a rowset imitated by detail cells.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;There are three possible ways to address this change.&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Tell the users such detail is no longer available.&amp;nbsp; This will surely go over like the proverbial lead zeppelin and does not show a servant's heart.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Force drillthrough behavior by using parameterized relational queries.&amp;nbsp; This is not a satisfactory approach since it adds complexity to report authoring and assumes an available and capable relational data source.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Alter multidimenional design principles to accommodate the new reality.&amp;nbsp; Use an MDX query with crossjoins or with the DRILLTHROUGH keyword to provide drillthrough.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN&gt;The third option is the only viable option.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Since drillthrough seems to return one row for each detail cell that comprises the target cell, there must be a way to ensure that each cell contains one and only one fact row.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This suggestion will rankle many.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As noted earlier, the point of using OLAP is to have a single cell for a value, regardless of how many fact rows correspond to that tuple.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Stated another way, it was legitimate to have many fact rows per single detail cell.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But for the “new” drillthrough to work properly, this relationship must be changed to one cube detail cell per one and only one fact row.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;If each detail cell has one and only one fact row, then drillthrough has no choice but to return one row per fact row.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This can be codified with the following rules.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;For drillthrough in SSAS to return fact rows based only on UDM information, each detail cell must have one and only one fact row.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;For each detail cell to have one and only one fact row, each fact row must be dimensionally unique.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;No two rows may have the same combination of surrogate keys.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;SSAS has two features to enable this design change.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;I&gt;&lt;SPAN&gt;SSAS permits an optional primary key in the DSV fact table.&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This key can be a combination of existing dimensional columns, or it can be a value manufactured by ETL to ensure uniqueness.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;I&gt;&lt;SPAN&gt;SSAS permits fact dimensions.&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Christian Wade has an excellent explanation of this nifty new feature at &lt;A href="http://blogs.conchango.com/christianwade/archive/2005/04/07/1255.aspx"&gt;http://blogs.conchango.com/christianwade/archive/2005/04/07/1255.aspx&lt;/A&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;This fact table primary key becomes a dimension attribute in the fact dimension, which allows a UDM attribute to enforce the one-to-one relationship between a detail cell and a fact row. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;It can be invisible, to be used only when called by a drillthrough query.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Beware though, as it could exact a hefty toll on SSAS.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Imagine having one attribute member for every single row in the fact table!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Such an attribute would be prodigious.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The multidimensional lattice could grow from “huge” to “unimaginably monstrous.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For those running on 32-bit Windows with the ongoing 3GB RAM limitation, this could be a huge problem even with the slick new dimension memory management in SSAS.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Making the fact dimension a ROLAP dimension may be a good idea, and it may be possible to disable the attribute hierarchy for that attribute as well.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Part I of this series used Adventure Works DW as an example.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This example is carried forward now, since it illustrates how these techniques are implemented in the Reseller Sales measure group.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Inspection reveals the following:&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;The FactResellerSales table in the AdventureWorksDW SQL database has a unique constraint on the SalesOrderNumber and SalesOrderLineNumber columns.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;The FactResellerSales table in the DSV reveals a compound primary key on the SalesOrderNumber and SalesOrderLineNumber columns.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;UDM contains a ROLAP dimension called Reseller Sales Order Details.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The key attribute, called Reseller Sales Order, is a combination of SalesOrderNumber and SalesOrderLineNumber.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;The Reseller Sales measure group ties to the Reseller Sales Order Details dimension with a fact dimension relationship to the Reseller Sales Order attribute.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;The upshot of all this is that each detail cell in the Reseller Sales measure group can have one and only one fact row.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;Clearly, SSAS drillthrough creates design ripples all the way back through the DW/BI manufacturing pipeline.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The following guidelines specify practices if drillthrough is desired.&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;STRONG&gt;Facts must have primary keys.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;ETL and the data pipeline must be able to manufacture meaningful unique identifiers for each fact row.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The preferred unique identifier is a combination of meaningful attributes.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Identity columns are less desirable since these keys need to be semi-permanent; that is, if the fact table is dropped and recreated with identical data, all of the values in the table primary keys should be as they were.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Failure to enforce this will require complete reprocessing of the dimension holding the fact table’s primary key as an attribute, and every measure group using that dimension.&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;STRONG&gt;A PK must be designated on the fact table in the SSAS DSV.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;STRONG&gt;A dimension and attribute must be created to pull this key into UDM&lt;/STRONG&gt;&lt;EM&gt;.&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This dimension ideally has real business meaning (like an order number and detail line number that could never be duplicated).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;And regardless of its meaning, it could be huge.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Suppose a fact table contains one billion rows.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;There will be literally one billion members populating the attribute.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The new fact dimension in SSAS is tailor-made for this role.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The dimension can be populated directly from the fact table without the need to build and populate separate dimension tables in the data source, or carry those objects forward in the DSV.&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;The storage mode must be carefully considered when building this dimension.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As Christian Wade points out, SSAS now permits MOLAP partition storage with ROLAP dimensions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If this dimension is not used for anything other than drillthrough imitation, then ROLAP could be an ideal choice.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Dimension processing times will be greatly reduced, and queries that do not directly use the dimension can ignore this dimension.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;STRONG&gt;A decision must be made about how to author drillthrough queries.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The DRILLTHROUGH keyword in MDX will still work.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The alternative is to write a hefty crossjoin MDX query.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The next part of this series will compare these two methods.&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;STRONG&gt;Limit drillthrough queries.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This limitation takes two forms.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;First, account for drillthrough during design, by designating which measure groups will be use for drillthrough.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Not all measure groups will be used for drillthrough, and in many cases, the data available to SSAS will not have a natural primary key for the fact data.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If drillthrough is not required, then there is no mandate to create a unique fact key.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Second, carefully control where and how drillthrough is executed.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For small cubes, the query response time for any type of drillthrough query is immaterial.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For cubes with huge data (e.g. – a billion fact rows), drillthrough on high-level cube cells would be disastrous, regardless of the method by which the query is answered.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Ensure that MAXROWS is set properly.&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=25830" width="1" height="1"&gt;</description></item><item><title>Integrating Analysis Services 2005 and Reporting Services 2005 with DRILLTHROUGH: Part I of IV</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/12/02/25828.aspx</link><pubDate>Sat, 02 Dec 2006 20:43:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:25828</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/25828.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=25828</wfw:commentRss><description>&lt;SPAN&gt;
&lt;P&gt;&lt;SPAN&gt;Part I of IV:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Two Examples Show that the New Drillthrough May Not Always Behave Like the Old Drillthrough&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;As noted in a previous post, there was usually no compelling reason for a fact table to have a primary key since there was no need for row uniqueness in the fact table.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Since there may be readers who erroneously dispute this, an example is in order.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Suppose a customer buys three identical hammers at a big orange home improvement retailer. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;The cashier swipes them one at a time and places them in the bag.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The fact table that records these occurrences has a grain of day, store, cashier, and product, with a measure of quantity and price.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Is it okay to write three rows into the fact table?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Yes.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Could ETL aggregate these identical facts into a single row?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Also, yes.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Does Analysis Services care?&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Not one whit, aside from some additional processing time to load three rows instead of one.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But keeping three rows is a convenient way to count the number of scanner swipes, and these three rows will be perfectly identical.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Drillthrough on a cell might return all three identical rows to the client and this occurrence was easily factored into the data warehouse design.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But this does not work for Analysis Services 2005 (“SSAS”) because drillthrough has been rearchitected.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Two examples will show how fundamental these changes are; in fact, the changes are so pervasive that (a) MSAS cubes using DRILLTHROUGH will lose their DRILLTHROUGH upon migration to SSAS, and (b) the “new” DRILLTHROUGH returns a completely different answer in SSAS than it did in MSAS.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;The first example provides evidence that drillthrough in SSAS can provide the same answer as the old drillthrough.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It uses the AdventureWorksDW sample database for SQL Server 2005, and the Adventure Works DW sample database for SSAS.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It focuses solely upon the Reseller Sales measure group, which has the following characteristics:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;The DSV fact table is FactResellerSales.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;&lt;SPAN&gt;The measures in question are Reseller Sales Amount (source column: SalesAmount) and Reseller Transaction Count (rowcount aggregate function).&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;Reseller Transaction Count is a hidden measure.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;The first QA any good Analysis Services architect/developer performs is a rowcount check and top cell summary check.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;This first step in the check is to know what the “right” answer is.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In this case, the right answer is 100% of the rows in FactResellerSales and the sum of the SalesAmount column.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The following query provides the control totals:&lt;/SPAN&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN&gt;SELECT&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;count&lt;/SPAN&gt;&lt;SPAN&gt;(*)&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;as&lt;/SPAN&gt; ResellerSalesRowcount&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;SalesAmount&lt;SPAN&gt;)&lt;/SPAN&gt; &lt;SPAN&gt;as&lt;/SPAN&gt; ResellerSalesTotalSales&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;FROM&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;dbo&lt;SPAN&gt;.&lt;/SPAN&gt;FactResellerSales&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;ResellerSalesRowcount = 60,855&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;ResellerSalesTotalSales = $80,450,596.9823&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN&gt;Any drillthrough operation should return 60,855 rows and total dollars of $80,450,596.98.&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;The following MDX query executes a DRILLTHROUGH statement on the Adventure Works cube:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN&gt;DRILLTHROUGH&lt;/SPAN&gt;&lt;SPAN&gt; &lt;SPAN&gt;MAXROWS&lt;/SPAN&gt; 100000&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;SELECT&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;[Measures].[Reseller Transaction Count] &lt;SPAN&gt;ON&lt;/SPAN&gt; &lt;SPAN&gt;COLUMNS&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;FROM&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;[Adventure Works]&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN&gt;(Note:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;MAXROWS is set to 10,000 by default.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Since this fact table has far more than 10,000 rows, MAXROWS is set to 100,000.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This query also returns 60,855 rows, which is the correct answer.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Do not be fooled into thinking that this one example proves that drillthrough in SSAS will always return the right answer.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The second example, which uses the aforementioned cash report, shows that drillthrough may not always return the correct answer.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The cash report fact table has 20,473 rows in the fact table.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But a drillthrough query, identical in form to the query used in the first example, sent back only 18,585 rows.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The sum of the dollars returned by the drillthrough set was correct.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So the dollars were right, but the rowcount was wrong.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;After adding a rowcount measure to the measure group and running the query again, the results were plain.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In SSAS, drillthrough does not return every row that went into the cell being drilled.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In fact, it does not even query the data source.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(&lt;A href="http://msdn2.microsoft.com/en-us/library/ms345125.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms345125.aspx&lt;/A&gt;) It returns one row for each detail cell in the cube that contributed to the cell upon which drillthrough occurs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So the 18,585 rows returned by the DRILLTHROUGH statement represent 18,585 distinct combinations of member values for the non-empty detail cells comprising the aggregate cell.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Examination of the rowcount measure showed many fact rows with duplicate dimensionality, but not amounts (48 in one case, 41 in another, etc.)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In all cases the dollar value returned for the drillthrough row was the sum of the fact rows that went into the detail cell represented by the drillthrough row.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In other words, drillthrough reported that there were 48 fact rows that populated that detail cell, but it refused to return the individual rows.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This was not acceptable since the cash report requires one row for each transaction, even if they are dimensionally identical.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The difference between MSAS and SSAS can be summarized with these two points:&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;In MSAS, drillthrough queries the MSAS data source with an SQL statement and returns the fact rows underneath the cell upon which drillthrough acts.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;In SSAS, drillthrough does not query the SSAS data source.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It queries the cube and returns one row for each detail cell underneath the cell upon which drillthrough acts.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;An obvious implication of this new behavior is that all information returned by drillthrough must reside solely with SSAS as UDM attributes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;When asked about this behavior, Microsoft’s response was, “This is by design.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You can write all drillthrough queries as MDX now.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Darren Gosbel wrote a bug report about it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(&lt;A href="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=126175"&gt;http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=126175&lt;/A&gt;)&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Is the latter part really true?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Can you really write all drillthrough queries as MDX?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Yes, &lt;I&gt;but only if you modify your design to accommodate the “new” drillthrough&lt;/I&gt;, because Microsoft changed the rules of the game from MSAS to SSAS.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The next installment of this series will address the changes required in fact and dimension design to accommodate the new DRILLTHROUGH.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;FONT&gt;&lt;/FONT&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=25828" width="1" height="1"&gt;</description></item><item><title>Integrating Analysis Services 2005 and Reporting Services 2005 with DRILLTHROUGH; Introduction</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/12/02/25827.aspx</link><pubDate>Sat, 02 Dec 2006 20:14:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:25827</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/25827.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=25827</wfw:commentRss><description>&lt;P&gt;&lt;SPAN&gt;My current client has engaged my employer to implement a financial reporting solution.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The first report we chose was a cash report, which displays details not usually carried in a cube.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In the past, I never worried about uniqueness of fact rows because it was unnecessary.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Having completely identical rows in a fact table was perfectly legitimate, a fact giving indigestion to many traditional data modelers.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;When Analysis Services 2000 (“MSAS”) loads duplicate rows into the cube, it simply aggregates the measures into the single designated cell identified by the dimensional tuple formed by the surrogate key combination.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is one of the things we love about Analysis Services, that it provides (semi) detailed and aggregated information on a moment’s notice.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;But sometimes you need to see more detail than the cube provides.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Sometimes you need to see the individual fact rows contributing to a cell because reports require such detail.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The aforementioned cash report is little more than a rote listing of all cash transactions for a particular period, e.g. 2006.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;While the dimensions which form the cash report provide some finely grained information, there are many cash transactions with duplicate dimensionality (though different dollar amounts).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;These are aggregated into a single detail cell, as expected.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But the report needs those detail fact rows.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In MSAS, drillthrough on a single cell returned the fact rows (with designated dimensional columns) from the cell’s data source.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It did this by forming an SQL statement, pushing it back through the data provider, and passing along the rowset which answered the query.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This handy technique allowed very detailed reporting and analysis without overstressing MSAS, though it carried no performance guarantees since query performance was governed by data source performance, not MSAS itself.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;While developing the cash report, I needed fact rows so I turned to the trusty DRILLTHROUGH statement.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;To my chagrin, it didn’t return the correct answer.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Specifically, it didn’t return the correct number of rows.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This began a frantic search to understand why drillthrough was not behaving as expected.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I was tipped off by Teo Lachev’s book, which said that drillthrough had been completely rearchitected and that Analysis Services 2005 (“SSAS”) answered all drillthrough queries from the cube.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Uh oh.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;That had nasty implications that I’ll discuss later and it has forced me to change a couple of design guidelines.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;A Web search yielded a lot of clues, but nothing in one place that allowed me to craft a solution.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I hope to provide a solution here, in multiple parts.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is the first part in a series to explain how DRILLTHROUGH has changed and how you must change your design techniques to properly utilize it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I will reference several websites when appropriate, for I stand on the shoulders of giants.&amp;nbsp; And should I err in this series, I trust my fellow cubers to provide the truth.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Part I:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Two Examples Show that SSS Drillthrough May Not Always Behave Like&amp;nbsp;MSAS Drillthrough&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Part II:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Design Implications of the New Drillthrough&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Part III:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Query Examples for SSAS Drillthrough&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Part IV:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Summary&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=25827" width="1" height="1"&gt;</description></item><item><title>My First In-Depth Study of SSIS</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/07/06/22120.aspx</link><pubDate>Fri, 07 Jul 2006 01:52:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:22120</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/22120.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=22120</wfw:commentRss><description>&lt;P&gt;I'm a BI guy.&amp;nbsp; I've been mashing on data and building cubes for several years.&amp;nbsp; I've always tended to avoid DTS because there were performance aspects of it I didn't like. In fact, I never considered it a true enterprise-scale tool, a position which has inflamed the passions of several coworkers in the past year as we discuss SSIS.&amp;nbsp; One even said, "I could pluck a star from the sky with DTS!"&amp;nbsp; Perhaps, but you had to build your own rocket to do it.&lt;/P&gt;
&lt;P&gt;Without a good ETL tool, my cohorts and I always tended to use the "dump and chase" method.&amp;nbsp; We'd suck the data into a SQL Server data warehouse staging area, and then write stored procedures to transform and cleanse the data.&amp;nbsp; This method was not intuitive and required prodigious T-SQL skill,&amp;nbsp;but it ensured performance because we could easily tune the database with indexes, and it gave us great error handling capabilities to boot.&lt;/P&gt;
&lt;P&gt;I'm newly employed as an application development manager for a small upstart BI shop in my hometown.&amp;nbsp; One of my responsibilties is to make technical and technological decisions.&amp;nbsp; It's a foregone conclusion that we're a Microsoft shop; I wouldn't have taken the job without such assurance because that's where my expertise lies and I believe in their framework, products, and vision for BI.&amp;nbsp; So it's SQL Server, SSIS, SSAS, and SSRS.&amp;nbsp; Since ETL seems to chew up the vast majority of an end-to-end BI project, I chose SSIS as my first learning target.&amp;nbsp; I don't need detailed expertise, but I need to be able to use it and guide others in its proper usage.&lt;/P&gt;
&lt;P&gt;So now I'm studying this strange new offering in detail and&amp;nbsp;I'm impressed.&amp;nbsp; It's intuitive and everything DTS wasn't.&amp;nbsp; What I love the most is how well it conforms to everyting else Microsoft does.&amp;nbsp; It runs as a service.&amp;nbsp; The packages are saved to dtsx, an XML implementation read by SSIS.&amp;nbsp; It's extensible by .NET.&amp;nbsp; Event handlers provide an easy way to see what's going on.&amp;nbsp; The list is much larger, of course, but I'm citing a few to illustrate that if you just pick a point in the Microsoft BI continuum and start studying, you'll learn the approach and lexicon for nearly everything else as well.&lt;/P&gt;
&lt;P&gt;Jon Baker and I are studying for certification.&amp;nbsp; We've tackled XML first because it's arguably the area about which we are most ignorant.&amp;nbsp; At first, I thought it would be an academic curiosity, though admittedly a LARGE one.&amp;nbsp; I was completely wrong.&amp;nbsp; To say it's pervasive is like saying I breathe air about 30 times per minute. I've come to the conclusion that you can't be a SQL Server 2005 product expert without an in-depth knowledge of XML and how it's used in the SQL Server suite of products.&lt;/P&gt;
&lt;P&gt;If you're like me, you don't like to study.&amp;nbsp; I say it like this:&amp;nbsp; "I don't like to study, but I love to know."&amp;nbsp; Of course, the former begets the latter, so I have to study despite my distaste and my present struggles have reminded me that it's not important what you start studying; it's only important that you study.&amp;nbsp; You're going to see the same things in so many places that you'll eventually assemble a coherent mental picture about SQL Server 2005.&amp;nbsp; I'm fairly jealous of Allen White and others who already have your 2005 certs, but I'm willing to put in my time.&amp;nbsp; For now, that's SSIS.&amp;nbsp; I highly recommend diving in if you're a Microsoft BI guy because you're going to need detailed knowledge of this fabulous new product.&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=22120" width="1" height="1"&gt;</description></item><item><title>Part V of My Analysis Services Interview Questions:  The Most Common MDX Functions</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/06/25/22019.aspx</link><pubDate>Mon, 26 Jun 2006 02:25:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:22019</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/22019.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=22019</wfw:commentRss><description>&lt;P&gt;&lt;SPAN&gt;I have a litmus test for true multidimensional expertise:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;MDX.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve found MDX to be so potent that I freely admit my own inadequacies.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I study it, I use it, and I consult with others who do the same, but I know there’s more.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;If somebody says they know Analysis Services, I want to see their MDX.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Show me somebody who doesn’t know MDX, and I’ll show you a pretender.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Remember, I don’t ask closed-ended questions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve heard interviewers say, “Do you know MDX?”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Of course, the answer is always “Yes” but this answer tells you nothing of what the candidate actually knows.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I have two favorite MDX questions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;Question 1:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;What MDX functions do you most commonly use?&lt;o:p&gt;&lt;/o:p&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This is a great question because you only know this answer by experience.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you ask me this question, the answer practically rushes out of me.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;“CrossJoin, Descendants, and NonEmpty, in addition to Sum, Count, and Aggregate.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;My personal favorite is CrossJoin because it allows me identify non-contiguous slices of the cube and aggregate even though those cube cells don’t roll up to a natural ancestor.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Indeed, CrossJoin has easily been my bread and butter.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;If you stammer and stutter, you’re in trouble.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If the first word out of your mouth is “sum” without any explanation of how you use it, you’re in trouble.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;Question 2:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Where do you put calculated members?&lt;o:p&gt;&lt;/o:p&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The reflexive answer is “in the Measures dimension” but this is the obvious answer.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So I always follow up with another question.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;“If you want to create a calculated member that intersects all measures, where do you put it?”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;A high percentage of candidates can’t answer this question, and the answer is “In a dimension other than Measures.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If they can answer it, I immediately ask them why.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The answer is “Because a member in a dimension cannot intersect its own relatives in that dimension.”&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Then I ask a real toughy.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG&gt;“Where would you put a calculated member if you wanted it to intersect all other dimensions?”&lt;/STRONG&gt;&lt;SPAN&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&amp;nbsp; &lt;/SPAN&gt;You can hear the wheels turning with this question.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You can’t put it in the Measures dimension because it wouldn’t intersect the other measures.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You can’t put it in, say, the Time dimension because it wouldn’t intersect the other Time members.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The answer is simple but not obvious unless you’re very creative or somebody told you the answer. (Somebody told me the answer when I first started learning Analysis Services.)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You create a dummy dimension solely for the purpose of holding those calculated members!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;My friends and I refer to this dimension as a “hanger dimension” because the only function it serves is to “hang” calculated members.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Any member placed therein will intersect all other dimensions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In fact, you can use multiple hangers.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is particularly handy if you have calculated members that need to intersect all other user-defined dimensions, Measures, *and* another hanger dimension.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In an earlier post I mentioned a fabulous lady who has taught me many things.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;She wasn’t able to answer this particular question.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;When I told her the answer, she immediately understood it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It didn’t affect my recommendation to the boss because she was so good.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You’ll never believe what she told me when she arrived for her first day of work.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;She said, “Do you remember the question you asked me about the hanger dimension?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;After I hung up the phone, I pulled up Analysis Manager and tried it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It worked really well.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Wow!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;No wonder we like her so much!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;She even learns during interviews!&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=22019" width="1" height="1"&gt;</description></item><item><title>Part IV of My Analysis Services Interview Questions: Technical Features</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/06/22/21998.aspx</link><pubDate>Fri, 23 Jun 2006 00:38:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:21998</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/21998.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=21998</wfw:commentRss><description>&lt;P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In parts two and three of this multi-part series on Analysis Services I discussed interview questions about cool business problems and architectural/design philosophies.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The third level of questioning I use deals with product features.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You’ll always get these questions if you fail one or both of the first two because even if you aren’t an architect, you could be very productive while working under an architect.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Plus, if you’re an ambitious learner, you’ll become an architect by learning from an architect.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Sometimes I even ask the technical questions if you pass the first two questions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Remember, I’m not just looking for answers.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’m also watching your thought process.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I want to see passion, and I’ve found the best people can hardly wait to tell you about the great things they’ve done, and when you ask them a question, the answer practically leaps out of them.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So if you answer the first two correctly, but I’m not convinced, you may still get the technical questions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;(Interesting story:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;one fabulous lady I worked with was annoyed when we hired a guy who clearly knew what he was doing, but of whom I asked no technical questions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;She said she was bothered by this, and asked my why I’d done this.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I said, “Because he clearly knew what he was doing and I’m satisfied that he knew the technical details as well.” He was passionate and articulate.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But I told her that we’d ask technical questions in the next interviews if it made her comfortable, and we did that for two more interviews. But she changed her mind when she figured out that people who really know how to use Analysis Services also know its features.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;She once noted that I didn’t hammer her in her phone interview.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I replied that I could tell she was thoughtful, passionate, and a great learner.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I wasn’t wrong.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;To this day that lady is one of the very finest technologists I have ever met, and I would work with her anywhere, anytime.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Though I have left the client for whom she works, we still talk regularly.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Even my technical questions are stratified.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;My favorite technical question is “How do you optimize a dimension?”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(Remember, this question’s context was Analysis Services 2000.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The correct answer has four parts:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;(1)&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;If possible, ensure that member keys are unique across a given level, and&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;(2)&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;If possible, ensure that member keys are unique across the entire dimension.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;(3)&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;If possible, ensure that member names are unique across a given level, and&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN&gt;(4)&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;If possible, ensure that member names are unique across a given dimension.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;When this is achieved, you have very compact dimensions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;When answering queries, Analysis Services can avoid assigning context to members by using ancestral chains, and things get very quick and compact.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In my mind, this is the first technique for excellence in Analysis Services, and only two or three people have ever answered it correctly.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Usually the respondent, eager to get up after being knocked down by the two prior questions, blurts out, “I go to Tools and select Optimize Schema.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;They’re usually shocked when I inform them that this isn’t the correct answer because Optimize Schema optimizes a cube, and I asked about optimizing a dimension.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Honestly, I’ve never had a candidate answer the question correctly if this is their first answer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;My second favorite question is about optimizing the cube schema.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Nearly all candidates know what this feature is and have used it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I avoid closed-ended questions like “Have you ever optimized a cube schema?” because the answer is a simple, “Yes.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This doesn’t tell me what you know, so I always ask what optimizing a cube schema does.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Ironically, the same people who use schema optimization to answer the dimension optimization question don’t know what schema optimization actually does, or why it’s used.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The answer is that it reduces or eliminates joins in the cube processing SQL statement.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It may be the most powerful technique to improve cube processing performance (assuming ample hardware and parallel partition processing that doesn’t swamp the server, and moderate aggregations).&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;One candidate, who took a beating on the two high level questions, also took a beating on these two technical questions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He was obviously unaccustomed to this because after a half hour he said, “Well, maybe you just haven’t actually done this.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This new tack caught me a little off guard since I had explained to him he couldn’t articulate any cool business problems, he didn’t have any strong architectural philosophies with which I agreed (and I told him why), and he didn’t know how to optimize a dimension.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I even told him *why* these things were important and what the right answers were.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In addition to getting the answers wrong, he demonstrated that he wasn’t teachable, a bad trait for any technologist since we must learn continuously.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He was notable not only because of his belligerence, but also because he only had one name on his resume.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He’d concatenated his first and last name into a single word, which had eight syllables and was in a foreign tongue.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He left quite an impression, and six months later when his resume landed on our desks from a different staffing company, we immediately put it into the circular file.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Ignorance, belligerence, and a goofy name are a bad combination.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=21998" width="1" height="1"&gt;</description></item><item><title>Part III of My Analysis Services Interview Questions:  Architectural Philosophy</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/06/21/21989.aspx</link><pubDate>Wed, 21 Jun 2006 21:58:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:21989</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/21989.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=21989</wfw:commentRss><description>&lt;P&gt;&lt;SPAN&gt;In the previous installment of Dave’s Cube, I laid out my first interview question for Analysis Services candidates.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Since I use an adaptive technique, I start with the hard questions and move to technical questions later (if necessary).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;My first interview question is always about cool business problems that you’ve solved with Analysis Services.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As noted, that’s rough for most people, but it doesn’t get easier with the second question.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;My second question is always about architectural/design philosophies.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I don’t ask too many closed-ended questions because I want you to talk, so I know what you know.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I usually ask the following question:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;“Do you have any particular design philosophies or architectural principles that you will use to guide this client toward best practices?”&lt;o:p&gt;&lt;/o:p&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Believe it or not, you can say something different than I would without consequence, as long as you can provide your reasoning. (You must also be correct, of course.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Telling me it’s red when I know it’s blue won’t work, even if you have reasons.)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’m a stickler for best practices because they are the authority upon which you stand when telling a client how best to implement a product they’ve probably never used.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Here are some of the answers I expect to hear:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;“I recommend that a client always carry as much detail as possible into the data warehouse and into a cube.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Details may use extra space and CPU cycles, but they ensure the future value of the application because they enable the most calculations to be performed upon that data without rework back into the data warehouse and/or cube.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Details often carry negligible incremental cost on first development.”&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;“I like to use as many dimensions/attributes as suggested by the data – even if those attributes are not in the business requirements.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The incremental time required to design and populate those extra attributes is usually negligible, but the business will often request those dimensions as filters and slicers for calculations they modify or identify late in the process, or even after a project is closed and customer acceptance is complete.”&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;“I design first for query performance, and then second for processing performance.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The purpose of an Analysis Services implementation is to serve quantitative answers to end users; query performance is paramount.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Processing performance issues can usually be solved by tuning in the relational layer and by eliminating joins in the cube processing statement.”&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;These answers tell me two things.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;First, you know best practices and you’ve actually used them.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The reasoning behind a philosophy usually only comes from experience.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Second, I know immediately when you are a learner and a thinker because such people answer this question *immediately* and with passion.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I have received the same spate of humorous answers I’ve received for my first interview question:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;EM&gt;“I use surrogate keys.”&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Personally, I prefer skeleton keys since they’re very versatile.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;EM&gt;“I love star schemas.”&lt;/EM&gt; &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Me too.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;And Buckeye football.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;And Chevrolet Corvettes.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;And my kids.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But I digress… None of these are architectural philosophies.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Of course, the Underpants Gnomes hold sway in the mind of many people answering this question.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Recently I figured out why.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Underpants Gnomes wear cones on their heads.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Dogs hate cats.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Buckeyes and Wolverines are at perpetual enmity. Everybody knows that cones hate cubes, but they don’t have an annual contest to settle the score one&amp;nbsp;November Saturday&amp;nbsp;at noon (unless ABC says to play at 3:30 PM).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The Underpants Gnomes consider infiltration into the minds of aspiring Analysis Services candidates a dutiful service to Gnomekind!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Kill the cubes!&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Has a candidate ever answered quickly and passionately with a wrong answer?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Only once.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We were interviewing a candidate from NYC who said he was an Analysis Services architect.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He was articulate, smooth, and eager.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He laid out some very good business problems he’d solved with Analysis Services, and we were feeling good since it’s hard to find experienced, thoughtful Analysis Services resources.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;His answer to this question flabbergasted us.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He said, “Use as few dimensions as possible.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Upon inquiry, he divulged his reasoning.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;“Every time I add more dimensions to the cube, cube processing slows down to the point where I can’t process the cubes.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This man was freely sacrificing the power of multidimensional databasing (dimensions) on the altar of performance because he couldn’t figure out how to tune the technology!&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I told him that not only did the three people on our end disagree with him, but we had empirical evidence that he was wrong.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We had cubes with 50 or more dimensions in them, yet we could process them just as quickly as if they had only five dimensions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Since he failed a high-level question, I immediately drilled into technical knowledge.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I asked him if he knew how to optimize a cube schema.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Oddly, he answered this question by discussing dimension optimization, a question that flunks all but the most knowledgeable of Analysis Services people.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He said that he could make dimension keys and names unique, which is great but doesn’t help you optimize a cube schema.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Incredibly, this promising guy had used Analysis Services for years but had never once bothered to learn about optimizing a cube schema.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I explained to him that when he adds dimensions to a cube, Analysis Services adds a join to the SQL statement it issues against the data provider.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(He said he’d never looked at the SQL statement, a sensible answer since he didn’t know he could do anything to change it.)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;By optimizing the cube schema, you reduce or completely eliminate the joins in the cube processing statement.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Naturally, queries against a single table in the data source can have nearly instantaneous response times and marvelously high row payout rates, often choking either the RDBMS or Analysis Server.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You can theoretically add an infinite number of dimensions and not appreciably slow cube processing.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(Remember: I was interviewing for Analysis Services 2000 positions; the answer will vary somewhat for SSAS.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;He knew he was cooked.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You could hear it in his voice.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I think the full weight of his error hit him quickly.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;He hadn’t just missed a prominent performance tuning feature in Analysis Services.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;No, he’d been giving clients architectural advice based on this glaring error.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I told him that after he hangs up the phone, spending two hours with Books Online to read up on this feature would make a much better Analysis Services expert than he was before the phone call.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;It was obvious that he was experienced, smart, and teachable.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;What he didn’t know what that we asked the boss if we could bring him on anyway since we were pretty sure we could fill in his holes with little effort.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Sadly, his hourly rate was so high that the boss rejected him.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you’re going to ask for a mountain of money you need to at least know as much (and hopefully more) than everybody else.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Dave Ramsey says, “In our economy, you get paid for what you know.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I modify that to the following: “In our economy, you get paid more than the next guy depending on how much more you know than the next guy.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We’re both right.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN&gt;Study hard when mastering Analysis Services!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It pays!&lt;/SPAN&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=21989" width="1" height="1"&gt;</description></item><item><title>Part II of My Analysis Services Interview Questions:  Cool Business Problems</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/06/20/21982.aspx</link><pubDate>Tue, 20 Jun 2006 17:42:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:21982</guid><dc:creator>drodabaugh</dc:creator><slash:comments>0</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/21982.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=21982</wfw:commentRss><description>&lt;P&gt;&lt;SPAN&gt;I’ve seen a variety of techniques used by staffing companies to combat the beating I’ve given their previous candidates.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Though I’ve never been hit by the bait-and-switch, candidates have tried to look up answers during the interview; they’ve had somebody in the room with them; and the last technique seemed to be the group interview.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In addition to the candidate, the phone interview would include the sales rep for the staffing company, and often another technologist.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Why?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;To write down the questions, of course!&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;I can only guess that the last candidate I rejected complained about how unfair the interview was, and the recruiter wants to be sure they get every advantage possible and they think they’ll get a leg up by writing what I ask.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Fair enough, but it won't help you because&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;I’ve learned some great interviewing techniques, like asking follow-on questions based on your first answer.&amp;nbsp; I understand that the goal for a staffing company is to put cheeks into paying seats, but that's not my goal when I'm interviewing, or when I'm a candidate.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I use an axiom in the classroom and with client personnel who are learning business intelligence:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;if you can’t articulate the answer, you don’t know it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Some will say, “I know the answer.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It’s in my head but I can’t tell you what it is.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I repeat:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;if you can’t articulate something, you don’t know it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The only evidence of knowledge is its articulation, so let’s lay out a couple of rules.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Rule 1:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you can’t articulate something, you don’t know it.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Rule 2:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you think you know it but just can’t communicate it, refer to Rule 1.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I always start with high-level business questions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I believe that technical knowledge is the easiest of all skills to acquire.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Writing, speaking, architecting, and mentoring are far more difficult.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Complex business problems require passionate people with creative solutions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The high-level questions explore all of these at one time.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I want to know if you’re a thinker and a learner, squeezing as much as possible from your experiences.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I usually lead with the following:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;EM&gt;“Tell me about some great business problems you’ve solved with Analysis Services.”&lt;/EM&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I expect to hear an answer like this:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;“I used Analysis Services to provide certification supplier metrics for a retail supply chain.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The database and cube(s) that provided these answers had 45 dimensions, about 10 measures, and 25 calculated members.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;My favorite metric was a ratio of dollars ordered to dollars received because the business could ensure they were getting what they paid for. Additionally, they were able to reduce back office labor for receiving because they could avoid detail receiving for suppliers they knew were doing well.”&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Some of the answers I’ve actually received are downright comical.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;“I used surrogate keys.”&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;That’s very nice, but it’s hardly a business problem.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;EM&gt;“I built a star schema.”&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Stating an obvious architecture is not evidence that you really know what you’re doing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;EM&gt;“I used MDX.”&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;That’s good!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Perhaps you used dimensions and cubes as well, but quoting product features provides no evidence of problem solutions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN&gt;But my favorite is a maddening three-part answer vaguely reminiscent of the Underpants Gnomes in a certain South Park episode.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The Underpants Gnomes were “experts” in big business because “underpants are big business!” The Underpants Gnomes had three steps:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Step 1:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Collect underpants.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Step 2:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;?&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Step 3:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Profits!&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;Here’s what I get as the most common answer to the question about business solutions.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;“First, I talk to the business and gather requirements.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Then I make a design.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Then I build software.”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;See?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It IS the Underpants Gnomes, who would say it like this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Step 1:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Collect business requirements.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Step 2:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Make a design.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;&lt;SPAN&gt;Step 3:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Build software.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;Of course, this isn’t a business solution.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It’s an approach to solving problems and it’s so obvious that nobody should have to say it.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It would be like going to a staff meeting and hearing a low-level manager lecture you for 15 minutes on the importance of profit.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(Duh.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;And yes, I’ve experienced this with a prior employer.&amp;nbsp; Note I said "prior.") &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;It may be obvious, but I hear it repeated so many times. Over and over and OVER again.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In an earlier installment of this blog I noted the existence of talking points.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I invariably get these from candidates stemming from one Asian country.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It’s like there’s a four hour seminar that instructs candidates, “Americans LOVE process.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If you tell them this, they’ll see that you’re truly an expert and will have no choice but to take you!”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve had candidates stick to this party line even when I tell them, “That isn’t a business problem.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;What interesting business problems have you solved?”&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve actually told more than one candidate to stop repeating the line because I don’t want to hear it again.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(I must be the Dr. Laura of BI interviews.)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I usually provide examples in hopes of spurring the candidate to action because sometimes there are linguistic difficulties.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Some candidates respond well after that; some don’t.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In a couple of cases the interview has ended because the candidate can’t deviate from the party line.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Why can’t they answer the question?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;There are many reasons.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;After teaching SQL Server to adults for more than five years, I’ve taken a very dim view of the average adult’s learning ambitions and thought intensity.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Most people just don’t pay attention and learn lessons.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Others are terrified of talking, but it’s an interview and you must talk.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I think the majority of them simply don’t know the answer to the question but they believe such an admission is failure.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Well, you surely won’t be recommended for an architect position if you can’t tell me what cool business problems you’ve solved, but you may have a personal epiphany that leads to personal growth.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Mostly, candidates responding in this fashion haven’t really used Analysis Services to any great degree even though their resume says they have.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;They’ve had success bluffing their way with interviewers who can’t tell the difference.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Personally, I only put on my resume those things in which I am competent or expert but I seem to be a rarity.&lt;SPAN&gt;&amp;nbsp; In fact, here's some advice:&amp;nbsp; I don't like 10 page resumes.&amp;nbsp; I don't mind four or five pages&amp;nbsp;because&amp;nbsp;it's my duty to read your resume and&amp;nbsp;see what you've written.&amp;nbsp; If you've worked for 10 or 15 years, I expect more than two pages.&amp;nbsp; But if you get much past five pages, you're either playing cut-as-paste patsy, or you're telling me stuff I don't care about, like what you wrote in FORTRAN or how many NIC's you replaced.&amp;nbsp; BTW, if you feel the need to tell me that,&amp;nbsp;this doesn't help you and may hurt you.&amp;nbsp;If this is a BI interview then I want to know what you've done that is pertinent to BI.&amp;nbsp;&lt;/SPAN&gt;(And don’t get me started on recruiters who don’t actually READ your resume.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I get called frequently for Oracle/Informatica work even though those words don’t appear on my resume.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Yes, many of the same letters in those two words appear on my resume, but not the actual words themselves.&amp;nbsp; Would you believe that today I got a hit for a UNIX/Sun/Solaris admin?&amp;nbsp; Huh?&amp;nbsp; You can't find any of those words on my resume with just a keyword search!&amp;nbsp; But I digress...)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The lesson here is to pay attention to your experiences.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Wring every last drop of wisdom from your work.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Be prepared to talk about those experiences and what you’ve learned.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;You never know when an interviewer will ask you about them!&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;NEXT.&amp;nbsp; Part III of My Analysis Services Interview Questions:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Architectural Philosophy&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=21982" width="1" height="1"&gt;</description></item><item><title>My Analysis Services Interview Questions</title><link>http://sqljunkies.com/WebLog/davescube/archive/2006/06/19/21964.aspx</link><pubDate>Mon, 19 Jun 2006 21:05:00 GMT</pubDate><guid isPermaLink="false">d2584c15-f6ef-46f7-a2d4-24fc0e143e76:21964</guid><dc:creator>drodabaugh</dc:creator><slash:comments>2</slash:comments><comments>http://sqljunkies.com/WebLog/davescube/comments/21964.aspx</comments><wfw:commentRss>http://sqljunkies.com/WebLog/davescube/commentrss.aspx?PostID=21964</wfw:commentRss><description>&lt;P&gt;&lt;SPAN&gt;My good friend Jon Baker suggested that I start a blog on this site, and as I tend to follow the advice of those smarter than I, here it is.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As noted by the title of my blog, I’m a DW/BI guy with extensive experience using Microsoft SQL Server, Analysis Services, Reporting Services, and soon Integration Services.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’m in Columbus, Ohio (GO BUCKS!) and like all multidimensional guys, I’m a little crazy.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Not overtly so, of course.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Just off-kilter a little.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;One day Jon and I were swapping interview stories.&lt;SPAN&gt;&amp;nbsp; (He's posted about this very topic at &lt;a href="http://www.sqljunkies.com/WebLog/outerjoin/archive/2006/06/19/21960.aspx"&gt;http://www.sqljunkies.com/WebLog/outerjoin/archive/2006/06/19/21960.aspx&lt;/A&gt;&amp;nbsp; Is this a conspiracy?&amp;nbsp; Oh yes.) &lt;/SPAN&gt;He fired his very best interview question at me and I flunked it in spectacular fashion.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;That got me to thinking about how I interview DW/BI candidates, particularly those who claim to know Analysis Services.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We decided that some of these stories were pretty good, so I'll be following this post with my favorite interview questions, and some of the responses I've received.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;My last big client was The Home Depot.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For 18 months I traveled between Columbus and Atlanta to help pioneer an Analysis Services implementation in their Enterprise Data Warehouse (“EDW”) group.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In that time we always seemed to be short on talent, so I was asked to interview candidates.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I probably interviewed a dozen candidates in about nine months, most of whom had Analysis Services on their resumes, and most of who really knew little about it or how to use it.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;I admit to being a real hammer when conducting an interview.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I take an adaptive approach, by starting with the high-level questions about architecture, business problems, and design philosophies.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;If the candidate fails those questions (and most do) then I begin to drill down into their technical knowledge.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Just because a candidate can’t fill the role of architect doesn’t mean they aren’t productive when working under an architect.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’m sad to report that most people who fail the high-level questions also seem to know very little about Analysis Services’ product features.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;What’s shocking is that some of these people are actually giving clients architectural advice!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Why can’t people admit “I don’t know the answer to that question” when peppered in an interview?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Why try to bluster and bluff your way through it?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Do you think I won’t know what you’re doing?!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(Apparently, the pretender detector for most interviewers isn’t very sensitive as many of these people continue to land Analysis Services gigs.)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This transcends race, gender, nationality, and educational pedigree.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve interviewed Americans, Russians, a Serb, an Iranian, and quite some number of Indians.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I will admit that I’ve had the most trouble with the country presently serving in a large outsourcing role.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’m pretty sure there are talking points and that candidates are being coached because I see unswerving devotion to their use.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Supposedly, the interviewer will lap up the answer and be convinced of expertise!&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;As we’ll see, these talking points are vaguely reminiscent of the Underpants Gnomes in a particular South Park episode.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;So this is the first in a multi-part series about interviewing Analysis Services candidates.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I offer these stories because they’re humorous and many of you will nod in acknowledgement.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Some of you who read these may think I'm a real blowhard.&amp;nbsp; Please be assured that I intend no offense to anyone!&amp;nbsp;I've mentored&amp;nbsp;men and women of&amp;nbsp;varying nationalities, and they have taught me a thing or two as well.&amp;nbsp; I&amp;nbsp;also write these stories because if you’re considering a career in DW/BI using Analysis Services, these can help you.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;All of us who pitch our tent in the Microsoft camp do well when Microsoft does well, and we help them by attaining product expertise and plying our craft in the field.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve worked hard to attain expertise (and hopefully I have). If I can do it, so can you.&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;The next installment of My Analysis Services Interview Questions:&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Cool Business Problems.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://sqljunkies.com/WebLog/aggbug.aspx?PostID=21964" width="1" height="1"&gt;</description></item></channel></rss>