Friday, July 8, 2011
SSAS Interview Questions
Q. How is the syntax for MDX different and alike to T-SQL?
A. http://www.mosha.com/msolap/articles/MDXForEveryone.htm
Q. Define a Dimension, Hierarchy, Level, Member, a Cube, a Cell, a Tuple, and a Set?
A. A Dimension is an object in an OLAP Database that contains elements that can be used to define how we look at OLAP data. For example, in a typical OLAP Database you would have a Date Dimension and we might want to view the data my Years, Months or Periods, Weeks, or Days. We have a Hierarchy when there are elements within a Dimension that relate to one another in a typical, one to many, relationship. An example is sown by a year having 12 months, a month having 28, 29, 30, or 31 days depending on the month. The heirarchical relationship is Year -> Month -> Day in this example. Each layer of the hierarchy is a Level. In the above example, we have a root Level (Year) and a leaf Level (Day), and an intermediate Level (Month). A member is a single element within the Dimension. June would be a member of the Month Level within Year-Month-Day Hierarchy of a Date Dimension. To understand a Tuple, you must know what a Cube and a Cell is. A Cube is a many sided (based on the number of dimensions associated to it) object that houses the aggregate and non-aggregate data in individual Cells that are the intersection of the many sides of the Cube. A Cell is simply the intersection of the many sides of a Cube for any given Member of each Dimension. The Tuple is the representation of each Dimension Member that defines a Cell within a Cube. Tuples are syntactically represented by Parentheses. A Set is one or more Tuples that define the cells for a given query result. Typically, a query will result in two dimensional axes (Columns and Rows). Each axis (Column and/or Row) must have a Set defined for the axis. Sets are syntactically represented by Curly Braces.
Q. What the difference between flexible and rigid attribute relationship in SSAS Dimensions. How does this relationship impact aggregation design and performance?
A. A Rigid relationship indicates that the dimension data does not change. A Flexible relationship (default setting) allows for changes in the dimension data. Flexible relationships force Analysis Services to drop and re-compute any existing aggregations during incremental dimension processing.Rigid relationships do not require the re-computing of existing aggregations during incremental processing and thereby reduce total processing time. Hierarchies with rigid relationships can also be queried faster than those with flexible relationships. The flip side of the coin is that changing any dependent attribute that has a rigid relationship within any hierarchy requires full process of the entire dimension.
Q. In MDX, what is the difference between the IF and IIF statements?
A. The IF statment checks for a condition THEN if true performs some operation then END IF. The IIF statement checks for a condition if true (,) performs an operation, else if false (,) performs another operation. Syntax for each follows:
IF [Measures].CurrentMember IS [Measures].[Sales Amt] THEN [Measures].[Sales Amt] * .10 END IF
IIF([Measures].[Sales Amt] > 1000, "Sales are Good.","Sales are not Good")
Q. When setting up partitions, what must you do to make sure you don't load duplicate data into a partition?
A. You must define a Where Clause in the Partition Configuration.
Q. What is the first statement in a Cube's MDX Script?
A. The CALCULATE statement.
Q. How do you create SubCube space in a Cube?
A. By using the SCOPE statement within the MDX Script.
Q. What is the best practice for keeping your cubes sparse?
A. Don't populate null values with 0.
Q. How does SSAS handle null values in terms of math operations?
A. Null * 2 = Null, Null + 1 = 1
Q. How do you define the Cube Space in SSAS 2005?
A. The cube space is defined by the Attriute Hierarchies in the many dimensions of the cube. More specifically, it is the product of all attribute hierarchies in a cube. User Hierarchies do not impact the cube space and attributes without attribute hierarchies exist outside the cube space.
Q. How can dimension attributes that do not have an attribute hierarchy be used in a cube?
A. They can be used as a Member Property within the dimension.
Analysis Services Performance Guide
MSOLAP: Processing
- Rows read/sec
MSOLAP: Proc Aggregations
- Temp File Bytes Written/sec
- Rows created/Sec
- Current Partitions
MSOLAP: Threads
- Processing pool idle threads (I sometimes find "query pool idle threads" more significant, maybe you want to monitor both)
- Processing pool job queue length (I sometimes find "query pool job queue length" more significant, maybe you want to monitor both)
- Processing pool busy threads (I sometimes find "query pool busy threads" more significant, maybe you want to monitor both)
SQL-Server: Memory Manager
- Total Server Memory
- Target Server Memory
Process
- Virtual Bytes – msmdsrv.exe
- Working Set – msmdsrv.exe
- Private Bytes – msmdsrv.exe
- % Processor Time – msmdsrv.exe and sqlservr.exe
Logical Disk:
- Avg. Disk sec/Transfer – All Instances
Processor:
- % Processor Time – Total
System:
- Context Switches / sec
So it should be clear that you need to monitor the server machine comprehensively and not only the Analysis Services Process.
However, I picked some SSAS counters from the list that are a good one to start your exploration when focusing on the SSAS processes.
Storage Engine Query
I think that this is a really interesting category of counters to start with. Here you find information about the number of queries processed per second, the caching rate of the queries, the average time per query etc. There are really a lot of counters. So this category gives you a good overview of the servers' workload. For the beginning you might want to look at the following counters:
Object | Counter | Description |
MSAS 2008:Storage Engine Query | Current measure group queries | Current number of measure group queries being actively worked on. |
MSAS 2008:Storage Engine Query | Measure group queries/sec | Rate of measure group queries |
MSAS 2008:Storage Engine Query | Queries answered/sec | Rate of queries answered. |
MSAS 2008:Storage Engine Query | Bytes sent/sec | Rate of bytes sent by server to clients, in response to queries. |
MSAS 2008:Storage Engine Query | Queries from cache direct/sec | Rate of queries answered from cache directly. |
MSAS 2008:Storage Engine Query | Queries from cache filtered/sec | Rate of queries answered by filtering existing cache entry. |
MSAS 2008:Storage Engine Query | Queries from file/sec | Rate of queries answered from files. |
MSAS 2008:Storage Engine Query | Avg time/query | Average time per query, in milliseconds. Response time based on queries answered since the last counter measurement. |
MSAS 2008:Storage Engine Query | Dimension cache lookups/sec | Rate of dimension cache lookups. |
MSAS 2008:Storage Engine Query | Dimension cache hits/sec | Rate of dimension cache hits. |
MSAS 2008:Storage Engine Query | Measure group cache lookups/sec | Rate of measure group cache lookups. |
MSAS 2008:Storage Engine Query | Measure group cache hits/sec | Rate of measure group cache hits. |
MSAS 2008:Storage Engine Query | Aggregation lookups/sec | Rate of aggregation lookups. |
MSAS 2008:Storage Engine Query | Aggregation hits/sec | Rate of aggregation hits. |
Connections
This category gives information about the number of connections, sessions and request which is also important to understand the workload and to see when bottlenecks occur.
Object | Counter | Description |
MSAS 2008:Connection | Current connections | Current number of client connections established. |
MSAS 2008:Connection | Requests/sec | Rate of connection requests. These are arrivals. |
MSAS 2008:Connection | Current user sessions | Current number of user sessions established. |
MDX
There are really a lot of counters about MDX. Just to name a few of them:
Object | Counter | Description |
MSAS 2008:MDX | Number of cell-by-cell evaluation nodes | Total number of cell-by-cell evaluation nodes built by MDX execution plans |
MSAS 2008:MDX | Number of bulk-mode evaluation nodes | Total number of bulk-mode evaluation nodes built by MDX execution plans |
MSAS 2008:MDX | Total cells calculated | Total number of cell properties calculated |
Memory
Memory is always important. Here you can also query the amount of memory being allocated by the aggregation cache.
Object | Counter | Description |
MSAS 2008:Memory | Memory Usage KB | Memory usage of the server process. Same as perfmon counter for Process\PrivateBytes. |
MSAS 2008:Memory | AggCacheKB | Current memory allocated to aggregation cache, in KB. |
MSAS 2008:Memory | Quota KB | Current memory quota, in KB. Memory quota is also known as a memory grant or memory reservation. |
MSAS 2008:Memory | Quota Blocked | Current number of quota requests that are blocked until other memory quotas are freed. |
Aggregations
If your cubes rely on aggregations it might be interesting to know if they can be held in memory or if the are written to a temporary file. So you might also want to look at the following aggregation counters:
Object | Counter | Description |
MSAS 2008:Proc Aggregations | Temp File Bytes Writes/sec | Usage of temporary file |
MSAS 2008:Proc Aggregations | Current partitions | Current number of partitions being processed. |
MSAS 2008:Proc Aggregations | Memory size bytes | Size of current aggregations in memory. This count is an estimate. |
MSAS 2008:Proc Aggregations | Temp file bytes written/sec | Rate of writing bytes to a temporary file. Temporary files are written when aggregations exceed memory limits. |
Processing
Processing time is also very important when considering performance especially when you're processing your cube regularly over the day while users are also making their queries. Knowing about the processings may also make the exploration of performance issues more easy. If you're just looking at the average query time for instance, you should also check what the server does in the meantime.
Object | Counter | Description |
MSAS 2008:Processing | Rows read/sec | Rate of rows read from all relational databases. |
MSAS 2008:Processing | Total rows read | Count of rows read from all relational databases. |
MSAS 2008:Processing | Rows converted/sec | Rate of rows converted during processing. |
MSAS 2008:Processing | Total rows converted | Count of rows converted during processing. |
MSAS 2008:Processing | Rows written/sec | Rate of rows written during processing. |
MSAS 2008:Processing | Total rows written | Count of rows written during processing. |
Threads
Object | Counter | Description |
MSAS 2008:Threads | Query pool job queue length | Nonzero values means that there are more queries than query threads. You may increase the number of threads (but only if CPU utilization is not too high because otherwise this would only result in more context switches and degrade performance) |
MSAS 2008:Threads | Query pool busy threads | The number of busy threads in the query thread pool |
MSAS 2008:Threads | Query pool idle threads | The number of idle threads in the query thread |
Interview Questions for MDX (MDX Interviews)
General concept: Usually interviewer starts with few conceptual questions to understand level of interviewee in related field.
Question1: Explain the structure of MDX query?
Question2: Tell me your 5 mostly used MDX functions?
Question3: What is the difference between set and tuple?
Question4: What do you understand by Named set? Is there any new feature added in SSAS 2008 related to named set?
Question5: How will you differentiate among level, member, attribute, hierarchy?
Question6: What are the differences among exists, existing and scope?
Question7: What will happen if we remove CALCULATE keyword in the script?
Question8:How will you pass parameter in MDX?
Question9: What is the diffrence between .MEMBERS and .CHILDREN?
Question10:What is the difference between NON EMPTY keyword and NONEMPTY() function?
MDX Queries: If person does well in "general concept" category, interviewer tries to evaluate if person has actually worked on product/tool.
Question1: Write MDX for retrieving top 3 customers based on internet sales amount?
Question2: Write MDX to find current month's start and end date?
Question3: Write MDX to compare current month's revenue with last year same month revenue?
Question4: Write MDX to find MTD(month to date), QTD(quarter to date) and YTD(year to date) internet sales amount for top 5 products?
Question5: Write MDX to find count of regions for each country?
Question6: Write MDX to rank all the product category based on calendar year 2005 internet sales amount?
Question7: Write MDX to extract nth position tuple from specific set?
Question8: Write MDX to set default member for particular dimension?
If you want to practice more on writing MDX queries than you can try following posts/articles:
SSAS - MDX Query Interview Questions and Answers-I
SSAS-MDX Interview questions - Time based function-II
MDX SCOPE statement Interview questions & Answers
SSAS MDX Query Interview Questions and Answers
MDX time cheat sheet
Performance: If interview position is for MSBI developer then you might not to address performance questions but if you are for MSBI tech lead position then there will be few questions on performance aspect.
Question1:What are the performance consideration for improving MDX queries?
Question2: Is Rank MDX function performance intensive?
Question3: Which one is better from performance point of view...NON Empty keyword or NONEMPTY function?
Question4: How will you find performance bottleneck in any given MDX?
Question5: What do you understand by storage engine and formula engine?
Hope this list will help you in coming interviews. Best of luck :)
SSAS MDX Query Interview Questions and Answers
________________________________________
Q: How do I find the bottom 10 customers with the lowest sales in 2003 that were not null?
A: Simply using bottomcount will return customers with null sales. You will have to combine it with NONEMPTY or FILTER.
SELECT { [Measures].[Internet Sales Amount] } ON COLUMNS ,
BOTTOMCOUNT(
NONEMPTY(DESCENDANTS( [Customer].[Customer Geography].[All Customers]
, [Customer].[Customer Geography].[Customer] )
, ( [Measures].[Internet Sales Amount] ) )
, 10
, ( [Measures].[Internet Sales Amount] )
) ON ROWS
FROM [Adventure Works]
WHERE ( [Date].[Calendar].[Calendar Year].&[2003] ) ;
________________________________________
Q: How in MDX query can I get top 3 sales years based on order quantity?
A: By default Analysis Services returns members in an order specified during attribute design. Attribute properties that define ordering are "OrderBy" and "OrderByAttribute". Lets say we want to see order counts for each year. In Adventure Works MDX query would be:
SELECT {[Measures].[Reseller Order Quantity]} ON 0
, [Date].[Calendar].[Calendar Year].Members ON 1
FROM [Adventure Works];
Same query using TopCount:
SELECT
{[Measures].[Reseller Order Quantity]} ON 0,
TopCount([Date].[Calendar].[Calendar Year].Members,3, [Measures].[Reseller Order Quantity]) ON 1
FROM [Adventure Works];
________________________________________
Q: How do you extract first tuple from the set?
A: Use could usefunction Set.Item(0)
Example:
SELECT {{[Date].[Calendar].[Calendar Year].Members
}.Item(0)}
ON 0
FROM [Adventure Works]
________________________________________
Q: How do you compare dimension level name to specific value?
A: Best way to compare if specific dimension is at certain level is by using 'IS' operator:
Example:
WITH MEMBER [Measures].[TimeName] AS
IIF([Date].[Calendar].Level IS [Date].[Calendar].[Calendar Quarter],'Qtr','Not Qtr')
SELECT [Measures].[TimeName] ON 0
FROM [Sales Summary]
WHERE ([Date].[Calendar].[Calendar Quarter].&[2004]&[3])
________________________________________
Q: MDX query to get sales by product line for specific period plus number of months with sales
A: Function Count(, ExcludeEmpty) counts number of non empty set members. So if we crossjoin Month with measure we will get set that we can use to count members.
Query example:
WITH Member [Measures].[Months With Non Zero Sales] AS
COUNT(CROSSJOIN([Measures].[Sales Amount]
, DESCENDANTS({[Date].[Calendar].[Calendar Year].&[2003]: [Date].[Calendar].[Calendar Year].&[2004]}, [Date].[Calendar].[Month]))
, ExcludeEmpty
)
SELECT {[Measures].[Sales Amount], [Measures].[Months With Non Zero Sales]} ON 0
, [Product].[Product Model Lines].[Product Line].Members on 1
FROM [Adventure Works]
WHERE ([Date].[Calendar].[Calendar Year].&[2003]: [Date].[Calendar].[Calendar Year].&[2004])
________________________________________
Q: How can I setup default dimension member in Calculation script?
A: You can use ALTER CUBE statement. Syntax:
ALTER CUBE CurrentCube | YourCubeName UPDATE DIMENSION , DEFAULT_MEMBER='';
________________________________________
Q: I would like to create MDX calculated measure that instead of summing children amounts,uses last child amount
A: Normally best way to create this in SSAS 2005 is to create real measure with aggregation function LastChild. If for some reason you still need to create calculated measure, just use fuction .LastChild on current member of Date dimension, and you will allways get value of last period child.
Example: We want to see last semester value for year level data. Lets first see what data values are at Calendar Semester level:
SELECT {[Measures].[Internet Order Count]} ON 0
, DESCENDANTS([Date].[Calendar].[All Periods],[Date].[Calendar].[Calendar Semester] ) ON 1
FROM [Adventure Works]
________________________________________
Q: How to calculate YTD monthly average and compare it over several years for the same selected month?
A: MDX Query:
WITH MEMBER Measures.MyYTD AS SUM(YTD([Date].[Calendar]),[Measures].[Internet Sales Amount])
MEMBER Measures.MyMonthCount AS SUM(YTD([Date].[Calendar]),(COUNT([Date].[Month of Year])))
MEMBER Measures.MyYTDAVG AS Measures.MyYTD / Measures.MyMonthCount
SELECT {Measures.MyYTD, Measures.MyMonthCount,[Measures].[Internet Sales Amount],Measures.MyYTDAVG} On 0,
[Date].[Calendar].[Month] On 1
FROM [Adventure Works]
WHERE ([Date].[Month of Year].&[7])
________________________________________
Q: MDX query to get sales by product line for specific period plus number of months with non empty sales.
A: You can use COUNT() function with ExcludeEmpty option. For count function you specify set that is corssjoin of Date members at the month level and measure that you are interested in.
WITH Member [Measures].[Months With Above Zero Sales] AS
COUNT(
DESCENDANTS({[Date].[Calendar].[Calendar Year].&[2003]: [Date].[Calendar].[Calendar Year].&[2004]}
, [Date].[Calendar].[Month]) * [Measures].[Sales Amount]
, ExcludeEmpty
)
SELECT {[Measures].[Sales Amount], [Measures].[Months With Above Zero Sales]} ON 0
, [Product].[Product Model Lines].[Product Line].Members on 1
FROM [Adventure Works]
WHERE ([Date].[Calendar].[Calendar Year].&[2003]: [Date].[Calendar].[Calendar Year].&[2004])
________________________________________
Q: How do I group dimension members dynamically in MDX? Source: MSDN SSAS Newsgroup.
A: You can create calculated members for dimension and then use them in the query. Example below will create 3 calculated members based on filter condition:
WITH MEMBER [Product].[Category].[Case Result 1] AS ' Aggregate(Filter([Product].[Category].[All].children, [Product].[Category].currentmember.Properties("Key") < "3"))'
MEMBER [Product].[Category].[Case Result 2] AS ' Aggregate(Filter([Product].[Category].[All].children, [Product].[Category].currentmember.Properties("Key") = "3"))'
MEMBER [Product].[Category].[Case Result 3] AS ' Aggregate(Filter([Product].[Category].[All].children, [Product].[Category].currentmember.Properties("Key") > "3"))'
SELECT NON EMPTY {[Measures].[Order Count] } ON COLUMNS
, {[Product].[Category].[Case Result 1],[Product].[Category].[Case Result 2],[Product].[Category].[Case Result 3] } ON ROWS
FROM [Adventure Works]
________________________________________
Q: How can I compare members from different dimensions that have the same key values?
Lets say I have dimensions [Delivery Date] and [Ship Date]. How can I select just records that were Delivered and Shipped the same day?
A: You can use FILTER function and compare member keys using Properties function:
SELECT {[Measures].[Internet Order Count]} ON 0
, FILTER( NonEmptyCrossJoin( [Ship Date].[Date].Children, [Delivery Date].[Date].Children
)
, [Ship Date].[Date].CurrentMember.Properties('Key')
= [Delivery Date].[Date].Properties('Key')
) ON 1
FROM [Adventure Works]
________________________________________
Q: How can I get attribute key with MDX
A:
To do so, use Member_Key function:
WITH
MEMBER Measures.ProductKey as [Product].[Product Categories].Currentmember.Member_Key
SELECT {Measures.ProductKey} ON axis(0),
[Product].[Product Categories].Members on axis(1)
FROM [Adventure Works]
________________________________________
Q: How do I create a Rolling 12 Months Accumulated Sum (InternetSalesAmtR12Acc) that can show a trend without seasonal variations?
A: Here is query example
WITH MEMBER [Measures].[InternetSalesAmtYTD] AS SUM(YTD([Date].[Calendar].CurrentMember),[Measures].[Internet Sales Amount]), Format_String = "### ### ###"
MEMBER [Measures].[InternetSalesAmtPPYTD] AS SUM(YTD(ParallelPeriod([Date].[Calendar].[Calendar Year],1,[Date].[Calendar].CurrentMember)),
[Measures].[Internet Sales Amount]), Format_String = "### ### ###"
MEMBER [Measures].[InternetSalesAmtPY] AS SUM(Ancestor(ParallelPeriod([Date].[Calendar].[Calendar Year],1,[Date].[Calendar].CurrentMember),[Date].[Calendar].[Calendar Year]),
[Measures].[Internet Sales Amount]),Format_String = "### ### ###"
MEMBER [Measures].[InternetSalesAmtR12Acc] AS ([Measures].[InternetSalesAmtYTD]+[Measures].[InternetSalesAmtPY] )- [Measures].[InternetSalesAmtPPYTD]
Select {[Measures].[Internet Sales Amount], Measures.[InternetSalesAmtYTD], [Measures].[InternetSalesAmtPPYTD],[Measures].[InternetSalesAmtR12Acc]} On 0,
[Date].[Calendar].[Month].Members On 1
From [Adventure Works]
Where ([Date].[Calendar Year].&[2004]);
________________________________________
Q: How to setup calculated measure as default measure for a cube?
A: Use ALTER Cube statement on measures dimension. Example:
ALTER CUBE CURRENTCUBE UPDATE DIMENSION Measures, DEFAULT_MEMBER=[Measures].[Profit]
________________________________________
Q: How can I write MDX query for the count of customers for whom the earliest sale in the selected time period (2002 and 2003) occurred in a particular Product Category
A: Example of such query:
WITH SET [FirstSales] AS
FILTER(NONEMPTY( [Customer].[Customer Geography].[Customer].MEMBERS
* [Date].[Date].[Date].MEMBERS
, [Measures].[Internet Sales Amount])
AS MYSET,
MYSET.CURRENTORDINAL = 1 or
NOT(MYSET.CURRENT.ITEM(0) IS MYSET.ITEM(MYSET.CURRENTORDINAL-2).ITEM(0)))
MEMBER [Measures].[CustomersW/FirstSales] AS
COUNT(NonEmpty([FirstSales], [Measures].[Internet Sales Amount])),
FORMAT_STRING = '#,#'
SELECT {[Measures].[Internet Sales Amount],[Measures].[CustomersW/FirstSales]} ON 0,
[Product].[Product Categories].[Category] ON 1
FROM [Adventure Works]
WHERE ({[Date].[Calendar].[Calendar Year].&[2002], [Date].[Calendar].[Calendar Year].&[2003]}, [Customer].[Customer Geography].[City].&[Calgary]&[AB]);
________________________________________
Q: How do you write MDX query that returns measure ratio to parent value?
A: Below is example on how is ratio calculated for measure [Order Count] using Date dimension. Using parent function, your MDX is independant on level that you are querying data on. In example below, if you query data at year level, ratio will be calculated to level [All]:
WITH MEMBER [Measures].[Order Count Ratio To Parent] AS
IIF( ([Measures].[Order Count], [Date].[Calendar].CurrentMember.Parent) = 0
, NULL
, [Measures].[Order Count]
/
([Measures].[Order Count], [Date].[Calendar].CurrentMember.Parent)
)
, FORMAT_STRING = "Percent"
SELECT {[Measures].[Order Count], [Measures].[Order Count Ratio To Parent]} ON 0
, {DESCENDANTS([Date].[Calendar].[All Periods], 1), [Date].[Calendar].[All Periods]
} ON 1
FROM [Adventure Works]
SSAS Interview Questions
Whenever one wants to learn something or make sure one is competent enough to take the helm of any challenge in a particular technology, the first thing one needs to know is what one should be knowing. In simple words one should be aware of the topics that one needs to cover, then the next point is how much ground has already been covered and how much is yet to be covered. Below is a list of roughly drafted high level areas of SSAS in no particular order, which can be considered as a descent coverage, whether it's considered for SSAS training / SSAS interview. Keep in view that though the below coverage covers a major ground, it's not exhaustive and it can be used as a reference check to make sure you cover enough in your trainings / to make sure you have covered major fundamental areas.
- Types of Dimensions
- Types of Measures
- Types of relationships between dimensions and measuregroups: None (IgnoreUnrelatedDimensions), Fact, Regular, Reference, Many to Many, Data Mining
- Star Vs Snowflake schema and Dimensional modeling
- Data storage modes - MOLAP, ROLAP, HOLAP
- MDX Query syntax
- Functions used commonly in MDX like Filter, Descendants, BAsc and others
- Difference between EXISTS AND EXISTING, NON EMPTY keyword and function, NON_EMPTY_BEHAVIOR, ParallelPeriod, AUTOEXISTS
- Difference between static and dynamic set
- Difference between natural and unnatural hierarchy, attribute relationships
- Difference between rigid and flexible relationships
- Difference between attirubte hierarchy and user hierarchy
- Dimension, Hierarchy, Level, and Members
- Difference between database dimension and cube dimension
- Importance of CALCULATE keyword in MDX script, data pass and limiting cube space
- Effect of materialize
- Partition processing and Aggregation Usage Wizard
- Perspectives, Translations, Linked Object Wizard
- Handling late arriving dimensions / early arriving facts
- Proactive caching, Lazy aggregations
- Partition processing options
- Role playing Dimensions, Junk Dimensions, Conformed Dimensions, SCD and other types of dimensions
- Parent Child Hierarchy, NamingTemplate property, MemberWithLeafLevelData property
- Cube performance, MDX performance
- How to pass parameter in MDX
- SSAS 2005 vs SSAS 2008
- Dimension security vs Cell security
- SCOPE statement, THIS keyword, SUBCUBE
- CASE (CASE, WHEN, THEN, ELSE, END) statement, IF THEN END IF, IS keyword, HAVING clause
- CELL CALCULATION and CONDITION clause
- RECURSION and FREEZE statement
- Common types of errors encountered while processing a dimension / measure groups / cube
- Logging and monitoring MDX scripts and cube performance