表格模型中的分区
适用于: 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) 脚本)或以编程方式使用表格对象模型模型 (TOM) 来创建、编辑、合并和删除已部署模型的分区。
表格模型脚本语言 (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 兼容级别的模型,请使用 分析管理对象 (AMO) 。
处理分区
对表数据进行分区时,可以按适合你的解决方案的节奏一次处理这些分区。 当进程 (刷新) 操作运行时,将使用数据源连接建立与数据源的连接。 Analysis Services 使用为每个分区指定的查询来查询数据源。 新的和更新的数据将加载到模型表中,重新生成关系和层次结构,并重新计算计算列。
在 Visual Studio 中创作模型时,可以从菜单或工具栏对工作区数据库分区手动运行进程操作。 对于已部署的模型,可以使用 SSMS 中的“处理表”对话框手动调用处理操作,通过运行包含 refresh 命令的脚本 (TMSL) ,或通过编程方式使用表格对象模型 (TOM) 。
并行处理
Analysis Services 对两个或多个分区使用并行处理,从而提高处理性能。 对于并行处理,没有相应的配置设置。 默认情况下,当处理表或为同一表和进程选择多个分区时,将进行并行处理。 但是,存在限制并行处理操作的设置。
MaxConnections
默认情况下,每个处理操作将连接到并查询每个分区的数据源。 指定为单个数据源的 MaxConnections 属性的默认最大连接数为 10。 Analysis Services 根据核心数和可用线程数确定要运行的并发处理操作数。 这些线程在服务器实例之间共享。 单个命令(如进程)可能不会接收所有可用线程。 启动进行处理的线程(每个并行处理操作一个)可能会延迟,以保持在 MaxConnections 限制范围内。
MaxParallelism
默认情况下,处理操作尽可能并行运行。 但是,可以选择按顺序或并行处理分区,方法是使用 Sequence 命令指定 maxParallism 属性选项 , (TMSL) 。 将值设置为 1 表示不并行 - 一个线程用于处理。 将值设置为 2 或更多指定可用于并行处理操作的固定线程数。
监视
若要确定在进程操作期间有效使用可用线程,Azure Analysis Services,请使用 Azure 指标资源管理器监视 CommandPoolIdleThreads 和 CommandPoolBusyThreads。 有关详细信息,请参阅监视服务器指标。 对于SQL Server Analysis Services,请使用 性能监视器 监视处理池空闲非 I/O 线程和处理池忙非 I/O 线程。 若要了解详细信息,请参阅 SSAS) (性能计数器 。
注意
如果检测到重新编码,并行处理可能会导致资源使用量增加。 这是因为需要中断多个分区操作,并使用新的编码并行重启。
高级分区策略
.pdf 文章 Analysis Services 表格模型自动化分区管理 ,以及 GitHub 中随附的 AsPartitionProcessing 代码示例,通过使用表格对象模型 (TOM) 创建和管理分区,为虚构公司 Advenure Works 提供了深入的信息和解决方案示例。 本文和项目中所述的概念适用于所有 Analysis Services 平台。
另请参阅
创建和管理表格模型分区
Partitions 对象 (TMSL)
使用表格对象模型创建表、分区和列 (TOM)
创建分区 (教程课程)