如何解决DAX太慢-标量值实现问题
我采用以下措施来计算图形图表表的节点大小:
MEASURE tMeasures[m_ONA_nodeSize_flex] =
IF(
ISBLANK([m_ONA_rankFilter_nodes]),BLANK(),var empCnt = ROW(
"data",CALCULATE(
SUMX( DISTINCT(tONAAppend[id]),1),FILTER(
ALL(tONAAppend),NOT( ISBLANK([m_ONA_rankFilter_nodes]))
)
)
)
RETURN
IF(
empCnt > 25,ROUND( 1500 / empCnt,0),60
)
)
[m_ONA_rankFilter_nodes]
用于过滤同一表的边缘中存在的那些节点。这些边缘还可以使用多个条件以度量m_ONA_edgeValue_afterRank
进行过滤,如果一行与过滤器不匹配,则返回BLANK()
,如果不匹配则返回edge_value
。
在将tMeasures[m_ONA_nodeSize_flex]
与包含的度量[m_ONA_rankFilter_nodes]
和m_ONA_edgeValue_afterRank
一起使用之前,脚本的运行速度相对较快:
EVALUATE
TOPN(
501,SUMMARIZECOLUMNS(
'tONAAppend'[tableName],'tONAAppend'[name],'tONAAppend'[nameFrom],'tONAAppend'[nameTo],'tONAAppend'[id],'tONAAppend'[idFrom],'tONAAppend'[idTo],'tONAAppend'[photoSrc],__DS0FilterTable,__DS0FilterTable2,__DS0FilterTable3,__DS0FilterTable4,"m_ONA_edgeValue_afterRank",'tMeasures'[m_ONA_edgeValue_afterRank],"m_ONA_rankFilter_nodes",'tMeasures'[m_ONA_rankFilter_nodes]
),'tONAAppend'[tableName],1,1
)
但是,当我将'tMeasures'[m_ONA_rankFilter_nodes]
替换为'tMeasures'[m_ONA_nodeSize_flex]
时,它的运行速度会大大降低:
EVALUATE
TOPN(
501,"m_ONA_nodeSize_flex",'tMeasures'[m_ONA_nodeSize_flex]
),1
)
据我了解,问题出在DAX引擎工作中:它尝试为每一行计算该度量的值。我认为最快的算法可以计算一次,然后发送到存储,然后用它填充所有行。
如何优化DAX并使其更有效地工作?
解决方法
我找到了与该主题相关的好文章,然后用其中写的变量实现了方法:
https://www.sqlbi.com/articles/optimizing-conditions-involving-blank-values-in-dax/ https://www.sqlbi.com/articles/understanding-eager-vs-strict-evaluation-in-dax/
它按预期方式工作-放在特殊变量中的所有度量均在#include <iostream>
int main(int argc,char*argv[]) {
unsigned int number = 12345; // Some number
int bit_number_to_read = 1;
int mask = 1 << bit_number_to_read;
int masked_n = number & mask;
unsigned int the_bit = masked_n >> bit_number;
std::cout << "The first bit of number contains: " << the_bit << std::endl;
return 0;
}
中实现。性能大大提高了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。