PowerQuery:添加带计算逻辑的多列遇性能问题
问题分析与解决方案
你这段代码运行极慢的核心原因是在Table.AddColumn的行级计算逻辑里,错误使用了Table.Column(state, current)和Table.Column(state, "Old." & Text.RemoveRange(current, 0, 4))——这两个函数会每次读取整列的所有数据再逐行比较,加上List.Accumulate每迭代一次就生成新表,重复加载整列的操作会让计算量呈指数级增长,直接导致程序卡死。
正确修改思路
在Table.AddColumn的each上下文里,不需要取整列,直接引用当前行的对应字段即可:用[#current]调用当前处理的New前缀列,用[Old.XXX]调用对应的旧数据列,逐行比较单个值而非整列对比。同时提前提取基础列名,避免重复执行字符串操作,进一步优化效率。
修改后的完整代码
= let SourceTable = #"Extend joined table", NewColumns = List.Select(Table.ColumnNames(SourceTable), each Text.StartsWith(_, "New.")), ProcessedTable = List.Accumulate(NewColumns, SourceTable, (state, current) => let BaseColumnName = Text.RemoveRange(current, 0, 4), // 移除"New."前缀 OldColumnName = "Old." & BaseColumnName, DiffColumnName = BaseColumnName & "_IsDifferent" in Table.AddColumn(state, DiffColumnName, each [#current] <> [OldColumnName], type logical) ) in ProcessedTable
优化效果说明
- 逐行比较单个字段值,而非加载整列数据做批量对比,内存占用和计算量大幅降低;
- 提前计算基础列名,避免在每次迭代中重复执行字符串操作;
List.Accumulate的迭代逻辑更清晰,每一步只处理当前列的差异计算,无冗余操作。
内容的提问来源于stack exchange,提问作者kami
相关产品推荐
相关产品推荐

