共用方式為


使用經常性和非經常性數據表數據分割來優化非常大的Power BI數據模型

本文說明如何使用經常性和非經常性數據表分割區來優化非常大的數據模型。 數據分割提供將數據表的數據分割成離散子集的方法。 分割區 不會 直接暴露在標準的 Power BI 資料建模工具中,但你可以透過在 Power BI Desktop 中設定增量刷新政策來利用進階分割方法。 增量刷新依賴分割區,如增量刷新與資料集的即時資料中所述。 不過,設定經常性和非經常性數據表分割超出累加式重新整理原則可以完成的工作,並假設熟悉一般數據表分割配置和 XMLA 型工具。

先決條件

由於此數據分割技術的相對複雜度,因此最適合具有下列領域經驗的進階使用者:

  1. 了解資料表分割的概念、匯入模式分割、 DirectQuery 模式與 雙模式 的運作方式。

  2. 瞭解如何使用 XMLA 型工具建立混合式數據表。 混合資料表使用一個或多個匯入模式分割區與一個 DirectQuery 分割區。

  3. 了解 DAX 函式的需求,您可以使用來指定 DataCoverageDefinition。 這是 DirectQuery 分割區的新特性,用以描述混合資料表的 DirectQuery 分割區包含哪些資料,讓 Power BI 引擎能在適當時排除該分割區進行查詢處理。 排除 DirectQuery 分割有助於避免不必要的資料來源查詢,並提升 DAX 查詢處理的效能。

  4. 瞭解一般和有限數據表關聯性之間的差異。 例如,如果您想要根據相關日期維度數據表的值定義事實數據表數據分割的數據涵蓋範圍,RELATED 函式會很有用。 請記住,事實資料表的分區是 DirectQuery 分區,且可能會與日期表有有限的關聯,因此 RELATED 函數無法取得該數值。 在此案例中,RELATED 只有在日期維度數據表是雙重數據表時才能運作。 日期表必須是 DirectQueryDual 模式。 它不能完全匯入。

請注意,錯誤定義 DataCoverageDefinition 可能導致錯誤結果,因為 Power BI 可能會錯誤地排除 DirectQuery 分割區進行查詢處理。 務必確保比較有和沒有DataCoverageDefinition的結果,以確認它們是否相符。

何時使用經常性和非經常性數據表分割區

以下是經常性分割和冷分割區可協助微調混合式數據表以進行歷史分析的範例。 假設您擁有非常龐大的數據源,而且已累積多年。 主要用途是分析過去幾年的最新數據。 有時候,您也會想要分析較舊的數據。 也許你注意到最近銷售額逐年大幅增長。 這曾經發生過嗎? 這是銷售追蹤開始以來的最高銷售尖峰嗎?

若不支持經常性分割和冷分割區,這種歷史分析會要求您將所有歷史數據以及較新的數據匯入事實數據表。 這充其量是資源使用效率不佳,因為主要分析甚至不會使用任何較舊的歷程記錄數據。 最糟的是,數據量太大,甚至無法完全匯入。 你必須將資料模型切換到 DirectQuery 模式,並接受相較於匯入模式的效能損失,或者你可以建立獨立模型,強制使用者在報告間切換。 具有經常性和非經常性分割的混合式數據表可讓您選擇更好的選項。

如何使用經常性和非經常性數據表分割區

首先,將銷售表設定為 匯入模式分割區,以存放最新資料,並將舊資料保留在 冷的DirectQuery 分割區中,如下圖所示 AdventureWorks 範例資料模型的 FactInternetSales 資料表。 任何 OrderDateKey 大於或等於 20200101 的列,會透過熱匯入模式分割導入資料模型。 OrderDateKey 小於 20200101 的列會被冷的 DirectQuery 分割覆蓋。 現在,Power BI 可以透過匯入模式快速提供主要使用案例,你也不需要匯入大量只偶爾分析的歷史資料,因為 DirectQuery 分割區已經涵蓋了這部分。

Adventure Works 範例資料模型的 Fact Internet Sales 表格截圖。該表格已打開並顯示篩選的列。

