用途:诊断 DAX 查询为何缓慢,并给出优化方向。适用于分析慢查询、解读跟踪中的公式引擎(FE)与存储引擎(SE)耗时、阅读逻辑/物理查询计划、判断高列基数是否为瓶颈,以及新增或审阅性能分析规则。
主要能力:基于最多六类输入进行分析——DAX 查询文本及其传递依赖的度量值表达式、模型元数据(TOM)、查询依赖(INFO.CALCDEPENDENCY)、服务端跟踪详情、DAX 查询计划、Vertipaq Analyzer。规则声明所需输入,缺失则跳过。方法论自上而下:先由跟踪计算总时长、SE 时长与 FE 时长,判断 SE 受限(SE%≥70%)或 FE 受限(FE%≥70%);再查找物理计划中的 CallbackDataID(常由迭代器内的 IF/IFERROR、/ 除法、逐行舍入或日期运算引起);统计 SE 查询数量与单次扫描耗时、并行度;检查 spool 物化;针对查询实际引用的列降低基数(如拆分日期时间、分桶数值、浮点转定点);简化 DAX(嵌套迭代器、全表 FILTER、列谓词 FILTER 改用 KEEPFILTERS、减少引用列)。若未捕获跟踪或计划,会输出提示性发现。
使用方式:规则引擎位于 src/sempy_labs/semantic_model/_dax_optimization.py,规则从同目录 _dax_optimization_rules.json 加载;技能文件夹中的 JSON 为同 schema 的人工参考,新增规则需同步两份。规则字段包括 id、title、category、severity、requires、kind、condition/collection/where、max_findings、message、recommendation、references。条件支持 all/any/not 组合与 >、>=、<、<=、==、!=、contains、not_contains、regex、in、not_in 等操作符,未知操作符或类型错误按 false 处理。可用标量指标包括 se_pct、fe_pct、se_query_count、se_parallelism、callback_dataid_count、spool_count、referenced_column_count、max_data_column_cardinality 等;for_each 集合包括 high_cardinality_columns 与 slow_se_queries。新增指标或集合需在 build_context() 中实现。校验命令:python -c "import json,sys; json.load(open('src/sempy_labs/semantic_model/_dax_optimization_rules.json'))"。
限制:Vertipaq 规则仅在数据列基数不全为 1 时启用;FILTER 规则区分度量值与列谓词依赖模型元数据或括号引用是否带表名;具体阈值与规则清单以资料所述为准,其他平台支持、收费与效果暂未提供。