1.keepfilter+filter+all比filter+values速度快
本文的pbix文件
链接:https://pan.baidu.com/s/1paHI01rpguUMxE6pdsjSZw
提取码:xs41
test1_keepfilter = CALCULATE(DISTINCTCOUNT(Sheet1[name]),
KEEPFILTERS(FILTER(ALL(Sheet1[name]),[sumofsell]>2)))
test3_values = CALCULATE(DISTINCTCOUNT(Sheet1[name]),
FILTER(VALUES(Sheet1[name]),[sumofsell]>2))
耗时对比
耗时数据量少,差距不太明显,但是可以看到查询行数的差距
filter+values:因为SE引擎需要FE引擎去计算 [sumofsell]>2,产生了CallbackDataID ,每遇到一个那么都需要在两个引擎件传输数据
keepfilter+filter+all:在Line1,Line2行可以看到FE引擎直接执行了count()和sum(),然后SE引擎执行的xmSQL语句为:
SET DC_KIND="GEC32";
SELECT
'Sheet1'[name], 'Sheet1'[name]
FROM 'Sheet1'
WHERE
'Sheet1'[name] INB ( 'a', 'c' ) ;
在后来的查询都是SE引擎在工作,所以此公式写法较快
还是那个句话,尽量将工作交给SE引擎,然后查看xmsql语句进行优化,FE公式引擎的绝大部分都是不可读的。
2. keepfilter+filter+all并不会清除all参数列上的筛选器
test1 = CALCULATE(DISTINCTCOUNT(Sheet1[name]),
KEEPFILTERS(FILTER(ALL(Sheet1[name]),[sumofsell]>2)))
下面的图a、c为的销量大于2,所以DISTINCTCOUNT为1,b的销量为2,所以为空
更明显一点,用筛选器选了b,显示为空是正确的
筛选器选了a,显示为1
3. keepfilter+filter+all不会清除外层函数的上下文
test2 = CALCULATE(CALCULATE(DISTINCTCOUNT(Sheet1[name]),
KEEPFILTERS(FILTER(ALL(Sheet1[name]),[sumofsell]>2))),'Sheet1'[name]="a")
外层函数限定了a,所以全部是1
当然筛选器选了b,结果也是1
结论:
keepfilter+filter+all的效果等于filter+values,但是一般而言比后者快(具体情况还是需要用daxstudio实测),all函数因为keepfilter函数所以可以受筛选上下文的影响,实质就是将filter内的筛选条件加入到当前整个函数的筛选上下文。
keepfilter+filter+all还有一个好处还在于可以all多个列, ALL( 列1, 列2)
网友评论