如果你有 AdventureWorks 的範例資料倉庫 並想跟著做,以下是一般步驟:

  1. 建立資料集。 使用 Power BI Desktop 建立 AdventureWorks 數據集和報表。 將所有資料表納入純 DirectQuery 模式。 接著,將所有表格轉成雙模式,除了FactInternetSales表格以外。 保持 FactInternetSales 表格在 DirectQuery 模式。

  2. 上傳資料集。 使用 Power BI Premium 上裝載的工作區,並啟用 XMLA 端點以進行寫入作業。

  3. 更新相容性等級。 在 SQL Server Management Studio 中,使用 AdventureWorks 數據集開啟工作區(SSMS)。 右鍵點選 AdventureWorks 資料集>腳本>腳本資料庫,選「建立」或「替換到」,然後選擇「新查詢編輯器」視窗。 將 compatibilityLevel 屬性設定為 1603 (或更高版本)。 選擇 執行 或按 F5。 確認作業順利完成。

    腳本截圖,相容性設定為 1603。

  4. 設定 FactInternetSales 表格的分區。 右鍵點選 AdventureWorks 資料集>腳本>腳本資料庫,選「建立」或「替換到」,然後選擇「新查詢編輯器」視窗。 將整個分割區區段取代為下列區段。 務必更新 Sql.Database 行,指向你環境中的 AdventureWorksDW 資料庫。 選擇 執行 或按 F5。 確認作業順利完成。

       "partitions": [ 
        { 
          "name": "FactInternetSales-DQ-Partition", 
          "mode": "directQuery", 
          "dataView": "full", 
          "source": { 
            "type": "m", 
            "expression": [ 
              "let", 
              "    Source = Sql.Database(\"demo.database.windows.net\", \"AdventureWorksDW\"),", 
              "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],", 
              "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] < 20200101)", 
              "in", 
              "    #\"Filtered Rows\"" 
            ] 
          } 
        }, 
        { 
          "name": "FactInternetSales-Import-Partition", 
          "mode": "import", 
          "source": { 
            "type": "m", 
            "expression": [ 
              "let", 
              "    Source = Sql.Database(\"demo.database.windows.net\", \"AdventureWorksDW\"),", 
              "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],", 
              "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] >= 20200101)", 
              "in", 
              "    #\"Filtered Rows\"" 
            ] 
          } 
        } 
      ],    
    
  5. 處理資料模型。 在 Power BI 入口網站中,打開包含 AdventureWorks 資料集的工作區,然後執行按需刷新以載入匯入分區的資料。

  6. 請確認報告是否顯示近期及歷史資料。 打開你的 AdventureWorks ,確認報告能顯示 2020 年 1 月 1 日前後銷售交易的結果,如以下截圖所示。

兩份不同報告的截圖。一個顯示2020年的數據,另一個顯示2019年的數據。

定義 DirectQuery 分割區的資料覆蓋範圍

此解決方案可順暢地在最近和歷程記錄的數據上運作。 不過,根據預設,Power BI 會查詢所有數據表分割區,因為它不知道每個分割區涵蓋的數據。 因此,即使 DirectQuery 分割區未涵蓋的年份,Power BI 仍會查詢 DirectQuery 分割區。 匯入數據分割中隨時提供銷售數據,且 DirectQuery 分割區不會提供任何數據列,但此多餘的來源查詢仍會導致數據源的明顯負載,並導致 DAX 查詢處理延遲。 為避免不必要的來源查詢,請使用 DataCoverageDefinition.

如下圖所示,Power BI 報告仍會針對 2020 年向資料來源發送多個不必要的 SQL 查詢,因為每個視覺化的 DAX 查詢會促使 Power BI 查詢 DirectQuery 分割區。

DAX 查詢截圖。

