软件简介 同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