Power Query 系列 (19) - 使用混合查询 (Query Folding)提高性能

在本系列的第 18 篇文章中,我详细讲解了从 MS Access 数获取数据,通过 PQ 完成进出存查询的过程。在示例中, stock_movement_details 查询大约 28000+ 行,计算出基于月份的进出存大致耗时 20 秒左右。使用 Excel 实现这样的输出报表有一定难度,从这个角度来说 PQ 是一个巨大的飞跃。但 28000 条的数据耗时 20 秒,性能就比较低了,这引起了我的好奇。经过一番思考和探索,发现了一些可以提高性能的做法。

查看 PQ 查询消耗的时间可以这样做,在 Excel 结果输出表中,右键选择菜单的【刷新】,或者在右边【查询&连接】面板中点击【刷新】按钮,启动数据刷新。如果数据计算和上载耗时比较长,在Excel 状态栏出现 “正在后台执行查询...” 的提示。点击这个提示,可以中断刷新,或者观察查询的耗时。不过这个界面设计的不够友好,如果查询耗时比较短,就很难调出对话框查看; 另外执行完毕后,计时器也不停止,只能用眼睛观察究竟用了多长时间。

image

查询的过程大体分为三步:

  • 数据从数据源加载到 Power Query
  • Power Query 处理数据 (transformations)
  • 数据上载到 Excel 工作表

当然这个过程消耗的时间还有很多外在因素,比如从数据库加载数据受网络的影响,从本地加载数据也受内存大小和硬盘读写速度的影响。如何确定这个耗时是谁的责任呢?经过搜索,也没有发现很好的方法。网上有介绍 PQ 的 Query Folding -- 简单的说,就是 Power Query 与关系型数据库、OData 等数据源连接的时候,会考虑将一些数据处理 (transformation) 传回数据源进行处理,从而提高速度。能执行 Query Folding 的数据源包括:

  • Relational sources (SQL Server, Oracle, …). They support most Power Query functionality.
  • OData sources (such as a SharePoint list for example and the Azure Marketplace)
  • Active Directory
  • Exchange
  • HDFS, Folder.Files and Folder.Contents (for basic operations on paths)

SQL Server 数据库的 SQL Server Managment Studio 提供了 SQL Server Profiler 工具,所以为了比较和观察,我立即将数据源切换到 SQL Server,执行相同的计算后,发现在 MS Access 中原来需要 20 秒的操作缩短到 2 秒左右。这说明 Query Folding 在提高新能方面确实起了作用,有 SQL Server 参与计算的功劳。根据文章的介绍,我也近距离观察了 Power Query query folding 的一些细节。folding 在英文中主要是弯曲、折叠的意思,也有 mix an ingredient with another ingredient 的意思,所以我将其翻译为混合查询,不一定正确。

在查询编辑器中,选择右边步骤,右键菜单有查看本机查询菜单项,如果菜单为灰色,表示本步骤是 Power Query 做的处理,如果不是灰色,表示该步骤由 PQ 送回数据源(比如数据库)进行处理。比如,我们选择 ExpandedCols 这一步骤,查看本机查询:

image

可以看到这一步骤的操作实际上是一个 SQL 语句:

image

下面我们进入 SQL Server Management Studio 来观察这一过程。通过菜单 【工具】- 【SQL Server Profiler】打开 一个新的 Profiler:

image

在 SQL Server Profiler 中,首先切换到事件选择面板。因为我们只要监控 sql 语句,所以只需要保留 SQL: BatchCompleted 事件即可,减少 log 输出方便我们在后面查看日志快速定位。

image

在 Excel 中,对查询进行刷新操作,不要执行太多操作,以免干扰 SQL Server Profiler 日志内容。刷新后回到 SQL Server Profiler 界面, 停止 Trace。

没有运行之前,Profiler 的界面如下:

image

刷新之后,Profiler 界面如下:

image

在这个界面可以观察完整过程,比如 SQL Server 执行了哪些 SQL 语句,每一步骤消耗了多长时间。

不使用 Query Folding

  • 如果在查询中使用了 Table.Buffer 函数对查询表进行缓存,则不会启动 query folding 功能,可以对数据源调用 Table.Buffer 函数,然后在 SQL Server Profiler 中测试看看两种方法的 sql 语句有什么不同。
  • 如果在查询中使用了自定义的 SQL 语句,则不会启动 query folding 功能

其他还有一些不会启动 query folding 的场景,个人觉得没有必要刻意去记。有兴趣的话请参考我在本文的参考部分列出的文章,里面有具体说明。

一些观察的结论

  • SQL Server 数据库启用 query folding 能提高性能,因为 SQL Server 作为专门的数据库,在服务器端运行,肯定比客户端的 Power Query 有更高性能
  • MS Access 数据库如果对数据源调用 Table.Buffer,反而性能下降得非常厉害,不知道什么原因。在工作表刷新数据的过程中,Windows 任务管理器显示有两个与 Power Query 相关的进程,但耗用内存不大,也没有在计算的过程中占用更大的内存。
  • 连接 csv 文件中的数据,PQ 处理的耗时也没有比 MS Access 更慢,说明 PQ 本身的处理性能还是可以的。
  • 按网上的说法,在循环中(比如 List.Generate 函数)使用 Table.Buffer 能提高性能,未测试。

示例数据

github

参考

Query Folding in Power Query to Improve Performance

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容