透過在 dataCoverageDefinition 分割區設定 屬性,如以下 TMSL 摘要所示,可避免這些 SQL 查詢。 不過,請記住,套用或變更數據涵蓋範圍定義之後,您必須重新整理數據集。 進程重新計算足以評估數據涵蓋範圍定義。 如果您忘記此步驟,觸控數據分割的查詢會失敗,並出現錯誤訊息,指出數據表 『[數據表名稱]『 中 DQ 數據分割的 DataCoverageDefinition 尚未在最近的變更之後計算。 它必須重新處理」 。

        { 
          "name": "FactInternetSales-DQ-Partition", 
          "mode": "directQuery", 
          "dataView": "full", 
          "source": { 
            "type": "m", 
            "expression": [ 
              "let", 
              "    Source = Sql.Database(\"demopm.database.windows.net\", \"AdventureWorksDW2020\"),", 
              "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],", 
              "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] < 20200101)", 
              "in", 
              "    #\"Filtered Rows\"" 
            ] 
          },  
"dataCoverageDefinition": {  
                  "description": "DQ partition with all sales from 2017, 2018, and 2019.",  
                  "expression": "RELATED('DimDate'[CalendarYear]) IN {2017,2018,2019}"  
                }  
        } 

如前所述,此 dataCoverageDefinition 特性有助於消除不必要的資料來源負擔。 它也會改善最近數據的分析效能,因為現在 Power BI 可以適當地從 DAX 查詢處理中排除 DirectQuery 數據分割。 您可以針對單一值以及具有簡單 AND、OR 和 NOT 運算子的範圍定義簡單的資料涵蓋範圍表示式。 您也可以使用 RELATED 函數,根據維度數據表中的數據行定義數據涵蓋範圍,該數據涵蓋範圍與事實數據表有一般關聯性。 如果資料覆蓋表達式使用維度表中的欄位,請確保維度表處於 雙重 模式。 您也可以根據事實數據表本身的數據行來定義資料涵蓋範圍。 如需支持的作業,請參閱下表,分類為三個群組。 

類型 評論 例子
單一述詞 (以值為基礎) 相等、不相等和 IN 運算子
同時支援維度和事實數據表
RELATED('Date'[Year]) = 2020
NOT RELATED('Date'[Year]) = 2020
RELATED('Date'[Year]) IN {2020, 2021, 2022}
InternetSales'[SalesAmt] = CURRENCY(100.0)
NOT InternetSales'[SalesAmt] = CURRENCY(100.0)
InternetSales'[SalesAmt] IN {CURRENCY(100.0), CURRENCY(200.0)}
單一述詞 (範圍型) 可以是比較算子,如 >、 <、 >=、 <=
要求維度數據表處於雙重模式
相關(日期年份)2020 >
相關(日期[年份]) <= 2020
多個述詞 相等、不相等和比較
不支援 IN 運算子
限制為雙模式中的單一維度數據表
相關(日期」年份)2010 > & 相關(日期年份)2020 >
RELATED(「日期」[年份])= 2020 & RELATED(「日期」[曆季])= 1
相關(日期」[年份]) > 2020 & 非相關(「日期」[曆季]) = 1
相關⦅「日期」[年份]⦆ 2020 && 相關⦅「日期」[曆季]⦆ 3
RELATED('日期'[年份]) 2020 && (RELATED('日期'[曆季]) = 1 || RELATED('日期'[曆季]) = 2)

DataCoverageDefinition DirectQuery 分割區的特性,讓你能優化即使是最大的 Power BI 資料模型,基於匯入模式的熱分割區和 DirectQuery 模式下的冷分割區,避免不必要的資料來源查詢。 此來源查詢縮減有助於在分析經常性數據時提升報表效能。 它也有助於降低數據源的負載,如此一來,有助於將數據源的規模最大化。 然而,請記住,利用該 dataCoverageDefinition 屬性來優化資料模型仍屬進階情境。 請確定您仔細確認結果。

考慮和限制

  • 目前,DataCoverageDefinitionDirectQuery 分割區的屬性要求靜態值,例如 RELATED('Date'[Year]) = 2020 或 RELATED('Date'[Year]) IN {2020, 2021, 2022}。 不支持動態指派,例如 RELATED('Date'[DateKey]) = TODAY()。

  • 即時資料的增量更新並未使用此屬性 DataCoverageDefinition 。 如果您將數據涵蓋範圍定義套用至 DirectQuery (即時) 分割區,累加式重新整理會在重新建立分割區時卸載數據涵蓋範圍定義。