對於使用Power Query有時很慢、卡住讓我有點困擾,因為在某種程度我認為Power Query比VBA快,而且在不同資料來源彙整上我還是偏好使用Power Query,研究了官方對於重複查詢的問題(這裡)還有用一些關鍵字(Ppwer Query Slow+ Table.Buffer、 List.Buffer、 Table.NestedJoin、Table.Combine)爬了國外的論壇,在Power Query有些情況變慢大概有些理解,在這裡就做個詳細記錄。
我本身非資訊背景,因此大部分資訊都是在網路上資源看到,在一些國外論壇或部落客大部分是建議以Table.Buffer及List.Buffer方式處理,但這種方式也不是完全有用,官方的建議(這裡)是建立資料流程封裝來源資料,我的理解是將源頭資料比較大的,還有一些中間步驟有使用到比較複雜查詢時另外存檔,這樣後面的步驟在查詢時就不會讓前面的步驟一直讀取,如果來源資料很大,雖然你已經使用Table.Buffer及List.Buffer處理,他仍然會在讀取一次源頭(我觀察是這樣),如果沒用Bufferr就會讓讓讀取次數滾很多次。
Buffer 概念簡單說明一下,這是我理解的,所以可能說明不是那麼正確,在Power Query中查詢表中的每一個步驟本身都是一個Table或List,如果某些步驟做了很複雜的查詢,這時下一個步驟要飲用時會建議使用Buffer的方式,讓他不會重新計算一次,而是指接引用Buffer裡面的結果,有大陸的網友以計算機的M功能做Buffer做解釋,感覺是幫助了理解。
就目前查詢到最常使用就是在Table.Comine 或 Table.NestedJoin之前先將相關的Table以Table.Buffer處理,List.Contains則是先用List.Buffer處理。
不過最有效的方式就是資料流程的規劃,我有一個對同一資料做不同查詢再互相引用,未將步驟切開另外存檔時跑了20幾分鐘,切開後只要1分鐘內,這真的令人驚訝。在VBA中每一個步驟是很明顯的,但在Power Query不同查詢表的先後順序感覺不出它Run的方式,我想這也是其中一個影響到查詢時間的因素。
沒有留言:
張貼留言