在這個由四個部分組成的十大Power BI性能技巧第1部分中,小悅與大家分享並解釋了在Power BI開發過程中應結合的前5個性能提升的技巧。如果大家還沒有閱讀過它——Power BI性能提升的5大秘密武器,一定要去看看,特別是因為它突出了最重要的性能提示。現在,讓我們繼續分享接下來的5條性能秘訣,這些秘訣應用應該被合並到一起,以進一步提高我們的Power BI解決方案的性能。本文將和大家繼續重點分享Power BI性能介紹和最佳實踐的十大秘訣。
秘訣五 問題計算列
當我們需要在模型中已有的數據之外創建某種形式的計算時,我們可以選擇使用“計算列”或“度量值”。在Power BI解決方案中,大家是否有發現計算列與度量比較中被高度使用,因為它們似乎是通過DAX公式構造計算時的首選選項。從所有的討論中,很多時候這只是歸結為計算列在模型中的物理存在,並且由於“計算列”感覺更類似於Excel。尤其是當我們對使用excel方面很在行的時候。
1 什么是計算列?
計算列在刷新時進行處理,並存儲在數據庫中。因此,如果轉到“數據”選項卡,你將看到物理列添加到模型中的現有表中。由於計算列是物理存儲在數據庫中的,這意味着它們消耗磁盤,更重要的是消耗寶貴的內存,我們應該始終有效地保存和使用這些內存。此外,計算列對“行上下文”進行操作,“行上下文”是一種求值上下文,它在迭代機制上工作,迭代機制從放置計算列的表的第一行開始,對每一行的表達式求值,直到它到達最后一行。
2 什么是衡量標准?
在交互點處理度量值,因此當“度量值”添加到Power BI畫布上的可視對象時。這意味着它沒有存儲在數據庫中,因此不會像“計算列”那樣消耗內存。但是,由於度量是在交互點處理的,因此它們將消耗CPU。此外,度量使用另一種類型的計算上下文,即“篩選上下文”。這種類型的求值上下文是指應用於基礎模型中的表的篩選,該篩選實際上會影響度量的結果。我們提到了計算列和度量值的不同類型的計算上下文。為了更好地理解DAX的編寫和度量與計算列的行為,理解計算上下文的概念是非常重要的。
我們應該對度量值使用“計算列”提出質疑的原因是兩個因素的結合。
首先,當需要向模型添加額外數據時,“計算列”幾乎是默認選擇。其次,計算列由於物理存儲在數據庫中而消耗內存。因此,我們最終得到的是Power BI解決方案,該解決方案具有數十或數百個計算列,這些列消耗內存。這是質疑是否應使用計算列的核心原因。我們可以改用度量嗎?這樣做將減少內存消耗,提高刷新時間,並可以將Power BI解決方案發布到以前超過1GB限制(Pro許可)的服務。
秘訣六 禁用自動日期/時間
你可能不知道,但是對於Power Query中或派生並加載到Power BI模型的每個日期列,都會在后台自動生成日期表。現在,很多人不知道這一點是可以理解的,畢竟這些表在Power BI Desktop中是不可見的。生成這些自動生成的日期表的原因是為了支持報表中的時間智能功能,並提供聚合、篩選和鑽取日期屬性年、季、月和日的功能。
通過Power BI生成這些表時,將在自動生成的表中的日期列與模型中的初始表中的日期列之間建立關系。但是,在Power BI Desktop中同樣看不到這些。此外,由於保存了最小和最大日期之間的所有可能的日期值,因此這些日期表可以保存大量記錄。例如,在上表中,我們有'DateOfEvolution'列,其中保存着最小日期25/01/1996和最大日期02/05/2018,這意味着我們將有8,133行,它們都是最小和最大之間的日期。所有這些表都消耗內存,因此我們應該考慮禁用此功能。為了識別這些表,我們可以使用VertiPaq Analyzer或DAX Studio。通過使用Dax Studio建立與Power BI模型的連接,我們將看到具有“LocalDateTable”前綴的自動生成的表:

