【性能優化】面向存儲引擎,優化基礎度量值得到海量性能提升

2022-01-03 PowerBI戰友聯盟

性能優化,在 DAX 中是很重要的問題,對 DAX 的性能優化大致可以歸結為針對 SE(存儲引擎) 或 FE(公式引擎) 的性能優化。

如果可以確保 SE 和 FE 都在最好的狀態下工作,那麼 DAX 將得到充分的發揮。而往往分析師會更加關注業務邏輯的表達,但我們開始研究寫出更快的 DAX 時,我們將成為會修車的分析師了。我們會通過一系列文章來幫助大家在各個角度來體會 DAX 的性能優化技術。

今天我們來看一個案例。

看一個案例,我們想知道大訂單的個數,如下:

OrderPurchaseNumber =
CALCULATE(
DISTINCTCOUNT( 'Order'[OrderID] ) ,

FILTER(
'Order' ,
'Order'[LinePrice] > 1000 && 'Order'[LineProfit] > 0
)
)

大訂單的定義為包含單價大於1000且利潤大於0的訂單。

這個定義沒有問題,放在 PowerBI 中的計算也是正確的,但不久就會發現它的性能問題,於是,通過 DAX Studio 來檢查可以看到:

我暈,居然驚現了 779 個查詢。

該查詢的意義是計算每天的大訂單個數。但這種方法顯然是不行的。雖然在度量值的定義上非常自然。

我們再來看看從 PowerBI 中拖拽的情況,如下:

如果研究該圖表背後的 DAX 查詢,其結果和上述內容是一致的。

那麼問題來了,我們建立了一個基礎度量值叫:OrderPurchaseNumber,其邏輯也很清楚,但卻有如此之差的性能,怎麼辦呢?

原因分析

這裡的問題在於發起了對 SE 的多次查詢,不難察覺:

FILTER(
'Order' ,
'Order'[LinePrice] > 1000 && 'Order'[LineProfit] > 0
)

這裡使用了 Order 表作為 FILTER 的參數,而且位於基礎度量值的位置,導致在迭代日期時,每次都會做單獨計算,導致對 SE 的過度重複訪問。

改進措施

有一種做法是,可以將度量值改為:

OrderPurchaseNumber =
CALCULATE(
DISTINCTCOUNT( 'Order'[OrderID] ) ,

FILTER(
ALL( 'Order' ) ,
'Order'[LinePrice] > 1000 && 'Order'[LineProfit] > 0
)
)

注意,這裡用了 ALL( 『Order』 ) 而非 『Order』 ,這顯然是不對的,因為它改變了語義。

那麼進而想到另一種方式為:

OrderPurchaseNumber =
CALCULATE(
DISTINCTCOUNT( 'Order'[OrderID] ) ,

FILTER(
ALL( 'Order'[LinePrice] , 'Order'[LineProfit] ) ,
'Order'[LinePrice] > 1000 && 'Order'[LineProfit] > 0
)
)

這樣的方式僅僅使用需要用到的兩列,而非整個表,來看下效果:

性能得到了非常恐怖的提升。

但細心的夥伴會發現,這種寫法的努力方向是對的,但這種寫法還是錯誤的,因為:

FILTER(
ALL( 'Order'[LinePrice] , 'Order'[LineProfit] ) ,
'Order'[LinePrice] > 1000 && 'Order'[LineProfit] > 0
)

作為篩選器參數,會覆蓋外部的篩選,這也是不正確的邏輯,所以,需要進一步優化為:

OrderPurchaseNumber =
CALCULATE( DISTINCTCOUNT( 'Order'[OrderID] ) ,
KEEPFILTERS(
FILTER(
ALL( 'Order'[linePrice] , 'Order'[LineProfit] ) ,
'Order'[LinePrice] > 1000 && 'Order'[LineProfit] > 0
)
)
)

性能結果為:

完美。

總結

當需要在基礎度量值中使用篩選條件時,必須注意:

僅僅使用所必須的列,提升性能

使用 KEEPFILTERS 包裹,確保邏輯正確

這樣,基礎度量值就可以攜帶複雜的篩選器參數而不影響性能了。

精彩直播及視頻可以到B站二次元

本文內容【源文件+視頻講解】從屬於:年度訂閱會員,已發布請享用。

讓數據真正成為你的力量
加私信暗號:data2020

