如何解决Power BI中‘Amount (ex mgmt)’度量值的性能问题?
度量值性能优化与薪资权限控制
原度量值代码
Amount (ex mgmt) = IF( OR( SELECTEDVALUE(IMSEmployeeTimesheet[OriginalCostCentre]) = "1000-92-00", SELECTEDVALUE(IMSEmployeeTimesheet[OriginalCostCentre]) = "1000-09-00" ) && NOT(USERPRINCIPALNAME()) IN {"c.hall@abc.com", "s.goss@abc.com", "n.cockroft@abc.com"}, BLANK(), SUMX(IMSEmployeeTimesheet, IMSEmployeeTimesheet[Amount]) )
性能问题报错
详细信息:资源管控:此查询使用的内存超出配置限制。该查询或其引用的计算可能占用内存过高,无法运行。请简化查询或计算,若使用Power BI Premium,可联系容量管理员调整单查询内存限制。详情:已消耗内存1331 MB,内存限制1331 MB。
活动ID:4c980721-99e3-4543-99fb-0b7db9cd9f7d
关联ID:e653bb76-ea95-b019-0e91-97893c535225
请求ID:3c57fbc4-f3ac-4f84-9518-20d362d88df1
时间:2023年6月15日星期四 新西兰标准时间11:07:42(GMT+1200)
服务版本:13.0.20866.74
客户端版本:2306.1.14294-train
集群URI:https://wabi-australia-southeast-redirect.analysis.windows.net/
用户需求
隐藏成本中心1000-92-00和1000-09-00对应的管理层薪资数据;普通团队成员查看仪表板时,总计数据自动排除管理层薪资,不受影响;仅指定的3个邮箱用户可查看该类薪资数据。
优化后的度量值
Amount (ex mgmt) = VAR AllowedUsers = {"c.hall@abc.com", "s.goss@abc.com", "n.cockroft@abc.com"} VAR IsAllowed = USERPRINCIPALNAME() IN AllowedUsers VAR MgmtCostCentres = {"1000-92-00", "1000-09-00"} VAR CurrentCostCentre = SELECTEDVALUE(IMSEmployeeTimesheet[OriginalCostCentre]) RETURN IF( NOT(IsAllowed) && CurrentCostCentre IN MgmtCostCentres, BLANK(), CALCULATE( SUM(IMSEmployeeTimesheet[Amount]), IF(NOT(IsAllowed), FILTER(IMSEmployeeTimesheet, NOT(IMSEmployeeTimesheet[OriginalCostCentre] IN MgmtCostCentres)), ALL(IMSEmployeeTimesheet) ) ) )
优化说明
- 变量复用:用VAR定义固定列表和判断结果,减少重复计算,提升代码可读性
- 替换SUMX为SUM:SUM是直接聚合函数,比逐行迭代的SUMX效率更高,尤其在大数据量场景下
- 提前筛选数据:对无权限用户,在CALCULATE中提前排除管理层成本中心数据,减少求和的数据量
- 简化逻辑判断:用IN替代OR+等于判断,逻辑更简洁,DAX引擎处理更高效
额外优化建议
- 将允许用户列表、管理层成本中心列表放到单独的参数表中,方便后续维护,同时让DAX引擎更好地缓存计算结果
- 若数据量极大,可结合**行级别安全性(RLS)**在数据加载阶段实现权限控制,进一步降低前端计算压力
内容的提问来源于stack exchange,提问作者Vivek Sharma
相关产品推荐
相关产品推荐

