Sunday, March 4, 2012

DAX Query Plan, Part 3, Vertipaq Operators

The Vertipaq operators are an important subset of leaf-level operators which are responsible for preparing and sending queries to the Vertipaq Engine for execution and receiving query results. Table 1 is a list of all Vertipaq operators. You can see them in DAX Query Plan trace events by running the sample queries in column 3 against the tabular AdventureWorks database.

Table 1. Vertipaq Operators

Logical Operators
Description
Example
Scan_Vertipaq
This RelLogOp is the foundation of all other Vertipaq logical operators. It represents a basic Vertipaq query that joins a root table with related tables following many-to-one relationships, determines which rows are retrieved by testing against Vertiscan predicates, and groups the resultset by output columns.
evaluate ‘Product’
GroupBy_Vertipaq
This RelLogOp renames columns and adds rollup columns to a Vertipaq query.
evaluate summarize(‘Product’, rollup(‘Product Category’[Product Category Name], ‘Product’[Product Name]))
Filter_Vertipaq
This RelLogOp adds a Verticalc predicate to a Vertipaq query.
evaluate filter('Product', right([Product Name], 4) = "Tire")
Sum_Vertipaq
This ScaLogOp adds a SUM aggregation to a Vertipaq query.
evaluate row("x", sum('Internet Sales'[Sales Amount]))
Min_Vertipaq
This ScaLogOp adds a MIN aggregation to a Vertipaq query.
evaluate row("x", min('Internet Sales'[Sales Amount]))
Max_Vertipaq
This ScaLogOp adds a MAX aggregation to a Vertipaq query.
evaluate row("x", max('Internet Sales'[Sales Amount]))
Count_Vertipaq
This ScaLogOp adds a COUNT aggregation to a Vertipaq query.
evaluate row("x", countrows('Internet Sales'))
DistinctCount_Vertipaq
This ScaLogOp adds a DISTINCTCOUNT aggregation to a Vertipaq query.
evaluate row("x", distinctcount('Internet Sales'[Due Date]))
Average_Vertipaq
This ScaLogOp adds an AVERAGE aggregation to a Vertipaq query.
evaluate row("x", average('Internet Sales'[Sales Amount]))
Stdev.S_Vertipaq
This ScaLogOp adds a STDEV.S aggregation to a Vertipaq query.
evaluate row("x", stdev.s('Internet Sales'[Sales Amount]))
Stdev.P_Vertipaq
This ScaLogOp adds a STDEV.P aggregation to a Vertipaq query.
evaluate row("x", stdev.p('Internet Sales'[Sales Amount]))
Var.S_Vertipaq
This ScaLogOp adds a VAR.S aggregation to a Vertipaq query.
evaluate row("x", var.s('Internet Sales'[Sales Amount]))
Var.P_Vertipaq
This ScaLogOp adds a VAR.P aggregation to a Vertipaq query.
evaluate row("x", var.p('Internet Sales'[Sales Amount]))
Physical Operators


VertipaqResult
This IterPhyOp iterates over the resultset returned by a Vertipaq query.
You can find this operator in the physical plan tree after running any of the above queries.



The Vertipaq Engine runs the fastest when it executes a query in pure Vertiscan mode, which is when the query only contains simple aggregations and simple predicates. A simple aggregation aggregates a single column or counts rows of the table. A simple predicate, called Vertiscan predicate in Table 1, typically looks like [Column] = 5 or [Column] IN { 5, 6, 7, … } or ([Column1], [Column2]) IN { (5, 6), (7, 8), … } where the numbers are data IDs. Note that all column values are encoded as integer data IDs inside the Vertipaq Engine. The Vertipaq Engine extends its basic Vertiscan capabilities through its own calculation engine, called Verticalc. When aggregation expressions or predicate expressions become more complex, the Vertipaq Engine builds calculation trees to evaluate those expressions and can even call back to the DAX Formula Engine for help on those operators it doesn’t support natively. For example, when the aggregation expression is maxx('Internet Sales', year([Due Date])), the Vertipaq Engine calls back to the DAX Formula Engine to evaluate the Year function. Similarly, complex predicate expressions are also evaluated using the Verticalc technology therefore are called Verticalc predicates in Table 1. The Vertipaq Engine typically runs slower when it has to invoke Verticalc evaluations during query execution therefore the DAX Formula Engine converts filter predicates into Vertiscan slices whenever possible.

