Most of the time I’ve spent looking at Power Query Query Diagnostics data, I’ve been looking at data for a single query. Over the past few days though I’ve spent some time investigating what this data shows for all the queries that are executed for a single dataset refresh. To help me do this I wrote the following M function:
(InputTable as table) => let Source = InputTable, EarliestStart = List.Min(Source[Start Time]), AddRelativeStart = Table.AddColumn( Source, "Relative Start", each [Start Time] - EarliestStart ), AddRelativeEnd = Table.AddColumn( AddRelativeStart, "Relative End", each [End Time] - EarliestStart ), SetToDurations = Table.TransformColumnTypes( AddRelativeEnd, { {"Relative Start", type duration}, {"Relative End", type duration} } ), CalculatedTotalSeconds = Table.TransformColumns( SetToDurations, { { "Relative Start", Duration.TotalSeconds, type number }, { "Relative End", Duration.TotalSeconds, type number } } ), GroupedRows = Table.Group( CalculatedTotalSeconds, {"Id", "Query"}, { { "Relative Start", each List.Min([Relative Start]), type number }, { "Relative End", each List.Max([Relative End]), type number } } ), MergeColumns = Table.AddColumn( GroupedRows, "Id Query", each Text.Combine({[Id], [Query]}, " "), type text ), IdToNumber = Table.TransformColumnTypes( MergeColumns, {{"Id", type number}} ) in IdToNumber
If you invoke this function and pass in the “Detailed” query diagnostics data query:
…you’ll end up with a query that gives you a table that looks something like this:
This table has one row for each Power Query query that got executed while the diagnostics trace was running, an Id column to uniquely identify each execution, the name of the query executed, an Id Query column that concatenates the previous two columns, and Relative Start and Relative End columns that give you the number of seconds from the start time of the first query executed up to the start time and end time of the query on the current row.
Loading the data into Power BI allows you to build a stacked bar chart with Id Query on the axis and Relative Start and Relative End together in the values:
If you then set the Sort By Column property of Id Query to the Id column (which is numeric, so this ensures that the values in Id Query are sorted correctly) and set the Data Color property of the Relative Start values to white (or whatever the background of your chart is) so that it’s invisible, then finally set the axis of your stacked bar chart to be sorted by Id Query in ascending order, you get a visual something like this:
This is a kind of Gantt chart where the x axis shows the number of seconds since the start of the first query execution and each bar shows the start and end times of each query, making it easy to see which queries are executing in parallel.
“What can this show us?” I hear you say. Well, that’s something for a future blog post. All that I can say right now is that it’s COMPLICATED and I don’t properly understand it myself yet. But it’s undoubtedly interesting.