Creating A Partitioned Table In SSAS Tabular 2017 And SSDT Using M Functions

One of the coolest new features in SSAS Tabular 2017 and Azure Analysis Services is the integration of Power Query and M for data loading. Over the last year or so the Analysis Services team blog has posted a lot of fairly complex examples of how to use this functionality, but now that the latest release of SSDT has proper support for shared expressions I thought it would be a good idea to show a simple example of how to use it to create a partitioned table using M functions.

For this example I’ll be using the FactInternetSales fact table from the Adventure Works DW sample database, and the aim is to create a table in an SSAS Tabular project that has one partition for each year of data in FactInternetSales. Assuming that a new SSAS Tabular project has been created at the 1400 compatibility level with an integrated workspace:

image

…the first thing to do is to right-click on the Data Sources folder in the Tabular Model Explorer pane and select Import From Data Source:

image

This brings up the Get Data dialog:

image

Select SQL Server database and then click Connect. Enter the server name and database name in the SQL Server database dialog:

image

Choose how SSAS is to authenticate when it connects to the SQL Server database and click Connect:

image

Select the FactInternetSales table from the list of tables in the Adventure Works DW database:

image

This opens the Query Editor window; in it there is one query called FactInternetSales:

image

Here’s where it gets interesting. The first thing to do is to create a function that returns a filtered subset of the rows in the FactInternetSales table using the technique I blogged about here for Power BI. On the Query Editor menu bar, click Query/Parameters/New Parameter and create two new parameters called StartDate and EndDate that return the numbers 20010101 and 20011231. Here’s what they should look like:

image

image

These parameters are going to be used to filter the OrderDateKey column on the FactInternetSales table. Do this by clicking on the down arrow on the column header of OrderDateKey then selecting Number Filters and then Between:

image

In the Filter Rows dialog use the StartDate parameter for the start of the filter range and the EndDate parameter for the end of the filter range, then click OK:

image

Because the OrderDateKey contains dates stored as numbers in the YYYYMMDD format the result is a table that only contains sales where the order date is in the year 2001. This table should not be loaded into SSAS though, so right click on the FactInternetSales in the Queries pane and make sure that the Create New Table is not checked:

image

Next, on the same right-click menu, select Create Function:

image

In the Create Function dialog name the new function GetFactData then click OK:

image

The new GetFactData function will now be visible in the Queries pane; enter 20010101 for the StartDate parameter and 20011231 for the EndDate parameter and click Invoke:

image

This creates yet another new query called Invoked Function which should be renamed Internet Sales:

image

Right-click on this query and make sure Create New Table is selected. Next, click the Import button on the toolbar to close the Query Editor and load the Internet Sales table into SSAS.

At this point the Tabular Model Explorer will show all of the queries created above listed under the Expressions folder, and a single table called Internet Sales with a single partition:

image

Next, right-click on the Internet Sales table in the Tables folder and select Partitions:

image

This opens the Partition Manager dialog. Rename the existing partition to Internet Sales 2001:

image

Note that the M query for this partition calls the GetFactData() function to get the rows from FactInternetSales where OrderDateKey is between 20010101 and 20011231:

let
    Source = GetFactData(20010101, 20011231)
in
    Source

Click the New button to create new partitions, one for each year of data in the FactInternetSales table. Each new partition will initially contain the same M code shown above and should be edited so that the query gets data for the appropriate year:

image

Click OK, and the end result is a table with one partition per year:

image

What’s the point of using M functions to return the data for a partition, rather than the traditional method of using a SQL query embedded in each partition? One reason to do this would be to make maintenance easier: if you need to do something like add a new column to a fact table, rather than editing lots of partitions you just need to edit the function and all the partitions will reflect that change. I can think of a few others, but I’ll save them for future blog posts…

Deleting Cached Logins For Azure Analysis Services In SQL Server Management Studio

When Azure Analysis Services was announced I had to try it out right away. Of course I didn’t read the instructions properly so when I tried to log in to my Azure Analysis Services instance from SQL Server Management Studio, like an idiot I logged in with the wrong username. The problem is that once you’ve done this, with current versions of SQL Server Management Studio there’s no way of logging out and logging in as a different user. Luckily Igor Uzhviev of Microsoft had a solution for me and I thought I’d share it for anyone else who’s made the same mistake. Here’s what you need to do:

  • Go to your user local app data folder (the path is like this: C:\Users\<your_user_name>\AppData\Local\)
  • In this directory you need to delete:
    1) Any .dat files with names that start with "omlibs-tokens-cache…"
    2) The folder AADCacheOM, if it exists
  • You also need to open Internet Explorer and delete  all cookies and website data, because IE caches auth tokens too

Once you’ve done this, the next time you try to connect to Azure Analysis Services from SSMS you’ll get prompted to log in again. Future releases of SSMS will have proper support for logging in and out of Azure SSAS, but even with the latest version (version 16.5) you’ll still need to following these steps.

First Thoughts On Azure Analysis Services

Hurray! At last we have proper cloud-based Analysis Services! The official blog post with the announcement is here:

https://azure.microsoft.com/en-in/blog/introducing-azure-analysis-services-preview/

…the pricing details are here:

https://azure.microsoft.com/en-us/pricing/details/analysis-services/

…and the documentation is here:

https://azure.microsoft.com/en-us/documentation/services/analysis-services/

It’s still in preview, so while there are some missing features I’m confident that they’ll be added soon. Similarly it’s SSAS Tabular only right now, but the blog post says

Support for multidimensional models will be considered for a future release, based on customer demand.

I’m pretty sure there there will be plenty of demand for Multidimensional support given the installed base that’s out there.

Why should we be excited about this, though? What will Azure Analysis Services be useful for? Obviously, if you want to build a completely cloud-based Microsoft BI solution then Azure SSAS is an important component to have available. Also, consider the fact that the load on a typical SSAS server varies a lot over time: daytime is usually much busier than night-time, weekdays are usually busier than weekends, and some days of the month (such as month ends) may be much busier than others. It will be great to be able to build cloud-based SSAS solutions that can be scaled-up and scaled-down to meet demand, rather than expensive on-premises SSAS solutions that are underutilised most of the time. I also think Azure SSAS will be very interesting to ISVs, and to Power BI users looking to move up from native Power BI storage, although in both cases pricing will be key to adoption. I can’t wait to start using this with my customers!

UPDATE 27/10/2016: You can see the top-rated requests on the Azure Analysis Services forum here https://feedback.azure.com/forums/556165 unsurprisingly, support for SSAS Multidimensional is #1