想象一下,有一個非常大的模型,並且模型中的每個表都由數據列組成,每個數據列的最小日期和最大日期之間的范圍很廣。這將增加內存消耗。過去禁用此功能非常令人沮喪,因為每個啟動的Power BI Desktop都需要完成此功能。但是,自2019年5月以來(小悅認為),已將禁用自動生成的日期表添加到了全局設置中,這意味着一旦禁用,它將應用於未來推出的任何Power BI解決方案。要禁用此功能,請在Power BI Desktop中單擊“文件”,依次選擇“選項和設置”,“選項”,然后在“全局設置”下選擇“數據加載”,然后取消選擇“自動日期/時間”選項,如下圖所示:

秘訣七 禁用后台數據預覽下載
當我們使用Power Query時,前1000行存儲在內存中,這將顯示數據的預覽。當使用由Power Query中的多個查詢組成的大型模型時,這可能會引起一些性能問題。過去,在研究一個具有多個查詢的Power BI解決方案中,當觸發完整的模型刷新時,該查詢在所有查詢中始終落后於“評估”狀態。由於沒有任何查詢移動到“加載查詢”狀態,因此處於無響應狀態,這導致強制Power BI桌面關閉。這是當我們開始嘗試使用選項“允許后台預覽數據在后台下載”時,該選項一經禁用,就大大提高了性能,因為以前停留在“評估”狀態的所有查詢都開始成功加載,並且沒有完全刷新的延遲。據了解,發生這種情況的原因是由於完整的模型刷新不僅觸發了查詢加載,而且還觸發了數據預覽在后台加載,因此消耗了更多資源。為了防止下載這些預覽,我們可以直接在Power BI Desktop中取消選擇“允許數據預覽在后台下載”功能,方法是單擊“文件”,“選項和設置”,“選項和當前文件”,如下圖所示:

秘訣八 整數前的字符串
通過選擇所需的數據連接器和連接類型將數據吸收到Power BI中之后,你可以選擇使用Power Query應用轉換並將數據成形為所需格式。下一步是處理數據,因此將數據加載到Power Pivot,Power Pivot是一個內存中的列數據庫,用於存儲模型和壓縮引擎VertiPaq的工作。VertiPaq引擎(也稱為xVelocity)執行三種壓縮類型以減少總體內存消耗:值編碼,字典(Hash)編碼和行級編碼(RLE)。下面將重點介紹其中的兩個(值編碼、字典編碼),因為它們是理解為什么我們應該在Power BI中針對字符串使用整數的關鍵。
1 編值碼
這就是通過VertiPaq引擎在內存中減少列的方法,該引擎標識列中的最小值,並用該最小值減去所有其他值。例如,在下圖中,我們可以看到列“Units”欄中的最小值是20,因此第一行25個單位將變成5個單位(25-20),第二行50個單位將變成30個單位(50-30),第三行40個單位將變成20個單位(40-20)等等。因此,它正在減少位數,即消耗的位數。在查詢期間,為了檢索正確的單位數,VertiPaq引擎只需將最小值加回到最初減去的數量上。一個很重要的說明,很明顯,就是“值編碼”僅適用於整數值。要記住這一點很重要。

2 字典編碼
這是通過VertiPaq Engine創建包含兩個列的數據字典表來減少內存中具有字符串值的列的方式:
-
一個獨特的ID列,用於唯一地標識每個字符串值
-
包含字符串值的列
創建數據字典表后,會將數據字典中與眾不同的ID引用到原始列中的值。如果你曾經使用VertiPaq Analyser來優化你的解決方案,那么你將看到一個叫做“字典大小”的東西,它就是這樣的。一個重要的注意事項是理解列中的基數越高,數據字典中的內存消耗就越大。

