共用方式為


表格式模型中的數據分割

適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

分割區會分割您需要經常處理(重新整理)的數據部分,而數據可以較不常處理。 例如,事實數據表可能包含某些數據列集,其中包含很少變更的數據,但其他數據列集通常會有變更的數據。 只需要處理部分數據時,就不需要處理 所有 數據。

分割區的運作方式是將數據表分割成邏輯數據分割物件。 個別分割區,每個數據區段都包含唯一的數據區段,然後可以循序或平行處理,與其他分割區無關,或完全排除在處理作業之外。

粒度

根據預設,模型中的每個數據表都有單一分割區。 在許多情況下,例如事實數據表,將數據表的單一分割區分割成多個分割區,可以更好地利用可用的資源進行處理。

有效的模型設計和處理策略會利用數據分割來消除不必要的處理器負載和記憶體耗用量,同時確保數據經常重新整理足以反映數據源的最新數據。 例如,表格式模型可以有 Sales 數據表,其中包含目前會計年度和前一個會計年度的銷售數據。 模型的 Sales 數據表具有下列資料分割:

分區 數據的來源
Sales2020 目前的會計年度
Sales2019-2010 會計年度 2010、2011、2012、2013、2014、2015。 2016, 2017, 2018, 2019
SalesOld 過去十年前的所有會計年度。

隨著目前 2020 會計年度的新銷售數據新增,該數據必須每天處理,才能在目前的會計年度銷售數據分析中正確反映,因此每晚都會處理 Sales2020 數據分割。

不需要每晚處理 Sales2019-2010 分割區中的數據。 不過,由於前十個會計年度的銷售數據仍會因為產品回報和其他調整而變更,因此仍必須定期處理,因此每月會處理 Sales2019-2010 數據分割中的數據。 SalesOld 分割區中的數據很少變更,因此只會每年處理一次。

輸入 2021 會計年度時,會將新的 Sales2021 分割區新增至模型的 Sales 數據表。 然後,Sales2020 分割區可以與 Sales2019-2010 分割區合併,並重新命名為 Sales2020-2011。 2010 會計年度的數據會從 Sales2020-2011 數據分割中移除,並移至 SalesOld 數據分割。 接著會處理所有分割區以反映變更。 這通常稱為 滾動視窗 模式 - 每個分割區中的數據都位於預先定義的日期範圍內,並視需要遞增,讓記憶體和處理資源在一段時間的可預測範圍內使用。

數據粒度受到各種因素的影響,包括需要多少數據,才能在可接受的時間內累加處理。 例如,如果只需要每天處理最後一整天,則使用每日數據粒度可能很有説明。 混合數據粒度可以針對類似低粒度的近乎即時重新整理,以及具有較高粒度的歷史靜態數據分割等案例進行設定。 這會導致較少的分割區,但也會增加管理額外負荷,以確保正確定義分割區範圍。

數據分割也適用於包含來自多個數據源之數據的數據表。 不同的數據源可能會在不同的時間更新數據,這可以判斷模型數據表數據的不同粒度和處理需求。 例如,模型中的 Orders 數據表包含來自兩個不同事實數據表的訂單交易:factInternetOrders 和 factRetailOrders。 在數據源中,factInternetOrders 會每小時更新一次。 factRetailOrders 另一方面只會在關閉所有零售商店後每天更新一次。 藉由在模型 Orders 數據表中針對從 factInternetOrders 和 factRetailOrders 匯入的數據建立不同的數據分割,Orders 數據表上的處理作業可以與數據源的訂單數據更內嵌地分開並執行。

每個案例都是唯一的。 請務必定義數據模型的數據粒度,最有效地將數據分割成必須經常處理的分割區,與未處理的數據分割相較之下。

數據分割限制

不論平台為何,模型中的數據分割物件數目都沒有硬性限制。 不過,每個分割區至少有一個具有記憶體使用量的數據區段。 太多小型分割區可能會導致太多社區段。 當記憶體引擎必須掃描過多的區段時,查詢效能可能會受到負面影響。 過多分割區的元數據作業速度也會對處理資源造成負面影響。

建立分割區數目下限,同時仍能有效地達到數據分割目標。 請務必根據數據粒度來集中有效的數據分割策略,並在用戶查詢不足時,只處理那些在可用處理和記憶體資源內變更數據最相關的數據分割。

分割區中的數據量也沒有任何限制。 雖然不太可能,但模型可能會有具有單一默認分割區的單一數據表,而且該數據表可以包含模型中的所有數據。 分割區中的數據量只會受限於服務方案或硬體的可用記憶體資源。

建立和管理分割區

在 Visual Studio 中使用表格式模型設計工具撰寫模型時,您可以使用數據分割管理員,在模型工作區資料庫中建立新的分割區、編輯、合併或刪除數據分割。 根據您要撰寫之模型的相容性層級,數據分割管理員會提供兩種模式來選取要包含在數據分割中的數據:針對表格式 1400 和具有結構化數據源的更高模型,數據分割是使用 Power Query M 表達式來定義。 例如,下列查詢會定義 2019 日曆年度的數據分割:

