List.Contains函数异常:Power Query运行卡顿无响应问题求助
解决Power Query中List.Contains筛选性能问题的方案
问题根源
你当前的List.Contains逐行检查逻辑存在两个核心性能瓶颈:
- 查找效率低:List.Contains是线性查找(O(n)复杂度),每检查一行就要遍历整个ListOfJustifWBS列表,数据量大时耗时极高。
- 重复计算:Power Query的延迟求值特性会导致每次筛选时,ListOfJustifWBS对应的32个Excel文件被重新加载计算,这是进度条重复加载文件的直接原因。
优化步骤
1. 将WBS列表转换为哈希表(Dictionary)
哈希表的查找是常数时间(O(1)),能大幅降低每行的检查耗时。修改你的ListOfJustifWBS查询,最后添加哈希表转换步骤:
let // 保留你原有的32个文件提取、筛选列步骤 Source = ..., #"筛选WBS列" = Table.SelectColumns(Source, {"WBS"}), #"去重WBS" = List.Distinct(Table.Column(#"筛选WBS列", "WBS")), // 转换为哈希表,键为WBS,值设为true即可 #"创建WBS哈希表" = Dictionary.FromList(List.Transform(#"去重WBS", each {_, true})) in #"创建WBS哈希表"
2. 修改筛选逻辑为哈希表查找
替换原有的Table.SelectRows代码,用哈希表的ContainsKey方法代替List.Contains:
= Table.SelectRows(#"Changed Type", each not Dictionary.ContainsKey(ListOfJustifWBS, [WBS]))
3. 避免重复加载源文件
右键点击ListOfJustifWBS查询,选择仅创建连接。这样Power Query会将该查询的结果缓存到内存,不会在每次筛选时重新加载32个Excel文件。
4. 额外优化建议
- 从32个Excel文件提取数据时,使用
Excel.Workbook(File.Contents(...), null, true)的第三个参数true,只加载数据区域而非格式信息,减少加载量。 - 对第二个查询的大型Excel文件,先执行
Table.Distinct(#"Changed Type", {"WBS"})去重WBS后再筛选,减少需要检查的行数。
内容的提问来源于stack exchange,提问作者JustinSane
相关产品推荐
相关产品推荐