因此,在這里強調了上面的內容之后,我們應該旨在在字符串值上使用整數,因為我們將推廣值編碼,這不會創建消耗更多空間的數據字典表。
秘訣九 使用查詢縮減功能(切片器,過濾器和交叉突出顯示)
借助所有先前的性能技巧,它們更多地基於將Import作為連接類型使用,因此基於內存模式,而此性能技巧將更多地關注Direct Query。如果你使用的是Direct Query,並且已盡可能地優化了基礎數據庫,但仍需要額外的性能,則值得嘗試一下。通過Direct Query,可以在報表使用者與報表進行交互時生成查詢,並將查詢發送到數據庫,方法是在切片器中選擇一個值,在柱形圖中選擇條形圖之一,使用過濾器或其他方法。這會造成瓶頸,尤其是當你有大量用戶與Power BI報表進行交互時。這就是“查詢縮減”發揮作用的時候,因為它提供了將“切片器”和“過濾器”中的各種選擇組合為單個查詢的功能,而不是為每個選擇生成單個查詢的功能。例如,如果我們從“區域切片器”中選擇值“東”,則立即將單個查詢發送到數據庫,而一旦選擇值“北”,則將第二個查詢發送到數據庫。

通過減少查詢,只有通過選擇“應用”按鈕確認查詢后,查詢才會發送到基礎數據庫,如下所示:

要對切片器(或過濾器)應用查詢減少,請在Power BI Desktop中選擇“文件”,“選項和設置”,“選項”,“查詢縮減”,然后啟用“向每個切片器添加應用按鈕以在讀取時應用更改”,如下所示:下面說明:

減少查詢功能不僅限於切片器和過濾器,還可以選擇“默認情況下禁用交叉突出顯示/過濾”框。這樣可以防止屏幕上的視覺效果充當其他視覺效果的過濾器,同樣,從視覺效果中選擇元素會自動過濾其他視覺效果,因此會生成對數據庫的基礎查詢。如果不需要,請繼續將其關閉,或者至少減少默認情況下啟用的交叉突出顯示/過濾的數量。
秘訣十 在DAX中使用變量
在編寫DAX時,我們應該始終使用變量而不是度量本身,因為它們提高了可讀性和調試過程,降低了DAX的復雜性,並具有通過停止運行來提高性能的能力。多次重新計算的結果。因此,通過將計算定義為變量的一部分,一旦計算發生,結果就會存儲在變量中。
TY vs PY Var%=
除法(
[ TY銷售] - 計算([ TY銷售] ,SAMEPERIODLASTYEAR (“零售2” [ 日期] )),
計算([ TY銷售] ,SAMEPERIODLASTYEAR ('零售2' [ 日期] ))
)
上面的公式是一種非常常見的方法,我們可以找到在實際值和目標值之間計算出的“差異百分比”,在這種情況下,這是當前的年度銷售額與上一年度的銷售額。從上面的公式可以看到,計算上一年度銷售額的度量重復了兩次,因此需要重新計算。使用迭代器函數時,效率可能會更高,但是無論如何在這種情況下,我們都可以將前年度銷售額添加到一個變量中,該變量可以返回期望的結果,但所需的時間更少。
TY vs PY Var%=
VAR PreviousYearSales =
計算([ TY銷售] ,SAMEPERIODLASTYEAR ('零售2' [ 日期] ))
返回
除法([ TY銷售] -PreviousYearSales ,PreviousYearSales )
這就是十大Power BI性能提升的秘密武器。小悅希望大家發現這些有用的東西,並開始在你的Power BI開發過程中使用它們,因為它們肯定會產生對Power BI一些問題的答案,為你的組織和報告消費者提供更高質量的體驗。
此外,小悅建議大家開始使用VertiPaq Analyzer了解底層解決方案中模型的實際內存消耗,並使用DAX Studio了解DAX公式的性能。請繼續關注第3部分,在這里我們將開始探索前10個Power BI最佳實踐技巧。

推薦閱讀
1.Power BI免費下載:http://www.yeacer.com/
Microsoft Power BI Desktop中文最新版:下載地址
2.歡迎加入的Power BI技術群,目前正在學習階段,有興趣的朋友可以一起學習討論。
Power Data技術交流群:702966126 (驗證注明:博客園Power BI)
更多精彩內容請關注微信公眾號:悅策PowerBI
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!歡迎各位轉載,作者博客:https://www.cnblogs.com/yeacer/
