使用變數改善效能和進行疑難排解

已完成

您可在 DAX 公式中使用變數以協助撰寫較不複雜且更有效率的計算。 剛開始使用 Power BI Desktop 的開發人員並未充分利用變數,但變數十分有效,且在建立量值時應根據預設加以使用。

某些運算式涉及使用多個巢狀函式,以及重複使用運算式邏輯。 這些運算式需要較長的處理時間,且難以閱讀,因此也不容易進行疑難排解。 如果使用變數即可節省查詢處理的時間。 這項變更對於將資料模型的效能最佳化而言,是邁向正確方向的一步。

在資料模型中使用變數會提供下列優點:

  • 改善的效能 - 因為變數不需要 Power BI 多次評估相同的運算式,所以可讓量值更有效率。 只需大約的一半原始處理時間,即可在查詢中獲得相同的結果。

  • 改善的可讀性 - 變數具有自我描述的簡短名稱,並可用來取代不明確且多措辭的運算式。 使用變數時,您可能會發現能更輕鬆閱讀及了解公式。

  • 簡化的偵錯 - 您可使用變數來對公式進行偵錯並測試運算式,這在進行疑難排解時相當實用。

  • 降低複雜度 - 變數不需要使用較舊或最舊的 DAX 函式,這些函式十分不容易了解。 在引進變數之前,這些函式是必要的,且是以引入新篩選內容的複雜運算式來撰寫。 現在您可使用變數來取代這些函式,因此需要撰寫的複雜公式會變得較少。

使用變數來改善效能

為了說明如何使用變數讓量值更具效率,下表以兩種不同的方式來顯示量值定義。 請注意,公式會重複使用計算「去年相同期間」的運算式,但會用兩種不同的方式:第一個執行個體使用一般 DAX 計算方法,第二個則使用計算中的變數。

資料表第二個資料列顯示改善的量值定義。 此定義使用 VAR 關鍵字來引進名為 SalesPriorYear 的變數,並使用運算式將「去年相同期間」的結果指派給新變數。 然後,其會在 RETURN 運算式中使用兩次變數。

不使用變數

Sales YoY Growth =
DIVIDE (
    ( [Sales] - CALCULATE ( [Sales], PARALLELPERIOD ( 'Date'[Date], -12, MONTH ) ) ),
    CALCULATE ( [Sales], PARALLELPERIOD ( 'Date'[Date], -12, MONTH ) )
)

使用變數

Sales YoY Growth =
VAR SalesPriorYear =
    CALCULATE ( [Sales], PARALLELPERIOD ( 'Date'[Date], -12, MONTH ) )
VAR SalesVariance =
    DIVIDE ( ( [Sales] - SalesPriorYear ), SalesPriorYear )
RETURN
    SalesVariance

因為資料表第一個量值定義中的公式需要 Power BI 評估相同運算式兩次,所以效率不佳。 因為變數的緣故,Power BI 只需要評估 PARALLELPERIOD 運算式一次,所以第二個定義更有效率。

如果資料模型具有多個查詢,而這些查詢具有多個量值,則使用變數可讓整體查詢處理時間減少一半,並改善資料模型的整體效能。 此外,這個解決方案算是比較簡單的;請想像一下公式變得更複雜時可獲得的節省量,例如在處理百分比和總計時。

使用變數來改善可讀性

您可能會注意到使用變數除了能改善效能外,還能讓程式碼更易於閱讀。

使用變數時,最佳做法是為變數使用描述性名稱。 上述範例中的變數稱為 SalesPriorYear,其清楚指出此變數正在計算什麼。 請思考使用稱為 Xtempvariable1 的變數會有什麼結果;這些變數的用途完全無法明顯看出。

使用清楚簡潔且具有意義的名稱,將可更輕鬆了解正在嘗試計算的內容,而其他開發人員未來也可更輕鬆地維護報表。

使用變數對多個步驟進行疑難排解

您可使用變數來協助對公式進行偵錯,並找出問題所在。 變數可分別評估每個變數,並在 RETURN 運算式之後重新加以叫用,以簡化對 DAX 計算進行疑難排解的工作。

在下列範例中,您將測試指派給變數的運算式。 為了進行偵錯,您將暫時重寫 RETURN 運算式以寫入變數。 量值定義只會傳回 SalesPriorYear 變數,因為這是 RETURN 運算式之後的值。

Sales YoY Growth % =
VAR SalesPriorYear =  CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
VAR SalesPriorYear% = DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)  
RETURN  SalesPriorYear%

RETURN 運算式將只會顯示 SalesPriorYear 值。 此技術可供在完成偵錯時將運算式還原。 因為 DAX 程式碼複雜性降低的緣故,其也可讓計算變得更加易懂。