Ever since the MDX days, users have been complaining that the Formula Engine is single-threaded when it executes a single query. The problem is partially solved when the DAX Formula Engine pushes calculations down to the Vertipaq Engine. Not only is the Vertipaq Engine multi-threaded, it is also able to greatly reduce the number of calculations by taking advantage of large blocks of continuous rows with identical values for those columns referenced by the calculation. Therefore, the DAX Formula Engine tries very hard to push operations down to the Vertipaq Engine whenever possible and it is highly desirable to see mostly Vertipaq operators in DAX Query Plan events.

Caveats of Understanding Vertipaq Operators in DAX Query Plan Trees

As a brand new feature in Denali, the DAX Query Plan has plenty of room for future improvements. Here I am going to highlight three aspects of the current implementation which might confuse users who are trying to read DAX Query Plans for the first time.

1.      The display of Vertipaq operators is too closely tied to the underlying implementation, as a result, users might see multiple nested Vertipaq operators in a plan tree but only a single Vertipaq query is issued. For example, if you run Query 1, you will see four Vertipaq operators, Sum_Vertipaq, Filter_Vertipaq, Filter_Vertipaq, Scan_Vertipaq, in the DAX Query Plan/DAX Vertipaq Logical Plan event, as shown in Figure 1, but only a single Vertipaq SE Query Begin/Vertipaq Scan event. As you can see in Figure 1, a Scan_Vertipaq operator serves as the foundation for all other Vertipaq operators, each aggregation or Verticalc filter has its own operator, and the cascading operators are displayed in a chain of parent-child relationships even though aggregations and Verticalc filters are eventually folded into a single Vertipaq query.

// Query 1
evaluate row("x",
            sumx(
                        filter(
                                    'Internet Sales',
                                    Related(Product[List Price]) < 10
                                    && Related(Customer[Yearly Income]) < 50000
                        ),
                        [Sales Amount]
            )
)



2.      As mentioned in the second installment of the DAX Query Plan blog series, spools are not first-class citizens in Denali DAX Query Plans, but users can still detect the presence of spools in Denali DAX Query Plan trees indirectly through the presence of physical operators which sit directly on top of spools such as the Spool LookupPhyOp or the Spool_IterOnly, Spool_LookupOnly, Spool_SliceIndex IterPhyOps. Let’s call them spool operators in this post to make it easier to refer to them.  If you run Query 2 and examine the physical plan tree shown in Figure 2, you can see a Spool_IterOnly operator with a child VertipaqResult operator. Since the real child operator of Spool_IterOnly is a spool, what’s with the VertipaqResult IterPhyOp? As it turns out, some iterators supply the rows needed to fill a spool when it is materialized and DAX Query Plan shows iterator subtrees which are used to populate the spool as child operators of the spool operator. In Denali, a spool is always constructed to receive the resultset of a Vertipaq query, hence VertipaqResult operator is always a child of a spool operator. An important property of a spool operator is #Records, highlighted in Figure 2, which tells you how many rows of data are in the underlying spool and is currently the most important property to help identify performance problems of a query. When VertipaqResult is the sourcing iterator, this property tells you how many records are returned by the Vertipaq Engine.

// Query 2
evaluate values(Product[List Price])






3.      As stated earlier, Verticalc evaluations may call back to the DAX Formula Engine for unsupported logical operators which in turn would construct the corresponding physical operator trees just as it would when the calculation happens entirely in the Formula Engine. Sometimes the callback functions can be very expensive themselves but those physical operators are not shown in the plan tree. If you run Query 3 you will see in the Vertipaq SE Query Begin event, shown in Figure 3, that the Vertipaq Engine calls back to the DAX Formula Engine for its help with the Year function, but the corresponding physical operator does not show up in the DAX Query Plan/DAX Vertipaq Physical Plan event, shown in Figure 4.

// Query 3
evaluate row("x", maxx('Internet Sales', year([Due Date])))



Special Properties of Scan_Vertipaq RelLogOp

As you have seen in the previous examples, the Scan_Vertipaq operator is at the core of every Vertipaq query and has several special properties worth mentioning here. To show you all the properties of Scan_Vertipaq, run Query 4 and then look at its logical plan.

// Query 4
define measure 'Internet Sales'[Total Sales Amount] = Sum([Sales Amount])
evaluate
            calculatetable(
                        addcolumns(
                                    crossjoin(values('Date'[Month]), distinct('Product Category'[Product Category Name])),
                                    "YTD",
                                    calculate([Total Sales Amount],
                                                filter(
                                                            All('Date'[Month]),
                                                            'Date'[Month]
                                                            <=
                                                            earlier('Date'[Month])
                                                )
                                    )
                        ),
                        'Date'[Calendar Year] = 2003
            )



