You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:25:25