【待发】PQ算法调优 | 从缓存表到缓存列,科目余额表取最明细数据问题极速提效

- 1 - 卡出翔的基础方法

小勤:前面关于《最明细数据》的例子里,用Power Query做判断的方法虽然比较简单,但是数据量大了直接卡出翔啊!数据1万多行,每秒加载5行不到……

大海:的确,这个判断简单,但是每次都要回头引用上面步骤的结果表,所以1万多行,等于回去引用个同样1万多行的表1万多次……

小勤:那怎么办?能不能优化一下啊?

- 2 - 缓存表得到改善

大海:当然可以的。首先可以试试将被引用的表加个缓存,如下:

小勤:这样有啥用?

大海:因为在后面添加自定义列的步骤里需要频繁调用“已添加索引”步骤的结果表,所以用Table.Buffer一次性将表加载到缓存里,后面再引用时效率一般会得到比较好的提升。相关文章可参考《PQ-M及函数:加Buffer缓存提升查询效率》。

小勤:啊。试一下——好像快了一点儿,每秒能300-500行左右了,勉强能接收,但还是比较慢,而且越后面越慢呢。还能再快点儿吗?

- 3 - 只缓存关键列极速提效

大海:那我们再回头看一下这个例子,实际上我们只要引用“科目编码”列做判断即可,所以,我们没有必要去引用整个表,所以,也只要缓存这个列即可,这样,既使得缓存的消耗更小,而且直接读取列表的内容比从表里定位到某行列的内容更快,应该能得到很好的优化。

小勤:具体怎么做?

大海:首先,在按原来的方法添加索引列后,增加一个步骤,对表的科目编码列进行缓存:

然后,在添加自定义列里面,仅调用缓存好的科目列表进行判断,如下所示:

= try if Text.Contains(科目列表{[索引]+1},[科目编码]) then null else [本币] otherwise [本币]

小勤:原来这样,走你……

妈呀,全部一起出来了!

大海:嗯。这个效果还不错吧。

小勤:对了,那个PP的方法也很慢啊,有没有办法改善一下?

大海:我想应该是有的,下次我们再看看。

(0)

相关推荐