Below is the longest line I extracted from the logical plan with operator specific properties in bold face.



Scan_Vertipaq: RelLogOp DependOnCols(1, 2)('Date'[Month], 'Product Category'[Product Category Name]) 4-141 RequiredCols(1, 2, 133)('Date'[Month], 'Product Category'[Product Category Name], 'Internet Sales'[Sales Amount]) Table='Internet Sales_78de3956-70d9-429f-9857-c407f7902f1e' -BlankRow JoinCols(2)('Product Category'[Product Category Name]) SemijoinCols(3)('Date'[Month])

As you can see, in addition to the common properties DependOnCols, range of column numbers, and RequiredCols, Scan_Vertipaq also has a couple of extra properties:

·        Table

Displays the internal ID of the root table in Denali. I think this should change to user friendly table name in the future.

·        Whether the blank row is requested

DAX introduced an optional blank row to an IMBI table in order to deal with any incoming referential integrity violations. When users want to include this blank row in the resultset of a Vertipaq query, query plan shows +BlankRow; when users don’t want to include the blank row in the resultset, query plan displays –BlankRow. In Query 4 I deliberately used both the Values function and the Distinct function inside the CrossJoin function to demonstrate the difference, see Figure 5 which was an excerpt from the logical plan.


·        JoinCols

The columns from this table which are needed for natural join with other tables. JoinCols are a subset of DependOnCols, the latter is actually a union of the former and the DependOnCols of all semi-join filter operators.

·        SemijoinCols

The columns from this table which are needed for natural semi-join with filter tables. The DAX Formula Engine simplifies the logical operator tree by converting most explicit semi-join filters to Vertiscan slices or Verticalc slices so that the filtering operations happen inside the Vertipaq Engine, and since DAX Query Plan/DAX Vertipaq Logical Plan events are fired after the simplification stage, users typically don’t see the SemijoinCols property. But when SemijoinCols do show up in the plan, the DAX Formula Engine may have to fetch more columns back, join with the filter tables, and then remove unwanted SemijoinCols by grouping on the desired output columns. When this happens, the Vertipaq operator can be quite expensive as a lot of post-processing happens in the Formula Engine before the final resultset can be returned.

Understand Performance Differences between Equivalent Queries

To conclude today’s post, let’s run two queries which are written in different ways but return the same results and use DAX Query Plans to figure out why they perform differently. Both Query 5 and Query 6 use the AddColumns function to simulate adding a calculated column to the ‘Date’ table. The calculated column calculates the sum of [Sales Amount] after filters the ‘Internet Sales’ table based on a predicate that depends on a column value from the current row. While it is natural to write the calculation as sum of filter as done in Query 5, to get much better performance, you should split the sum and the filter into separate functions and then calculate the sum by adding the filter to the filter context, see Query 6. Compare their logical plans, shown in Figure 6 and Figure 7 respectively, you can see that Query 5 executes both the SumX function and the Filter function in the Formula Engine but Query 6 only executes the Filter function in the Formula Engine but pushes the SumX down to the Vertipaq Engine through the Sum_Vertipaq operator. Since today we have learned that it is always good if calculations can be pushed down to the Vertipaq Engine, Query 6 runs a lot faster than Query 5. So write your DAX expressions to take advantage of Vertipaq operators.

// Query 5
evaluate
            addcolumns(
                        'Date',
                        "x",
                        sumx(
                                    filter('Internet Sales', [Order Date] <= [Date]),
                                    [Sales Amount]
                        )
            )
 

// Query 6
evaluate
            addcolumns(
                        'Date',
                        "x",
                        calculate(
                                    sum('Internet Sales'[Sales Amount]),
                                    'Internet Sales'[Order Date] <= earlier([Date]),
                                    all('Date')
                        )
            )
 