相關焦點

  • 海量挑戰:騰訊雲ES可用性及性能優化實踐
    在大規模海量應用場景下,騰訊雲Elasticsearch在高可用和性能方面做了哪些優化?在低成本解決方案中又有哪些獨到之處?本文是對騰訊雲專家工程師張彬老師在雲+社區沙龍online的分享整理,希望與大家一同交流。
  • Oppo百萬級高並發mongodb集群性能數十倍提升優化實踐
    2.軟體優化在不增加伺服器資源的情況下,首先做了如下軟體層面的優化,並取得了理想的數倍性能提升:業務層面優化Mongodb配置優化存儲引擎優化2.1 業務層面優化該集群總文檔近百億條,每條文檔記錄默認保存三天,業務隨機散列數據到三天後任意時間點隨機過期淘汰
  • etcd 的性能怎麼樣?需要優化嗎?
    從其他方面來看,etcd 所在宿主機的內核參數和 grpc api 層的延遲,也將影響 etcd 的性能。原來的實現方式是遍歷內部引 BTree 使用的內部鎖粒度比較粗,這個鎖很大程度上影響了 etcd 的性能,新的優化減少了這一部分的影響,降低了延遲;針對於lease 規模使用的優化:優化了 lease revoke 和過期失效的算法,將原來遍歷失效 list 時間複雜度從 O(n) 降為 O(logn),解決了 lease 規模化使用的問題;最後是針對於
  • Mysql innodb 存儲引擎的性能優化
    設計你的schema,索引和查詢,以及選擇正確的存儲引擎是常用的優化手段。1.2. 在有些情況下存儲引擎的選擇會影響到schema和索引1.3. 我們這裡不會覆蓋到一般的schema設計方法,但是會主要聚焦到Innodb存儲引擎。2. 每個存儲引擎都是不同的2.1. MySQl提供多種存儲引擎可供選擇2.2.
  • 特效優化2:效果與性能的博弈
    這些看似細小的知識點,很容易在大家的開發和學習過程中被疏忽,而長期的問題積累最終都會反映到項目的性能表現上。為此,我們將這些規則列出,並且以一個個知識點的形式向大家逐一解讀。我們將力圖以淺顯易懂的表達,讓職場萌新或優化萌新能夠深入理解。             本條規則面向的核心其實是項目開發中最常見的一對矛盾:效果與性能。為了實現更為複雜、更為絢麗的展示效果,研發團隊會添加各種粒子系統。在帶來效果提升的同時,也會產生非常明顯的性能消耗和渲染壓力。
  • Python 性能優化
    infoq上有一篇文章,提到禁用Python的GC機制後,Instagram性能提升了10%。感興趣的讀者可以去細讀。Be pythonic我們都知道 過早的優化是罪惡之源,一切優化都需要基於profile。
  • 系統架構性能優化思路
    資料庫性能調優拿Oracle資料庫來說,影響資料庫性能的因素包括:系統、資料庫、網絡。資料庫的優化包括:優化資料庫磁碟I/O、優化回滾段、優化Rrdo日誌、優化系統全局區、優化資料庫對象。>那麼一個業務系統應用功能出現問題了,我們當然也可以從動態層面來看實際一個應用請求從調用開始究竟經過了哪些代碼和硬體基礎設施,通過分段方法來定位和查詢問題。
  • PHP7革新與性能優化
    ,性能壓測結果,耗時從2.991下降到1.186,大幅度下降60%。於是,在benchmark(測試程序)中得到令人興奮的結果,實現JIT後性能比PHP5.5提升了8倍。然而,當他們把這個優化放入到實際的項目WordPress(一個開源博客項目)中,卻幾乎看不見性能的提升,得到了一個令人費解的測試結果。於是,他們使用Linux下的profile類型工具,對程序執行進行CPU耗時佔用分析。
  • Android性能優化總結
    這是來自一位粉絲「MeloDev」的投稿,講真,我這裡投稿的不少,但是只有我自己覺得很不錯的才會通過,這篇文章我覺得對大家有用,而且性能優化也算是我面試必問的一個話題了,所以這裡推薦給大家。程序執行效率:糟糕的代碼會嚴重影響程序的運行效率,UI線程過多的任務會阻塞應用的正常運行,長時間持有某個對象會導致潛在的內存洩露,頻繁的IO操作、網絡操作而不用緩存會嚴重影響程序的運行效率。一、布局複雜度的優化關於布局的優化,主要分兩個大方向1.
  • Android性能優化典範
    摘要:Google在Udacity上的《Android性能優化》在線課程詳細介紹了該如何優化性能,這些課程是Google之前在Youtube上發布的Android性能優化典範專題課程的細化與補充。本文是對渲染、運算、內存、電量四個篇章的學習筆記。
  • Vue SSR 性能優化實踐
    對於大型團隊來說,這裡基礎的優化可能已經習以為常。並且許多人為了榨乾機器性能,追求極致,已經有了各式各樣的成功探索。我們從中學習到了很多思路,但不管是多麼優秀的想法,多多少少也有著各自的局限性,適合他們的不一定適合我們。
  • golang性能優化及測試用例編寫
    在本文中,我們將講解如何編寫一個性能高效的golang函數。如何編寫測試用例編寫測試用例時,我們最主要用到golang的testing內置包。假設,我們想測試package main下的calc.go中的函數,只需新建calc_test.go文件,在calc_test.go中新建測試用例即可。
  • 性能優化之PHP優化
    在我們平常寫代碼的過程中,除了資料庫的優化,針對與文件的優化,我們還需要對PHP執行優化,當然對於老司機來說,這都是毛毛雨咯~但是畢竟有新手嘛,於是,我整理這麼一片文章。(未完待續...)性能優化之PHP優化(一):PHP結構1.字符串
  • React 函數式組件性能優化指南
    另外本文不詳細的介紹 API 的使用,後面也許會寫,其實想用好 hooks 還是蠻難的。面向讀者有過 React 函數式組件的實踐,並且對 hooks 有過實踐,對 useState、useCallback、useMemo API 至少看過文檔,如果你有過對類組件的性能優化經歷,那麼這篇文章會讓你有種熟悉的感覺。
  • Android性能優化:帶你全面實現內存優化
    今日限免課程:《Android性能優化詳解—內存篇》(滑動查看課程目錄)課程免費
  • 性能優化-一個命令發現性能問題
    為了取得程序的一丁點性能提升而大幅度增加技術的複雜性和晦澀性能,這個買賣做不得,這不僅僅是因為複雜的代碼容器滋生bug,也因為他會使日後的閱讀和維護工作要更加艱難。《Unix編程藝術》為什麼要性能優化也許是想要支持更高的吞吐量,想要更小的延遲,或者提高資源的利用率等,這些都是性能優化的目標之一。
  • 如何使用 JuiceFS 在雲上優化 Kylin 4.0 的存儲性能?
    Apache Kylin 4.0 採用 Spark 作為構建引擎以及 Parquet 作為存儲,讓雲上部署和伸縮變得更容易,然而使用雲上的對象存儲相較於使用本地磁碟的 HDFS,可能存在部分兼容性和性能問題。面對這樣的問題,今天為大家帶來 JuiceFS 的優化方案。
  • Spark性能優化指南——基礎篇
    因此,想要用好Spark,就必須對其進行合理的性能優化。Spark的性能調優實際上是由很多部分組成的,不是調節幾個參數就可以立竿見影提升作業性能的。我們需要根據不同的業務場景以及數據情況,對Spark作業進行綜合性的分析,然後進行多個方面的調節和優化,才能獲得最佳性能。
  • ...TurboTransformers,性能超越 PyTorch/TensorFlow 與主流優化引擎
    該工具面向自然語言處理領域中 Transformers 相關模型豐富的線上預測場景,據介紹,其在微信、騰訊雲、QQ 看點等產品的線上服務中已經廣泛應用,這也是騰訊對外開源的第 100 個項目。它來自於深度學習自然語言處理基礎平臺 TencentNLP Oteam,旨在搭建統一的深度學習 NLP (Natural Language Processing,自然語言處理)基礎平臺、提升研發效能。特性主要有三點: 優異的 CPU/GPU 性能表現。
  • SOLIDWORKS大型裝配體性能優化方法
    在一些做自動化設備的客戶,隨著需求的不斷提升,大型裝配體性能一致是客戶十分關注一個問題,很多客戶頭疼於大型裝體整線的裝配,試想一臺設備通常有5000+的零件,那麼把幾臺設備連線,總零部件數量已經達到幾萬個,這對電腦的性能是十分艱巨的考驗,我們知道SOLIDWORKS只支持單核單線程