|Querying PowerPivot DMVs from Excel|
|Written by Chris Webb|
|Sunday, 27 February 2011 17:37|
Reposted from Chris Webb's blog with the author's permission.
One of the more popular posts on my blog is one I wrote just over a year ago on binding the results of an MDX query to a table inside Excel. I was thinking about it again recently when I was looking at the list of DMVs (=Dynamic Management Views – views that can be queried using SQL in SSAS and which contain all kinds of useful admin data) available in Analysis Services and noticed several new ones in 2008 R2 that are PowerPivot-related; I assume these are the DMVs that the Sharepoint management dashboard uses to track usage of PowerPivot models after they’ve been uploaded, but it struck me that it would also be cool to have this information available for PowerPivot models while they’re still in Excel. Wouldn’t it be good to query a DMV from Excel? Well, here’s how.
First of all, take an Excel workbook with a PowerPivot model in it. Go to the Data tab and click on Connections, and you’ll see the connection that is created automatically to the PowerPivot model:
This is the connection we want to use to run our DMVs. We now need to be able to use a table to show the results of our query, and this requires something similar to the method Greg Galloway described after I published the above post. First, on a new sheet open a connection to any relational data source you have handy such as SQL Server and import a table from that data source into a table in Excel. I used the DimProductCategory table from Adventure Works, and did this by going to the Data tab, clicking on From Other Data Sources and then From SQL Server, and running the wizard. The result is this:
Then go to the Connections dialog and copy the connection string from the PowerPivot connection shown in the first screenshot above (found when you click Properties and go to the Definition tab), then go to the SQL table you’ve just created, right-click and select Table and Edit Query, then paste the PowerPivot connection string into the Connection textbox, change the Command Type to Default, and then put your query into the Command Text box. I also had to add an extra connection string property setting Locale Identifier=1033 to get things working on my machine (and re-add it every time I edited the query), but I suspect this might not be necessary if you have a US English machine. Anyway, here’s what my connection string looked like:
Provider=MSOLAP.4;Persist Security Info=True;Initial Catalog=Microsoft_SQLServer_AnalysisServices;Data Source=$Embedded$;MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Optimize Response=3;Cell Error Mode=TextValue; locale identifier=1033
And here’s the dialog:
Having done this, when you click ok you’ll see the table update with the contents of the query.
Of course you can enter any MDX query here but I’m going to stick to talking about DMVs. So what useful information can you get from a DMV then? Vincent Rainardi has a great post on SSAS DMVs here which covers all the useful ones and has plenty of syntax examples, but here are some things you might want to do with PowerPivot.
First of all, to get a list of all the DMVs supported you can run the query:
select * from $system.discover_schema_rowsets
To get a list of tables in your model along with the dates they were last edited and when the data was last updated, use the following query:
select cube_name, last_schema_update, last_data_update from $system.mdschema_cubes
…although I’ve noticed some weird behaviour with the dates for some tables, so be careful using it.
To get a list of the number of distinct values in each column, use:
select dimension_name, table_id, rows_count from $system.discover_storage_tables
gives more metadata on table columns; however:
…although it gives some information on the amount of memory allocated to different columns, does not give the complete picture on memory usage. For that you need to use:
This gives a full breakdown of memory usage (in the OBJECT_MEMORY_NONSHRINKABLE column) by each object in the PowerPivot model. It’s not all that easy to interpret this information though, because it only gives the memory used directly by each object and you also need to take into account the memory used by all the objects ‘owned’ by a given object too. It’s also worth pointing out that this is not the same view of memory usage that is given by looking at the temp folder created by Vertipaq, which Vidas has blogged about here and here; it shows the size of the database when it has been loaded into memory as opposed to the size of the database when it is persisted to disk, and there can be a big disparity between the two.
How can we make sense of the data returned by discover_object_memory_usage? We load it back into PowerPivot of course! I created a linked table and then a calculated column called OBJECT_PATH concatenating OBJECT_PARENT_PATH and OBJECT_ID using the following expression:
I then created a calculated measure with the following expression to return the amount of memory used by each object, including the objects it owns, in KB:
=(SUM(Memory[OBJECT_MEMORY_NONSHRINKABLE]) + CALCULATE(SUM(Memory[OBJECT_MEMORY_NONSHRINKABLE]),FILTER(ALL(Memory), COUNTROWS(FILTER(VALUES(Memory[OBJECT_PATH]), IFERROR(SEARCH(Memory[OBJECT_PATH],EARLIER(Memory[OBJECT_PARENT_PATH])), 0)=1))>0)))/1024
It’s then easy to see the memory used by the cubes and dimensions that make up the PowerPivot model:
And the memory used by objects associated with the columns in a particular table:
All of which is very useful if you’re trying to work out what’s eating memory in your PowerPivot model. If anyone comes across any other interesting thing to do with DMVs for PowerPivot then please let me know…
- One-To-One Relationships In Power BI
- Automatically Generating Date Dimension Tables In Excel 2016 Power Pivot
- Using DateDiff() To Calculate Time Intervals In DAX
- Using SelectColumns() To Alias Columns In DAX
- NaturalInnerJoin And NaturalLeftOuterJoin DAX Functions In Excel 2016
- Step by step guide on installing PowerPivot for SharePoint on a single machine
- How to install PowerPivot for Excel and list of know issues
- List of PowerPivot DAX functions with description
- List of suggested datasets to test PowerPivot
- Q: How can I calculate difference between two dates in DAX (seconds, minutes, hours, days and months)
- DAX cheat sheet
- Learning PowerPivot and DAX
- Using Power Pivot and Power View for Profit Analysis