85 comments:

  1. Jeffrey, in the last example using SUMX( 'Internet Sales', 'Internet Sales'[Quantity] * 'Internet Sales'[Unit Price] ) instead of SUM( 'Internet Sales'[Sales Amount] ) you obtain the same query plan - this can be deduced by looking at the query plan. I think that highlighting this makes it clear that is the different usage of SUMX (the second is inside a CALCULATE) that determines its performance and it is not a simple consequence of using SUM instead of SUMX.

    ReplyDelete
  2. Thanks for pointing this out. I have been doing this for so long that I automatically thought of Sum as just a syntax sugar for SumX, but you are right some users may think otherwise.

    ReplyDelete
  3. Hi Jeffrey,
    with the introduction of DAXMD it also seems that some new Operators have been added to the engine like MDXDimensionQuery and MDXMeasure[MyMeasure]
    are you also going to blog about the internals of those new operators in an upcoming post?
    would be great!

    cheers,
    gerhard

    ReplyDelete
  4. Lets say I create a pivot table with a simple equals page filter and another column on rows, would that result in one Scan_Vertipaq operation+a sum_vertipaq after another column is added to the values area?

    ReplyDelete
  5. During the process of adding fields to a pivot table, several MDX queries will be sent from Excel to Analysis Services engine, each MDX query will result in a couple of vertipaq queries, some are basic table scans, others include aggregations like sum. The best way to is watch those events in SQL Server Profiler to see exactly which MDX queries generate which vertipaq queries.

    ReplyDelete
  6. This comment has been removed by the author.

    ReplyDelete
  7. I feel satisfied to read your blog, you have been delivering a useful & unique information to our vision even you have explained the concept as deep clean without having any uncertainty, keep blogging. Power BI Online

    ReplyDelete
  8. Nice post and thanks for sharing with us...keep blogging......
    click here

    ReplyDelete
  9. it’s really nice and meanful. it’s really cool blog. Linking is very useful thing.you have really helped lots of people who visit blog and provide them usefull information.
    MS Power BI Online Training

    ReplyDelete
  10. Thanks for such a great article here. I was searching for something like this for quite a long time and at last I’ve found it on your blog. It was definitely interesting for me to read about their market situation nowadays. Well written article of mdx Thank You for Sharing with Us pmp training fee | pmp certification course in chennai | best pmp training institute in chennai| | pmp training class in chennai \ pmp training fee

    ReplyDelete
  11. Thanks for sharing your information. Great efforts put it to find it which is really amazing. It is very useful to know, Definitely will share the same to other forums.
    openstack training in chennai omr | openstack training in chennai velachery | openstack certification training in Chennai | openstack training in chennai

    ReplyDelete
  12. Thanks For Sharing information
    Yaaron Studios is one of the rapidly growing editing studios in Hyderabad. We are the best Video Editing services in Hyderabad. We provides best graphic works like logo reveals, corporate presentation Etc. And also we gives the best Outdoor/Indoor shoots and Ad Making services.
    Best video editing services in Hyderabad,ameerpet
    Best Graphic Designing services in Hyderabad,ameerpet­
    Best Ad Making services in Hyderabad,ameerpet­

    ReplyDelete
  13. This comment has been removed by the author.

    ReplyDelete
  14. Thank you for sharing such valuable information.Good job.keep it up.Keep writing.
    machine learning institute in btm layout

    ReplyDelete
  15. I have to search sites with relevant information on given topic and provide them to teacher our opinion and the article.
    data analytics courses

    data science interview questions

    business analytics courses

    data science course in mumbai

    ReplyDelete
  16. This is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious.... online data science training

    ReplyDelete
  17. This is a wonderful article. I really enjoyed reading this article. Thanks for sharing such detailed information.
    Data Science Course
    Data Science Course in Marathahalli

    ReplyDelete
  18. It is really great to know you being a responsible writer did take care about the information you have provided in this article.
    SAP training in Mumbai
    Best SAP training in Mumbai
    SAP training institute Mumbai

    ReplyDelete
  19. What a great article!. I am bookmarking it to read it over again after work. It seems like a very interesting topic to write about.
    Data Science training in Mumbai
    Data Science course in Mumbai
    SAP training in Mumbai

    ReplyDelete
  20. I wanted to leave a little comment to support you and wish you a good continuation. Wishing you the best of luck for all your blogging efforts.
    SAP training in Kolkata
    SAP training Kolkata
    Best SAP training in Kolkata
    SAP course in Kolkata

    ReplyDelete
  21. Indeed a great article! I am definitely going to bookmark it to go through it over again after work.
    SAP training in Mumbai
    SAP course in Mumbai

    ReplyDelete
  22. While reading this wonderful article, I came across many aspects on which I coincide with you. It made me head bound to ponder over the topic and read it over again.
    SAP training in Kolkata
    SAP course in kolkata

    ReplyDelete
  23. A good blog always comes-up with new and exciting information and while reading I have feel that this blog is really have all those quality that qualify a blog to be a one.
    data science courses

    ReplyDelete
  24. Thanks for sharing useful information.. we have learned so much information from your blog..... keep sharing
    DevOps Training in Chennai

    DevOps Course in Chennai


    ReplyDelete
  25. Enterprise DNA's education platform contains detailed courses and resources covering all areas and user levels of Power BI. Free and paid content available. Available for online and offline viewing on any device.

    ReplyDelete
  26. The information you have posted is very useful. The sites you have referred to were good. Thanks for sharing.
    data scientist training and placement in hyderabad

    ReplyDelete
  27. Thank you quite much for discussing this type of helpful informative article. Will certainly stored and reevaluate your Website.

    AWS Training in Hyderabad

    ReplyDelete
  28. The worst part of it was that the software only worked intermittently and the data was not accurate. You obviously canot confront anyone about what you have discovered if the information is not right. data science training in surat

    ReplyDelete
  29. This is a fantastic website and I can not recommend you guys enough. data science training in surat

    ReplyDelete
  30. A debt of gratitude is in order for giving late reports with respect to the worry, I anticipate read more. data scientist course in kanpur

    ReplyDelete
  31. Your site is truly cool and this is an extraordinary moving article. data science training in mysore

    ReplyDelete
  32. It is imperative that we read blog post very carefully. I am already done it and find that this post is really amazing. data scientist course in kanpur

    ReplyDelete
  33. I was curious if you ever thought of changing the layout of your site? Its very well written; I love what youve got to say. But maybe you could a little more in the way of content so people could connect with it better. Youve got an awful lot of text for only having 1 or 2 pictures. Maybe you could space it out better?|data analytics course in jodhpur

    ReplyDelete
  34. This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post. I will visit your blog regularly for Some latest post. data science course in mysore

    ReplyDelete
  35. Just pure brilliance from you here. I have never expected something less than this from you and you have not disappointed me at all. I suppose you will keep the quality work going on.
    data science online training in hyderabad

    ReplyDelete
  36. I have read your article, it is very informative and helpful for me.I admire the valuable information you offer in your articles. Thanks for posting it.. data science course in kanpur

    ReplyDelete
  37. Nice knowledge gaining article. This post is really the best on this valuable topic. data scientist course in surat

    ReplyDelete
  38. Actually I read it yesterday but I had some thoughts about it and today I wanted to read it again because it is very well written.
    data science training institute in hyderabad

    ReplyDelete
  39. 360DigiTMG, the top-rated organisation among the most prestigious industries around the world, is an educational destination for those looking to pursue their dreams around the globe. The company is changing careers of many people through constant improvement, 360DigiTMG provides an outstanding learning experience and distinguishes itself from the pack. 360DigiTMG is a prominent global presence by offering world-class training. Its main office is in India and subsidiaries across Malaysia, USA, East Asia, Australia, Uk, Netherlands, and the Middle East.

    ReplyDelete
  40. You should take help from professionals who have immense experience on Microsoft Business Central. They will help you with Solutions easily. Read: business central sydney

    ReplyDelete
  41. This blog is therefore first-class to me. i can keep nearly coming here anew and by now anew. visit my companion as expertly..! ScreenHunter key

    ReplyDelete
  42. yes i am fully decided on amid this text and that i simply indulgent pronounce that this article is deeply best and pretty informative article.i will make hermetically sealed to be studying your blog extra. You made a fine lessening but I can't seasoned occurring but surprise, what kind of the including together facet? !!!!!!thank you!!!!!!! Norton Antivirus Crack

    ReplyDelete
  43. It is very interesting! Really useful for me and thank you for this amazing blog.
    How to get a Divorce in VA

    ReplyDelete
  44. Nice article! It was very innovative thing with unique title and keep it up...
    divorce attorneys fairfax va
    divorce attorneys fairfax va

    ReplyDelete
  45. Hello,
    The author provides an in-depth explanation of Vertipaq operators in DAX query plans. These operators play a crucial role in optimizing and executing queries efficiently within the Vertipaq Engine. Thanks a lot for providing your valuable insights on this topic. It is an informative article.
    Data Analytics Courses in Nashik

    ReplyDelete
  46. This is a great resource for understanding the Vertipaq operators in DAX Query Plans. The author does a great job of explaining the different operators and how they work, as well as the caveats of using them. I would highly recommend this post to anyone who is interested in learning more about DAX Query Plans.
    Data Analytics Courses in Nashik

    ReplyDelete
  47. This article likely delves into DAX query plans, specifically focusing on VertiPaq operators. Valuable for those working with DAX in data analysis and modeling.

    Data Analytics Courses In Kochi



    ReplyDelete
  48. This comment has been removed by the author.

    ReplyDelete
  49. This comment has been removed by the author.

    ReplyDelete
  50. This post on DAX Query Plans, particularly the focus on Vertipaq operators, provides an invaluable insight into the inner workings of DAX and query optimization. It's a comprehensive guide that helps users understand performance differences between queries and optimize their DAX expressions effectively. Thank you for making this complex topic easy to understand.
    Data Analytics Courses In Dubai

    ReplyDelete
  51. The focus on Vertipaq operators in this article on DAX Query Plans, in particular, offers a priceless window into the inner workings of DAX and query optimisation. It is a thorough manual that enables users to successfully optimise their DAX expressions and comprehend performance variations between queries. I appreciate how you made this difficult subject understandable.
    Data Analytics Courses in Agra

    ReplyDelete
  52. The inclusion of real-world examples and screenshots enhances the clarity of your explanations.
    Data Analytics Courses In Chennai

    ReplyDelete
  53. Thank you so much for this detailed blog on DAX Query Plans. I am looking to know more about this topic. Keep Posting!
    Visit - Data Analytics Courses in Delhi

    ReplyDelete
  54. MDX and DAX are powerful tools in the world of data modeling and querying. The way you've explained their differences and use cases is very clear and helpful.
    Data Analytics courses IN UK

    ReplyDelete
  55. good blog
    Data Analytics Courses In Vadodara

    ReplyDelete
  56. Vertipaq operators are essential components in Microsoft Power BI's data modeling engine, responsible for efficiently processing and compressing data to enhance query performance.
    In the context of data analytics, mastering Vertipaq operators can significantly optimize data processing and analysis. Glasgow offers top-notch Data Analytics courses to equip professionals with the skills needed to excel in this field. Please also read Data Analytics courses in Glasgow .

    ReplyDelete
  57. I found your explanations and visual representations of Vertipaq Operators to be both insightful and approachable.
    Digital marketing courses in illinois

    ReplyDelete
  58. This comment has been removed by the author.

    ReplyDelete
  59. This comment has been removed by the author.

    ReplyDelete
  60. The blog tells about "Understanding DAX query plans and VertiPaq" very useful and informative blog
    Digital Marketing Courses In Spain

    ReplyDelete
  61. Thanks for sharing informative and valuable insights on DAX Query Plan .
    data analyst courses in limerick

    ReplyDelete
  62. Your content was a delightful find. It sheds light on the complexities of denial management in healthcare and its impact on operational excellence.

    ReplyDelete
  63. "Great insights into DAX Query plans! The discussion on vertical operators is particularly enlightening. Understanding their role is crucial for optimizing performance. Looking forward to implementing these insights in my projects. Thanks for sharing!"
    Best Data analytics courses in India

    ReplyDelete
  64. Thank you for providing in depth and excellent information on DAX Query Plan.
    Digital Marketing Courses In Bhutan

    ReplyDelete
  65. The series as a whole has been a fantastic resource for anyone working with DAX, and Part 3 is no exception. It's clear that a deep understanding of Vertipaq Operators is crucial for optimizing DAX queries, and your post serves as an excellent guide for those looking to enhance their skills in this area. Digital marketing for business

    ReplyDelete
  66. Thanks for sharing useful and informative information.
    Digital marketing course is growing and so this article shows about the various digital marketing institutes in India.
    https://iimskills.com/investment-banking-courses-after-12th/

    ReplyDelete
  67. Fine-tuning data models does take some effort. Thanks for the useful information.

    Investment banking courses in Germany

    ReplyDelete
  68. Delving deeper into the intricacies of the DAX Query Plan is crucial for optimizing performance. Part 3 provides invaluable insights into query execution, revealing opportunities for refinement. Understanding how DAX transforms queries into actionable plans is key to unlocking efficiency.
    investment banking free course

    ReplyDelete

  69. Thank you for this detailed exploration of DAX Query Plans and Vertipaq operators. Your clear explanations and examples demystify the complexities, providing valuable insights for optimizing queries. Grateful for sharing this expertise!
    Investment banking courses syllabus

    ReplyDelete