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

优化基于Hull Number、Date/Time的Full Outer Join效率咨询

Power Query百万级表Full Outer Join后追加操作的效率优化方案

原方案核心问题

原流程先执行全外连接并展开所有字段,再拆分左右部分处理,会生成包含两张表所有字段的超大中间数据集(最多可达300万+记录),且多次重复计算该数据集,导致内存占用过高、计算效率极低,这是5小时无结果的根本原因。

优化思路

跳过全外连接的中间大表,直接拆分处理:

  • 左表部分:直接使用原左表所有记录(全外连接中左表记录全部保留)
  • 右表部分:仅提取右表中未在左表匹配到连接键的记录,无需先做全连接再筛选
  • 最后合并两部分结果,全程避免生成冗余中间表

具体优化实现

步骤1:预生成左表连接键的唯一集合(用于快速判断)

先提取左表的连接键组合并去重,生成哈希表结构,让后续的存在性判断从O(n)降到O(1):

// 生成左表连接键的唯一集合,保存为查询LeftKeyHash
let
    LeftKeys = Table.SelectColumns(pfFPTenginemcu, {"Hull Number", "Date", "Time"}),
    DistinctLeftKeys = Table.Distinct(LeftKeys),
    KeyList = Table.ToRecords(DistinctLeftKeys),
    KeyHash = List.Accumulate(KeyList, [Hash=[]], (state, current) => [Hash=state[Hash] & {current}])[Hash]
in
    KeyHash

步骤2:处理右表(仅保留左表无匹配的记录)

// pfFPTmcumergedRight 优化版
let
    Source = pfFPTswbdmcu,
    // 添加辅助列判断当前记录是否在左表有匹配
    #"Added Match Flag" = Table.AddColumn(Source, "IsInLeft", each List.Contains(LeftKeyHash, [Hull Number=[Hull Number], Date=[Date], Time=[Time]])),
    // 筛选出左表无匹配的记录
    #"Filtered Non-Match" = Table.SelectRows(#"Added Match Flag", each [IsInLeft] = false),
    // 删除辅助列
    #"Removed Match Flag" = Table.RemoveColumns(#"Filtered Non-Match", {"IsInLeft"})
in
    #"Removed Match Flag"

步骤3:合并左表和处理后的右表

// fMCUTrend 优化版
let
    Source = Table.Combine({pfFPTenginemcu, pfFPTmcumergedRight})
in
    Source

额外性能优化建议

  • 数据类型对齐:确保两张表的连接键(Hull Number、Date、Time)数据类型完全一致,避免连接时的隐式类型转换
  • 精简字段:提前删除左表/右表中不需要的字段,降低内存占用
  • 启用缓存:在Power Query选项中开启缓存,避免重复计算相同步骤
  • 升级硬件:临时提升工作站内存(建议16GB以上),Power Query对内存依赖较高

内容的提问来源于stack exchange,提问作者hic24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:29:54