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

在本系列的第 18 篇文章中莫秆,我詳細(xì)講解了從 MS Access 數(shù)獲取數(shù)據(jù)器瘪,通過 PQ 完成進(jìn)出存查詢的過程昧辽。在示例中应又, stock_movement_details 查詢大約 28000+ 行运怖,計(jì)算出基于月份的進(jìn)出存大致耗時(shí) 20 秒左右孕锄。使用 Excel 實(shí)現(xiàn)這樣的輸出報(bào)表有一定難度迹冤,從這個(gè)角度來說 PQ 是一個(gè)巨大的飛躍入挣。但 28000 條的數(shù)據(jù)耗時(shí) 20 秒嚣州,性能就比較低了鲫售,這引起了我的好奇。經(jīng)過一番思考和探索该肴,發(fā)現(xiàn)了一些可以提高性能的做法情竹。

查看 PQ 查詢消耗的時(shí)間可以這樣做,在 Excel 結(jié)果輸出表中沙庐,右鍵選擇菜單的【刷新】鲤妥,或者在右邊【查詢&連接】面板中點(diǎn)擊【刷新】按鈕佳吞,啟動(dòng)數(shù)據(jù)刷新。如果數(shù)據(jù)計(jì)算和上載耗時(shí)比較長(zhǎng)棉安,在Excel 狀態(tài)欄出現(xiàn) “正在后臺(tái)執(zhí)行查詢...” 的提示底扳。點(diǎn)擊這個(gè)提示,可以中斷刷新贡耽,或者觀察查詢的耗時(shí)衷模。不過這個(gè)界面設(shè)計(jì)的不夠友好,如果查詢耗時(shí)比較短蒲赂,就很難調(diào)出對(duì)話框查看; 另外執(zhí)行完畢后阱冶,計(jì)時(shí)器也不停止,只能用眼睛觀察究竟用了多長(zhǎng)時(shí)間滥嘴。

image

查詢的過程大體分為三步:

  • 數(shù)據(jù)從數(shù)據(jù)源加載到 Power Query
  • Power Query 處理數(shù)據(jù) (transformations)
  • 數(shù)據(jù)上載到 Excel 工作表

當(dāng)然這個(gè)過程消耗的時(shí)間還有很多外在因素木蹬,比如從數(shù)據(jù)庫(kù)加載數(shù)據(jù)受網(wǎng)絡(luò)的影響,從本地加載數(shù)據(jù)也受內(nèi)存大小和硬盤讀寫速度的影響若皱。如何確定這個(gè)耗時(shí)是誰的責(zé)任呢镊叁?經(jīng)過搜索,也沒有發(fā)現(xiàn)很好的方法走触。網(wǎng)上有介紹 PQ 的 Query Folding -- 簡(jiǎn)單的說晦譬,就是 Power Query 與關(guān)系型數(shù)據(jù)庫(kù)、OData 等數(shù)據(jù)源連接的時(shí)候互广,會(huì)考慮將一些數(shù)據(jù)處理 (transformation) 傳回?cái)?shù)據(jù)源進(jìn)行處理敛腌,從而提高速度。能執(zhí)行 Query Folding 的數(shù)據(jù)源包括:

  • 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 數(shù)據(jù)庫(kù)的 SQL Server Managment Studio 提供了 SQL Server Profiler 工具惫皱,所以為了比較和觀察像樊,我立即將數(shù)據(jù)源切換到 SQL Server,執(zhí)行相同的計(jì)算后逸吵,發(fā)現(xiàn)在 MS Access 中原來需要 20 秒的操作縮短到 2 秒左右凶硅。這說明 Query Folding 在提高新能方面確實(shí)起了作用,有 SQL Server 參與計(jì)算的功勞扫皱。根據(jù)文章的介紹,我也近距離觀察了 Power Query query folding 的一些細(xì)節(jié)捷绑。folding 在英文中主要是彎曲韩脑、折疊的意思,也有 mix an ingredient with another ingredient 的意思粹污,所以我將其翻譯為混合查詢段多,不一定正確。

在查詢編輯器中壮吩,選擇右邊步驟进苍,右鍵菜單有查看本機(jī)查詢菜單項(xiàng)加缘,如果菜單為灰色,表示本步驟是 Power Query 做的處理觉啊,如果不是灰色拣宏,表示該步驟由 PQ 送回?cái)?shù)據(jù)源(比如數(shù)據(jù)庫(kù))進(jìn)行處理。比如杠人,我們選擇 ExpandedCols 這一步驟勋乾,查看本機(jī)查詢:

image

可以看到這一步驟的操作實(shí)際上是一個(gè) SQL 語句:

image

下面我們進(jìn)入 SQL Server Management Studio 來觀察這一過程。通過菜單 【工具】- 【SQL Server Profiler】打開 一個(gè)新的 Profiler:

