分享

DAX Optimizer能否让你成为DAX优化专家

 敬锋 2024-11-04

软件简介

同PBI Explorer一样,这是SQLBI和tabular editor作者联合开发的另一款工具,一如该工具的slogan,该工具是为了查找Power BI模型中存在的问题并给予建议,从而释放Power BI模型的性能。详细的介绍可以参考官方文档,这里不再赘述Introducing DAX Optimizer – Tabular Tools[1] 工具是个好工具,但贵也是真贵,即使是目前有活动,每月的订阅价格也要高达40美元,于我个人而言,我宁愿选择只有19美元的chatgpt4

图片

不过,好在官方终于出了示例,可以用来体验该工具的功能,只需要在设置里打开样例模型

图片

度量值建议

像意大利人一样写DAX,是官方在一场活动上的宣传语,实际体验下来也确实是这样,该工具给出的度量建议都是基于SQLBI的经验总结出的规则。比如随便选择一个警告的度量,左上方可以看到给出的相关文档,并提供了很多示例代码来解释应该怎么优化,并且提供了文档的详细链接,可点击查看详情,比如(Context transition in iterator[2])。然后下方列出了写当前度量相关的其他度量。

图片

也可以在右侧点击箭头查看该度量的详细影响

图片

从功能体验上来说,这确实是一款不错的工具,可以帮助DAX新手,甚至DAX老手解决一些DAX性能优化上的问题。

关于性能优化

早在SQLBI的《DAX圣经[3]》中就有四个章节是讲关于DAX性能优化的,只是这几个章节多少有些晦涩难懂。

图片

另外,SQLBI还有一套关于DAX性能优化的培训视频--Optimizing DAX Video Course - SQLBI[4]。349美元的价格对于国内用户来说还是太过昂贵,像我一样差钱的伙伴可以等他们的新书,SQLBI会将该培训视频中的内容,或者说是该视频中的讲义整理成书于2023年底发布。

图片

到底要不要买

关键问题来了,到底要不要订阅该工具,个人观点是可以买一个月体验,然后总结出SQLBI关于这些问题的一些经验总结,然后再应用到日常DAX的书写中去。毕竟工具是死的,它只能基于一些既定的规则去评判;一如那句话说的DAX is easy, Calculate make it hard。DAX的性能表现如何有时是需要放到具体的上下文中去的,比如SQLBI关于分析DISTINCTCOUNT的这篇博客Analyzing the performance of DISTINCTCOUNT in DAX - SQLBI[5],不同的上下文下性能表现是不一致的。 

另外,DAX性能优化的另一方便,其实是对于DAX函数或者[[DAX引擎]]的理解,减少迭代,使用变量,短短8个字,实际实施的时候并不容易。自上而下的学习,可以让我们更快地做出一些东西,但是自下而上的学习,可以让我走的更稳更远。 那么,如果我想在这条路上走的又快又稳又远呢?那就得微软出手了。DAX Optimizer底层还是根据一些规则去判断度量是否优化,如果把这些规则喂给chatgpt4,甚至未来的chatgpt5,6等等,表现肯定会非常好。然而,微软为了养活第三方工具或者企业,短期内肯定是不会把精力放在这上面的。 

如果,你想成为DAX专家,请使用DAX Studio自己进行优化。

相关链接

如果还没有DAX Optimier账号,但是又想了解DAX常见的一些优化方法,可以查看以下知识库内容,以下内容全部来源于DAX Optimier相关的知识库,目前官方还没有一个完整的目录来完整的获取这些内容,希望后续官方可以开放更多内容出来

  • · Context transition in iterator[6]

  • · Duplicated measure[7]

  • · Duplicated function[8]

  • · Filtered table as iterator[9]

  • · Filtered table as filter argument (generic)[10]

  • · Summarize extended columns[11]

  • · Function replace GROUPBY/SUMMARIZE[12]

  • · Filter modifier function not used as filter argument[13]

  • · Blank comparison[14]

  • · Function replace IFERROR/DIVIDE[15]

  • · Context transition for aggregator instead of using existing row context[16]

  • · Function usage (LAST/FIRST)NONBLANK(VALUES)[17]

  • · (FIRST/LAST)NONBLANK with constant expression[18]

  • · Function replace DISTINCTCOUNT/HASONEVALUE[19]

  • · Redundant functions HASONEVALUE/SELECTEDVALUE (generic)[20]

  • · SUMX with IF predicate on iterator column[21]

  • · SUMX iterator cardinality reduction to single column[22]

  • · Function usage RELATEDTABLE[23]

  • · SUMX iterator excessive CallbackDataId[24]

  • · Function result invariant to current iterator[25]

引用链接

[1] Introducing DAX Optimizer – Tabular Tools: https://www./blog/introducing-dax-optimizer/
[2] Context transition in iterator: https://kb./d/100100
[3] DAX圣经: https://www./books/the-definitive-guide-to-dax-2nd-edition/
[4] Optimizing DAX Video Course - SQLBI: https://www./p/optimizing-dax-video-course/
[5] Analyzing the performance of DISTINCTCOUNT in DAX - SQLBI: https://www./articles/analyzing-distinctcount-performance-in-dax/
[6] Context transition in iterator: https://kb./d/100100
[7] Duplicated measure: https://kb./d/100200
[8] Duplicated function: https://kb./d/100300
[9] Filtered table as iterator: https://kb./d/100400
[10] Filtered table as filter argument (generic): https://kb./d/100500
[11] Summarize extended columns: https://kb./d/100600
[12] Function replace GROUPBY/SUMMARIZE: https://kb./d/100700
[13] Filter modifier function not used as filter argument: https://kb./d/100800
[14] Blank comparison: https://kb./d/100900
[15] Function replace IFERROR/DIVIDE: https://kb./d/101000
[16] Context transition for aggregator instead of using existing row context: https://kb./d/101100
[17] Function usage (LAST/FIRST)NONBLANK(VALUES): https://kb./d/101200
[18] (FIRST/LAST)NONBLANK with constant expression: https://kb./d/101300
[19] Function replace DISTINCTCOUNT/HASONEVALUE: https://kb./d/101400
[20] Redundant functions HASONEVALUE/SELECTEDVALUE (generic): https://kb./d/101500
[21] SUMX with IF predicate on iterator column: https://kb./d/101600
[22] SUMX iterator cardinality reduction to single column: https://kb./d/101700
[23] Function usage RELATEDTABLE: https://kb./d/101800
[24] SUMX iterator excessive CallbackDataId: https://kb./d/101900
[25] Function result invariant to current iterator: https://kb./d/102000

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多