let
    Source = #"SQL/sqlserver database windows net;Contoso",
    dbo_Sales = Source{[Schema="dbo",Item="Sales"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_Sales, each [OrderDateKey] >= 20190101 and [OrderDateKey] <= 20191231)
in
    #"Filtered Rows"

針對提供者數據源,數據分割是使用 SQL 查詢來定義。 例如

SELECT [dbo].[Sales].* FROM [dbo].[Sales]
WHERE (([OrderDateKey] >= '20190101') AND ([OrderDateKey] <= '20191231'))

請注意 Power Query M 運算式中的 Filtered Rows 自變數和 SQL 語句中的 WHERE 子句,使用大於 (>)、小於 (<) 和等於 (=) 運算符,只定義一個日曆年。 定義分割區時,重要的是每個分割區的查詢都會定義一個無法與其他分割區重複數據的唯一數據範圍。

SQL Server Management Studio (SSMS)

部署模型之後,分割區會顯示為 SQL Server Management Studio (SSMS) 中的物件。 使用 SSMS 中的 [資料分割] 對話框、執行表格式模型腳本語言 (TMSL) 腳本,或使用表格式物件模型以程式設計方式建立、編輯、合併和刪除已部署模型的分割區。

表格式模型文稿語言 (TMSL)

模型的分割區定義於 Partitions 物件中,。 在下列範例中,Sales2019 分割區定義為:

"partition": {
      "name": "Sales2019",
      "mode": "import",
      "source": {
        "type": "m",
        "expression": [
          "let",
          "    Source = #\"SQL/sqlserver database windows net;Contoso\",",
          "    dbo_Sales = Source{[Schema=\"dbo\",Item=\"Sales\"]}[Data],",
          "    #\"Filtered Rows\" = Table.SelectRows(dbo_Sales, each [OrderDateKey] >= 20190101 and [OrderDateKey] <= 20191231)",
          "in",
          "    #\"Filtered Rows\""
        ]
      },

您可以在下列 TMSL 命令中指定 Partitions 物件的動作:

TMSL 腳本可以在 SQL Server Management Studio 中執行,使用 PowerShell 執行 Invoke-ASCmd 命令,或由 SQLServer Integration Services (SSIS) 腳本工作來執行。

對於 1100 和 1103 相容性層級的模型,如果TMSL,則會改用 Analysis Services 腳本語言 (ASSL)

表格式物件模型 (TOM)

在表格式物件模型中,數據分割是由 Microsoft.AnalysisServices.Tabular 命名空間中的 Partition 類別所定義。 若要深入瞭解使用 TOM 作為 API 的程式設計解決方案,請參閱本文稍後 建立數據表、數據分割和數據行 (TOM),以及 進階數據分割策略

針對 1100 和 1103 相容性層級的模型,請使用 Analysis Management Objects (AMO)

處理數據分割

分割數據表數據時,就可以一次處理那些數據分割,並針對您的解決方案適當步調處理這些數據分割。 執行進程(重新整理)作業時,會使用數據源連接來建立與數據源的連線。 Analysis Services 會使用針對每個分割區指定的查詢來查詢數據源。 新的和更新的數據會載入模型數據表、重建關聯性和階層,並重新計算匯出數據行。

在 Visual Studio 中撰寫模型時,您可以從功能表或工具列,在工作區資料庫分割區上手動執行程式作業。 針對已部署的模型,處理作業是使用 SSMS 中的 [處理資料表] 對話框手動叫用,方法是執行腳本,其中包含 Refresh 命令 (TMSL),或使用表格式物件模型以程式設計方式叫用 。

平行處理

Analysis Services 會針對兩個或多個數據分割使用平行處理,以提升處理效能。 沒有平行處理的組態設定。 當您處理數據表或針對同一個數據表和進程選取多個分割區時,預設會發生平行處理。 不過,有些設定會限制平行處理作業。

MaxConnections

根據預設,每個處理作業都會連接到並查詢每個分割區的數據源。 指定為單一資料來源之 MaxConnections 屬性的預設連線數目上限為 10。 Analysis Services 會根據核心數目和可用的線程,決定要執行的並行處理作業數目。 這些線程會在伺服器實例之間共用。 進程之類的單一命令可能不會接收所有可用的線程。 執行啟動以進行處理的線程,每個平行處理作業各有一個線程,可能會延遲保持在 MaxConnections 限制內。

MaxParallelism

根據預設,處理作業會盡可能平行執行。 不過,您可以選擇使用 Sequence 命令 (TMSL)來指定 maxParallism 屬性選項,以循序或平行處理分割區。 將值設定為 1 表示不是平行的 - 一個線程用於處理。 將值設定為 2 或更多,指定可用於平行處理作業的固定線程數目。

監控

若要判斷在處理作業期間有效使用可用的線程,針對 Azure Analysis Services,請使用 Azure 計量總管來監視 CommandPoolIdleThreads 和 CommandPoolBusyThreads。 若要深入瞭解,請參閱 監視伺服器計量。 針對 SQL Server Analysis Services,請使用性能監視器來監視處理集區閑置的非 I/O 線程,以及處理集區忙碌的非 I/O 線程。 若要深入瞭解,請參閱 性能計數器 (SSAS)

注意

如果偵測到重新編碼,平行處理可能會導致資源使用量增加。 這是因為多個分割區作業必須以新的編碼平行方式中斷並重新啟動。

進階數據分割策略

Analysis Services 表格式模型的自動化數據分割管理 .pdf 一文,以及 GitHub 中隨附的 AsPartitionProcessing 程式代碼範例,提供虛構公司 Advenure Works 的解決方案範例,方法是使用表格式物件模型 (TOM) 來建立和管理分割區。 本文和專案中所述的概念適用於所有 Analysis Services 平臺。

另請參閱

建立和管理表格式模型分割區
Partitions 物件 (TMSL)
使用表格式物件模型建立數據表、數據分割和數據行
建立分割區 (教學課程)