image

在 SQL Server Profiler 中嗡善,首先切換到事件選擇面板辑莫。因?yàn)槲覀冎灰O(jiān)控 sql 語句,所以只需要保留 SQL: BatchCompleted 事件即可罩引,減少 log 輸出方便我們?cè)诤竺娌榭慈罩究焖俣ㄎ弧?p>

image

在 Excel 中各吨,對(duì)查詢進(jìn)行刷新操作,不要執(zhí)行太多操作袁铐,以免干擾 SQL Server Profiler 日志內(nèi)容绅你。刷新后回到 SQL Server Profiler 界面, 停止 Trace昭躺。

沒有運(yùn)行之前忌锯,Profiler 的界面如下:

image

刷新之后,Profiler 界面如下:

image

在這個(gè)界面可以觀察完整過程领炫,比如 SQL Server 執(zhí)行了哪些 SQL 語句偶垮,每一步驟消耗了多長(zhǎng)時(shí)間。

不使用 Query Folding

  • 如果在查詢中使用了 Table.Buffer 函數(shù)對(duì)查詢表進(jìn)行緩存帝洪,則不會(huì)啟動(dòng) query folding 功能似舵,可以對(duì)數(shù)據(jù)源調(diào)用 Table.Buffer 函數(shù),然后在 SQL Server Profiler 中測(cè)試看看兩種方法的 sql 語句有什么不同葱峡。
  • 如果在查詢中使用了自定義的 SQL 語句砚哗,則不會(huì)啟動(dòng) query folding 功能

其他還有一些不會(huì)啟動(dòng) query folding 的場(chǎng)景,個(gè)人覺得沒有必要刻意去記砰奕。有興趣的話請(qǐng)參考我在本文的參考部分列出的文章蛛芥,里面有具體說明。

一些觀察的結(jié)論

  • SQL Server 數(shù)據(jù)庫(kù)啟用 query folding 能提高性能军援,因?yàn)?SQL Server 作為專門的數(shù)據(jù)庫(kù)仅淑,在服務(wù)器端運(yùn)行,肯定比客戶端的 Power Query 有更高性能
  • MS Access 數(shù)據(jù)庫(kù)如果對(duì)數(shù)據(jù)源調(diào)用 Table.Buffer胸哥,反而性能下降得非常厲害涯竟,不知道什么原因。在工作表刷新數(shù)據(jù)的過程中,Windows 任務(wù)管理器顯示有兩個(gè)與 Power Query 相關(guān)的進(jìn)程庐船,但耗用內(nèi)存不大银酬,也沒有在計(jì)算的過程中占用更大的內(nèi)存。
  • 連接 csv 文件中的數(shù)據(jù)筐钟,PQ 處理的耗時(shí)也沒有比 MS Access 更慢揩瞪,說明 PQ 本身的處理性能還是可以的。
  • 按網(wǎng)上的說法盗棵,在循環(huán)中(比如 List.Generate 函數(shù))使用 Table.Buffer 能提高性能壮韭,未測(cè)試。

示例數(shù)據(jù)

github

參考

Query Folding in Power Query to Improve Performance

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纹因,一起剝皮案震驚了整個(gè)濱河市喷屋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞭恰,老刑警劉巖屯曹,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惊畏,居然都是意外死亡恶耽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門颜启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偷俭,“玉大人,你說我怎么就攤上這事缰盏∮坑” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵口猜,是天一觀的道長(zhǎng)负溪。 經(jīng)常有香客問我,道長(zhǎng)济炎,這世上最難降的妖魔是什么川抡? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮须尚,結(jié)果婚禮上崖堤,老公的妹妹穿的比我還像新娘。我一直安慰自己恨闪,他們只是感情好倘感,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咙咽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淤年。 梳的紋絲不亂的頭發(fā)上钧敞,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天蜡豹,我揣著相機(jī)與錄音,去河邊找鬼溉苛。 笑死镜廉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愚战。 我是一名探鬼主播娇唯,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寂玲!你這毒婦竟也來了塔插?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤拓哟,失蹤者是張志新(化名)和其女友劉穎想许,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體断序,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡流纹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了违诗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漱凝。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诸迟,靈堂內(nèi)的尸體忽然破棺而出茸炒,到底是詐尸還是另有隱情,我是刑警寧澤亮蒋,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布扣典,位于F島的核電站,受9級(jí)特大地震影響慎玖,放射性物質(zhì)發(fā)生泄漏贮尖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一趁怔、第九天 我趴在偏房一處隱蔽的房頂上張望湿硝。 院中可真熱鬧,春花似錦润努、人聲如沸关斜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痢畜。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丁稀,已是汗流浹背吼拥。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留线衫,地道東北人凿可。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像授账,于是被迫代替她去往敵國(guó)和親枯跑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容