設計可擴展的計算

已完成

你的模型是結構化的。 現在,請設計計算,以便隨著資料與團隊成長,仍能維持效能與可維護性。 在小尺度下,即使模型有重複度量且命名不一致,仍然可行,即使不是最理想的。 當規模增大時,它會失效。 擁有數百項度量的模型需要結構性設計決策,以防止邏輯重複、縮短大型資料集的查詢時間,並讓新團隊成員能理解並擴展模型而不引入錯誤。

本單元涵蓋三種模式:用於降低度量值頻繁出現的計算群組、增強團隊維護性的DAX讀寫規範,以及提升大型事實表查詢效能的彙整。

計算群組

計算群組是將相同計算模式應用於多個度量的模型物件。 你不是為每個變化分別建立不同的度量,而是先定義一次模式,然後動態套用。

計算群所解決的問題

以一個組織為例,擁有50項基準指標(例如總銷售額、總成本、利潤和銷售單位)。 每個指標需要計算年度至今、季度至今及月至今。 在沒有計算群組的情況下,那就是 50 × 3 = 150 個額外的計量。 加上前一年的比較,您就有超過250個指標需要維持。

使用計算群組,您可以為每種時間智慧模式創建具有計算項目的群組。 這些項目會自動套用到模型中的任何測度。

計算群的運作方式

計算群組包含計算項目,每個項目定義一個DAX表達式,使用SELECTEDMEASURE()來修改當前測度。 這裡有一個時間智能計算群組:

// Year-to-Date
CALCULATE(
    SELECTEDMEASURE(),
    DATESYTD('Date'[Date])
)
// Quarter-to-Date
CALCULATE(
    SELECTEDMEASURE(),
    DATESQTD('Date'[Date])
)
// Month-to-Date
CALCULATE(
    SELECTEDMEASURE(),
    DATESMTD('Date'[Date])
)

當使用者將計算群組新增至視覺效果時,他們可以針對任何量值 (例如總銷售額、利潤或售出單位) 在 YTD、QTD 和 MTD 之間切換,而不需要為每個組合建立個別量值。

動態格式字串

動態格式字串會根據計算項目的上下文改變顯示格式。 例如,百分比計算應以百分比顯示,而貨幣計算則應顯示為貨幣,即使應用於相同的基準指標。

// In the format string expression for a YoY % calculation item:
"0.0%"

動態格式字串減少了對獨立格式化度量的需求,並保持模型間格式一致。

提示

了解更多在 Power BI 中如何建立計算群組。

何時使用計算群組

當你有三個或以上需要套用相同計算模式的指標時,可以使用計算群組。 常見使用案例包括時間智慧 (YTD、QTD、MTD)、貨幣轉換,以及差異計算 (實際值與預算)。

DAX 可讀性準則

在大型團隊維護超過200項指標之時,可讀性應被視為設計決策,而非個人偏好。 一致且易讀的 DAX 減少維護錯誤,並讓新團隊成員更容易理解模型。

變數

變數儲存中間結果,提升可讀性,並防止引擎重複評估相同表達式:

Profit Margin =
VAR TotalRevenue = SUM(Sales[Revenue])
VAR TotalCost = SUM(Sales[Cost])
VAR ProfitAmount = TotalRevenue - TotalCost
RETURN
    DIVIDE(ProfitAmount, TotalRevenue)

若無變數,同一 SUM(Sales[Revenue]) 表達式在複數小節中可能出現三次。 變數會評估一次表達式並重複使用結果。

提示

了解更多 關於利用變數來改進 DAX 公式的方法。

命名慣例

當你的模型有數百項指標由多人維護時,命名一致至關重要。 建立以下慣例:

  • 衡量指標名稱:使用清晰且具描述性的名稱,如「總銷售」或「年收入成長」。避免使用只有原作者能理解的縮寫。
  • 變數名稱:使用描述性名稱來解釋中間值(例如 TotalRevenue 而非 x 或 temp)。
  • 計算群組項目:依據項目的用途命名,而不是依據其運作方式命名 (例如使用「Year-to-Date」,而不是「DATESYTD Wrapper」)。

描述性命名對 AI 使用也很重要。 當 Copilot 或資料代理查詢你的模型時,會使用度量名稱和描述來決定要包含哪些計算。 一項名為「年收入成長」的指標,產生的 AI 成果優於「Calc7_v2」。

提示

Power BI 中的 Copilot 可以幫助撰寫和解釋 DAX 公式。 當你在處理複雜度量時,使用 Copilot 提出改進建議或解釋現有邏輯。

迭代器與聚合函數的比較

迭代函數(SUMX, AVERAGEX, MAXX)會逐列評估一個資料表上的表達式。 聚合函數(SUM, AVERAGE, MAX)則作用於單一欄位。 在大量資料中,選擇非常重要:

  • 當你要總結單一欄位時,請使用彙總功能。 它們比較快,因為引擎可以使用預先建構的資料結構。
  • 當計算需要列層級表達式(例如 Quantity × UnitPrice 每列)時,使用迭代器。

備註

迭代器會處理每一列,這會影響大型事實表的效能。

防禦陣型的資訊函數

資訊功能如 ISBLANK、HASONEVALUE 和 ISINSCOPE ,為多個具有不同過濾情境的報告所消耗的指標建立防禦模式。

Sales per Customer =
IF(
    HASONEVALUE(Customer[CustomerID]),
    DIVIDE(SUM(Sales[Amount]), 1),
    DIVIDE(SUM(Sales[Amount]), DISTINCTCOUNT(Sales[CustomerID]))
)

這些模式防止了在原作者未預料的情境中使用測量時出現意外結果。

Aggregations

彙總是匯總表,會以比詳細資料較粗的粒度儲存預先計算的總計。 查詢會先對這些資料表進行,這能提升大型事實表的效能。 當查詢匹配到彙整時,引擎會從較小的摘要表回傳結果,而非掃描數百萬個細節列。

聚合作為設計決策的一環

決定何時新增彙總,以及使用何種粒度,是一項設計決策。 效能監控與調校是分開的營運考量,但結構性選擇則是在模型設計時做出。

請在下列情況考慮使用彙總:

  • 事實表超過數百萬列,常用查詢會以更高顆粒度(例如按區域劃分的月度總量)來彙整資料。
  • 使用者在摘要層級視覺化時會遇到查詢回應時間較慢的情況。
  • 大多數報告互動不需要行級詳細資訊。

聚合行為因儲存模式而異

在匯入模式下,聚合會以獨立的隱藏資料表形式儲存。 引擎會自動將匹配的查詢導向聚合表。

在直接湖模式下,Delta 表格本身可作為聚合來源。 由於 Direct Lake 讀取欄位式 Parquet 檔案,該引擎在許多情境下能處理較大的資料量且不需聚合。 只有當查詢模式確認需要時才加入聚合。

提示

了解更多關於Power BI 中使用者定義聚合的資訊。