{"id":3276,"date":"2025-04-23T07:02:31","date_gmt":"2025-04-23T07:02:31","guid":{"rendered":"https:\/\/mailitics.com\/index.php\/2025\/04\/23\/how-to-get-performance-data-from-power-bi-with-dax-studio\/"},"modified":"2025-04-23T07:02:31","modified_gmt":"2025-04-23T07:02:31","slug":"how-to-get-performance-data-from-power-bi-with-dax-studio","status":"publish","type":"post","link":"https:\/\/mailitics.com\/index.php\/2025\/04\/23\/how-to-get-performance-data-from-power-bi-with-dax-studio\/","title":{"rendered":"How to Get Performance Data from Power BI with DAX Studio"},"content":{"rendered":"<p>    How to Get Performance Data from Power BI with DAX Studio<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<h2 class=\"wp-block-heading\"><mdspan datatext=\"el1745362496873\" class=\"mdspan-comment\">Introduction<\/mdspan><\/h2>\n<p class=\"wp-block-paragraph\">To put things straight: I will not discuss how to optimize DAX Code today.<\/p>\n<p class=\"wp-block-paragraph\">More articles will follow, concentrating on common mistakes and how to avoid them.<\/p>\n<p class=\"wp-block-paragraph\">But, before we can understand the performance metrics, we need to understand the architecture of the Tabular model in <a href=\"https:\/\/towardsdatascience.com\/tag\/power-bi\/\" title=\"Power Bi\">Power Bi<\/a>.<br \/>The same architecture applies to Tabular models in SQL Server Analysis Services.<\/p>\n<p class=\"wp-block-paragraph\">Any Tabular model has two Engines:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Storage Engine<\/li>\n<li class=\"wp-block-list-item\">Formula Engines<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">These two have distinct properties and fulfill different tasks in a Tabular model.<\/p>\n<p class=\"wp-block-paragraph\">Let\u2019s investigate them.<\/p>\n<h2 class=\"wp-block-heading\">Storage Engine<\/h2>\n<p class=\"wp-block-paragraph\">The Storage Engine is the interface between the DAX Query and the data stored in the Tabular model.<\/p>\n<p class=\"wp-block-paragraph\">This Engine takes any given DAX query and sends queries to the Vertipaq Storage engine, which stores the data in the data model.<\/p>\n<p class=\"wp-block-paragraph\">The Storage Engine uses a language called xmSQL to query the data model.<\/p>\n<p class=\"wp-block-paragraph\">This language is based on the standard SQL language but has fewer capabilities and supports only simple arithmetic operators (+, -, \/, *, =, &lt;&gt;, and IN).<\/p>\n<p class=\"wp-block-paragraph\">To aggregate data, xmSQL supports <code>SUM<\/code>, <code>MIN<\/code>, <code>MAX<\/code>, <code>COUNT<\/code>, and <code>DCOUNT<\/code> (Distinct Count).<\/p>\n<p class=\"wp-block-paragraph\">Then it supports <code>GROUP BY<\/code>, <code>WHERE<\/code>, and <code>JOINs<\/code>.<\/p>\n<p class=\"wp-block-paragraph\">It will help if you have a basic understanding of SQL Queries when you try to understand xmSQL. If you don\u2019t know SQL, it will be helpful to learn the basics when digging deeper into analyzing bad-performing DAX code.<\/p>\n<p class=\"wp-block-paragraph\">The most important fact is that the Storage Engine is multi-threaded.<\/p>\n<p class=\"wp-block-paragraph\">Therefore, when the Storage Engine executes a query, it will use multiple CPU-Cores to speed up query execution.<\/p>\n<p class=\"wp-block-paragraph\">Lastly, the Storage Engine can Cache queries and the results.<\/p>\n<p class=\"wp-block-paragraph\">Consequently, repeated execution of the same query will speed up the execution because the result can be retrieved from the cache.<\/p>\n<h2 class=\"wp-block-heading\">Formula Engine<\/h2>\n<p class=\"wp-block-paragraph\">The Formula Engine is the DAX engine.<\/p>\n<p class=\"wp-block-paragraph\">All functions, which the Storage Engine cannot execute, are executed by the Formula Engine.<\/p>\n<p class=\"wp-block-paragraph\">Usually, the Storage Engine retrieves the data from the data model and passes the result to the Formula Engine.<\/p>\n<p class=\"wp-block-paragraph\">This operation is called materialization, as the data is stored in memory to be processed by the Formula Engine.<\/p>\n<p class=\"wp-block-paragraph\">As you can imagine, it is crucial to avoid large materializations.<\/p>\n<p class=\"wp-block-paragraph\">The Storage Engine can call the Formula Engine when an xmSQL-Query contains functions that the Storage Engine cannot execute.<br \/>This is operation id called <code>CallbackDataID<\/code> and should be avoided, if possible.<\/p>\n<p class=\"wp-block-paragraph\">Crucially, the Formula engine is single-threaded and has no Cache.<\/p>\n<p class=\"wp-block-paragraph\">This means:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">No parallelism by using multiple CPU Cores<\/li>\n<li class=\"wp-block-list-item\">No re-use of repeated execution of the same query<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">This means we want to offload as many operations as possible to the Storage engine.<\/p>\n<p class=\"wp-block-paragraph\">Unfortunately, it is impossible to directly define which part of our DAX-Code is executed by which Engine. We must avoid specific patterns to ensure that the correct engine completes the work in the least amount of time.<\/p>\n<p class=\"wp-block-paragraph\">And this is another story that can fill entire books.<\/p>\n<p class=\"wp-block-paragraph\">But how can we see how much time is used by each Engine?<\/p>\n<h2 class=\"wp-block-heading\">Getting the Performance data<\/h2>\n<p class=\"wp-block-paragraph\">We need to have DAX Studio on our machine to get Performance Metrics.<\/p>\n<p class=\"wp-block-paragraph\">We can find the download link for DAX Studio in the References Section below.<\/p>\n<p class=\"wp-block-paragraph\">If you cannot install the Software, you can get a portable DAX version from the same site. Download the ZIP file and unpack it in any local folder. Then you can start DAXStudio.exe, and you get all features without limitations.<\/p>\n<p class=\"wp-block-paragraph\">But first, we need to get the DAX Query from Power BI.<\/p>\n<p class=\"wp-block-paragraph\">First, we need to start Performance Analyzer in Power BI Desktop:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-10.jpg?ssl=1\" alt=\"\" class=\"wp-image-601838\"><figcaption class=\"wp-element-caption\">Figure 1 \u2013 Start Performance Analyzer in Power BI Desktop (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">As soon as we see the Performance Analyzer Pane, we can start recording the performance data and the DAX query for all Visuals:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-73.png?ssl=1\" alt=\"\" class=\"wp-image-601846\"><figcaption class=\"wp-element-caption\">Figure 2 \u2013 Start recording of Performance data and DAX query (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">First, we must click on Start Recording<\/p>\n<p class=\"wp-block-paragraph\">Then click on \u201cRefresh Visuals\u201d to restart the rendering of all Visuals of the actual page.<\/p>\n<p class=\"wp-block-paragraph\">We can click on one of the rows in the list and notice that the corresponding Visual is also activated.<\/p>\n<p class=\"wp-block-paragraph\">When we expand on one of the rows in the report, we see a few rows and a link to copy the DAX query to the Clipboard.<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-12.jpg?ssl=1\" alt=\"\" class=\"wp-image-601845\"><figcaption class=\"wp-element-caption\">Figure 3 \u2013 Select the Visual and copy the query (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">As we can see, Power BI needed 80\u2019606 milliseconds to complete the rendering of the Matrix Visual.<\/p>\n<p class=\"wp-block-paragraph\">The DAX query alone used 80\u2019194 milliseconds.<\/p>\n<p class=\"wp-block-paragraph\">This is a highly poor-performing measure used in this visual.<\/p>\n<p class=\"wp-block-paragraph\">Now, we can start DAX Studio.<br \/>In case we have DAX Studio installed on our machine, we will find it in the External Tool Ribbon:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-68.png?ssl=1\" alt=\"\" class=\"wp-image-601842\"><figcaption class=\"wp-element-caption\">Figure 4 \u2013 Start DAX Studio as an External Tool (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">DAX Studio will automatically be connected to the Power BI Desktop file.<\/p>\n<p class=\"wp-block-paragraph\">In case that we must start DAX Studio manually, we can manually connect to the Power BI file as well:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-11.jpg?ssl=1\" alt=\"\" class=\"wp-image-601840\"><figcaption class=\"wp-element-caption\">Figure 5 \u2013 Manually connect DAX Studio to Power BI Desktop (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">After the connection is established, an empty query is opened in DAX Studio.<\/p>\n<p class=\"wp-block-paragraph\">On the bottom part of the DAX Studio Window, you will see a Log section where you can see what happens.<\/p>\n<p class=\"wp-block-paragraph\">But, before pasting the DAX Query from Power BI Desktop, we have to start Server Timings in DAX Studio (Right top corner of the DAX Studio Window):<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-67.png?ssl=1\" alt=\"\" class=\"wp-image-601841\"><figcaption class=\"wp-element-caption\">Figure 6 \u2013 Start Server Timings in DAX Studio (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">After pasting the Query to the Empty Editor, we have to Enable the \u201cClear on Run\u201d Button and execute the query.<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-69.png?ssl=1\" alt=\"\" class=\"wp-image-601839\"><figcaption class=\"wp-element-caption\">Figure 7 \u2013 Enabling \u201cClear on Run\u201d Feature (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">\u201cClear on Run\u201d ensures the Storage Engine Cache is cleared before executing the Query.<\/p>\n<p class=\"wp-block-paragraph\">Clearing the Cache before measuring performance metrics is the best practice to ensure a consistent starting point for the measurement.<\/p>\n<p class=\"wp-block-paragraph\">After executing the query, we will get a Server Timings page at the bottom of the DAX Studio Window:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-71.png?ssl=1\" alt=\"\" class=\"wp-image-601843\"><figcaption class=\"wp-element-caption\">Figure 8 \u2013 Server Timings Window in DAX Studio (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Now we see a lot of information, which we will explore next.<\/p>\n<h2 class=\"wp-block-heading\">Interpreting the data<\/h2>\n<p class=\"wp-block-paragraph\">On the left side of Server Timings, we will see the execution timings:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-70.png?ssl=1\" alt=\"\" class=\"wp-image-601844\"><figcaption class=\"wp-element-caption\">Figure 9 \u2013 Execution Timings (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Here we see the following numbers:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Total \u2013 The total execution time in milliseconds (ms)<\/li>\n<li class=\"wp-block-list-item\">SE CPU \u2013 The sum of the CPU time spent by the Storage Engine (SE) to execute the Query.<br \/>Usually, this number is greater than the Total time because of the parallel execution using multiple CPU Cores<\/li>\n<li class=\"wp-block-list-item\">FE \u2013 The time spent by the Formula Engine (FE) and the percentage of the total execution time<\/li>\n<li class=\"wp-block-list-item\">SE \u2013 The time spent by the Storage Engine (FE) and the percentage of the total execution time<\/li>\n<li class=\"wp-block-list-item\">SE Queries \u2013 The number of Storage Engine Queries needed for the DAX Query<\/li>\n<li class=\"wp-block-list-item\">SE Cache \u2013 The use of Storage Engine Cache, if any<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">As a rule of thumb: The larger the percentage of Storage Engine time, compared to Formula Engine time, the better.<\/p>\n<p class=\"wp-block-paragraph\">The middle section shows a list of Storage Engine Queries:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-72.png?ssl=1\" alt=\"\" class=\"wp-image-601847\"><figcaption class=\"wp-element-caption\">Figure 10 \u2013 List of Storage Engine queries (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">This list shows how many SE Queries have been executed for the DAX Query and includes some statistical columns:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Line \u2013 Index line. Usually, we will not see all the lines. But we can see all lines by clicking on the Cache and Internal buttons on the top right corner of the Server Timings Pane. But we will not find them very useful, as they are an internal representation of the visible queries. Sometimes it can be helpful to see the Cache queries and see what part of the query has been accelerated by the SE Cache.<\/li>\n<li class=\"wp-block-list-item\">Subclass \u2013 Normally \u201cScan\u201d<\/li>\n<li class=\"wp-block-list-item\">Duration \u2013 Time spent for each SE Query<\/li>\n<li class=\"wp-block-list-item\">CPU \u2013 CPU Time spent for each SE Query<\/li>\n<li class=\"wp-block-list-item\">Par. \u2013 Parallelism of each SE Query<\/li>\n<li class=\"wp-block-list-item\">Rows and KB \u2013 Size of the materialization by the SE Query<\/li>\n<li class=\"wp-block-list-item\">Waterfall \u2013 Timing sequence by the SE Queries<\/li>\n<li class=\"wp-block-list-item\">Query \u2013 The beginning of each SE Query<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">In this case, the first SE Query returned 12\u2019527\u2019422 rows to the Formula engine (The number of rows in the entire Fact table) using 1 GB of Memory. This is not good, as large materializations like these are performance killers.<\/p>\n<p class=\"wp-block-paragraph\">This clearly signifies that we made a big mistake with your DAX Code.<\/p>\n<p class=\"wp-block-paragraph\">Lastly, we can read the actual xmSQL Code:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-75.png?ssl=1\" alt=\"\" class=\"wp-image-601850\"><figcaption class=\"wp-element-caption\">Figure 11 \u2013 Storage \u00a0Engine Query Code (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Here we can see the xmSQL code and try to understand the Problem of the DAX Query.<\/p>\n<p class=\"wp-block-paragraph\">In this case, we see that there is a highlighted CallbackDataID. DAX Studio highlights all CallbackDataID in the Query text and makes all queries in the query list bold, which contains a CallbackDataID.<\/p>\n<p class=\"wp-block-paragraph\">We can see that, in this case, an IF() function is pushed to the Formula Engine (FE), as the SE cannot process this function. But SE knows that FE can do it. So, it calls the FE for each row in the result. In this case, over 12 million times.<\/p>\n<p class=\"wp-block-paragraph\">As we can see from the timing, this takes a lot of time.<\/p>\n<p class=\"wp-block-paragraph\">Now we know that we have written bad DAX Code and the SE calls the FE many times to execute a DAX function. And we know that we use 1 GB of RAM to execute the query.<\/p>\n<p class=\"wp-block-paragraph\">Moreover, we know that the parallelism is only 1.9 times, which could be much better.<\/p>\n<h2 class=\"wp-block-heading\">What it should look like<\/h2>\n<p class=\"wp-block-paragraph\">The DAX query contains only the Query created by Power BI Desktop.<\/p>\n<p class=\"wp-block-paragraph\">But in most cases, we need the Code of the Measure.<\/p>\n<p class=\"wp-block-paragraph\">DAX Studio offers a feature called \u201cDefine Measures\u201d to get the DAX Code of the Measure:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Add one of two blank lines in the Query<\/li>\n<li class=\"wp-block-list-item\">Place the cursor on the first (empty) line<\/li>\n<li class=\"wp-block-list-item\">Find the Measure in the Data Model<\/li>\n<li class=\"wp-block-list-item\">Right-click on the Measure and click on Define Measure<\/li>\n<\/ol>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-74.png?ssl=1\" alt=\"\" class=\"wp-image-601848\"><figcaption class=\"wp-element-caption\">Figure 12 \u2013 Define Measure in DAX Studio (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">5. If our Measure calls another Measure, we can click on Define Dependent Measures. In this case, DAX Studio extracts the code of all Measures used by the selected Measure<\/p>\n<p class=\"wp-block-paragraph\">The result is a <code>DEFINE<\/code> statement followed by one or more <code>MEASURE<\/code> Statements containing the DAX code of our guilty Measure.<\/p>\n<p class=\"wp-block-paragraph\">After optimizing the code, I executed the new Query and took the Server Timings to compare them to the original Data:<\/p>\n<figure class=\"wp-block-image aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/image-13.jpg?ssl=1\" alt=\"\" class=\"wp-image-601849\"><figcaption class=\"wp-element-caption\">Figure 13 \u2013 Comparing slow a fast DAX code (Figure by the Author)<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Now, the entire query took only 55 ms, and SE created a materialization of only 19 Rows.<\/p>\n<p class=\"wp-block-paragraph\">The parallelism is at 2.6 times, which is better than 1.9 times. It looks like the SE didn\u2019t need that much processing power to increase parallelism.<\/p>\n<p class=\"wp-block-paragraph\">This is a very good sign.<\/p>\n<p class=\"wp-block-paragraph\">The optimization worked very well after looking at these numbers.<\/p>\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n<p class=\"wp-block-paragraph\">We need some information when we have a slow Visual in your Power BI Report.<\/p>\n<p class=\"wp-block-paragraph\">The first step is to use Performance Analyzer in Power BI Desktop to see where time is spent rendering the result of the Visual.<\/p>\n<p class=\"wp-block-paragraph\">When we see that it takes much time to execute the DAX Query, we need DAX Studio to find out the problem and try to fix it.<\/p>\n<p class=\"wp-block-paragraph\">I didn\u2019t cover any methods to optimize DAX in this article, as it wasn\u2019t my aim to do it.<\/p>\n<p class=\"wp-block-paragraph\">But now that I have laid down the foundation to get and understand the performance metrics available in DAX Studio, I can write further articles to show how to optimize DAX code, what you should avoid, and why.<\/p>\n<p class=\"wp-block-paragraph\">I\u2019m looking forward to the journey with you.<\/p>\n<h1 class=\"wp-block-heading\">References<\/h1>\n<p class=\"wp-block-paragraph\">Download DAX Studio for free here: <a href=\"https:\/\/www.sqlbi.com\/tools\/dax-studio\/\">https:\/\/www.sqlbi.com\/tools\/dax-studio\/<\/a><\/p>\n<p class=\"wp-block-paragraph\">Free SQLBI Tools Training: <a href=\"https:\/\/www.sqlbi.com\/p\/dax-tools-video-course\/\">DAX Tools Video Course \u2013 SQLBI<\/a><\/p>\n<p class=\"wp-block-paragraph\">SQLBI offers DAX-Optimization training as well.<\/p>\n<p class=\"wp-block-paragraph\">I use the Contoso sample dataset, like in my previous articles. You can download the ContosoRetailDW Dataset for free from Microsoft <a href=\"https:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=18279\">here<\/a>.<\/p>\n<p class=\"wp-block-paragraph\">The Contoso Data can be freely used under the MIT License, as described <a href=\"https:\/\/github.com\/microsoft\/Power-BI-Embedded-Contoso-Sales-Demo\">here<\/a>.<\/p>\n<p class=\"wp-block-paragraph\">\n<p>The post <a href=\"https:\/\/towardsdatascience.com\/how-to-get-performance-data-from-power-bi-with-dax-studio\/\">How to Get Performance Data from Power BI with DAX Studio<\/a> appeared first on <a href=\"https:\/\/towardsdatascience.com\/\">Towards Data Science<\/a>.<\/p>\n<\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><br \/>\n    Salvatore Cagliari<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/towardsdatascience.com\/how-to-get-performance-data-from-power-bi-with-dax-studio\/\">Go to original source<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>How to Get Performance Data from Power BI with DAX Studio Introduction To put things straight: I will not discuss how to optimize DAX Code today. More articles will follow, concentrating on common mistakes and how to avoid them. But, before we can understand the performance metrics, we need to understand the architecture of the [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62,211,2437,2414,1360],"tags":[84,2438,2422],"class_list":["post-3276","post","type-post","status-publish","format-standard","hentry","category-aimldsaimlds","category-data-analysis","category-performance-measurement","category-power-bi-tutorials","category-power-bi","tag-data","tag-engine","tag-storage"],"_links":{"self":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/3276"}],"collection":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/comments?post=3276"}],"version-history":[{"count":0,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/3276\/revisions"}],"wp:attachment":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/media?parent=3276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/categories?post=3276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/tags?post=3276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}