分区#
数据库分区是一项功能,可以将一个表分割到多个文件中,这对大表很有用,特别是对于那些保存历史数据的表。
Info
在SQL Server 2016 SP1之前,并非每个版本的SQL ServerTM都提供分区表和索引。
分区还简化了数据管理,通过处理较小范围的数据使查询运行得更快。此功能对于旧历史记录数据、高效的历史数据清除和滑动窗口场景的实现也很有用。本部分介绍了凯睿德制造软件ODS数据库中使用的分区策略。
在ODS中进行分区#
凯睿德制造软件ODS数据库使用不同的分区函数和分区方案,具体取决于它是主表还是历史记录表(例如T_Material被视为主表,而T_MaterialHistory是历史记录表)以及是否用于数据和索引。有关分区表、索引、架构和功能的详细信息,请参阅以下链接:分区表和索引 ⧉
默认情况下,凯睿德制造软件按月对历史记录数据进行分区,即每月都会添加新的数据文件,这些文件将包含特定月份的数据和索引信息。根据历史记录数据量,可以将此配置更改为每周分区或每日分区。分区方法可以随时更改。例如,如果您将分区策略从每月更改为每周,凯睿德制造软件将在下次评估创建新数据文件的需求时应用这些更改。如果分区策略重叠(从每月更改为每周),凯睿德制造软件将考虑到这一点,并且仅在当月数据文件不再使用时才添加周数据文件。
典型的分区ODS数据库将包含如下两张图片所示的文件和文件组:
如您所见,每月有一个xxxODS_FG_HstTableDat_YYYYMM和一个xxxODS_FG_HstTableIdx_YYYYMM数据文件与相应的文件组(FG_HstTableDat_YYYYMM和FG_HstTableIdx_YYYYMM)。 此外,图片并不代表它,但是对主实体表应用分区时,您还应该找到每月命名格式为xxxODS_FG_MainTableDat_YYYYMM和xxxODS_FG_MainTableIdx_YYYYMM的数据文件,以及相应的文件组FG_MainTableDat_YYYYMM和FG_MainTableIdx_YYYYMM。
Info
您可以将不再使用的文件组标记为只读。这可能是减少数据库备份时间所必需的,因为只读文件组在备份一次后将不再包含在备份中。
分区 - 依赖项和组件#
如本手册前面所述,凯睿德MES支持对历史记录和主数据表进行分区。
主表和历史记录表使用不同的分区方案,这是必需的,因为主实体保留在默认分区上,而且只有在其终止时才移至与终止日期对应的分区。
另一方面,分区是在数据和索引级别完成的,因此创建了不同的分区架构,以支持在主实体和历史记录实体上共享相同的分区函数。这意味着数据和索引在历史数据生命周期中保持一致。
分区函数的主要目标是:
- 定义初始分区集的边界值(对于主实体,这意味着默认行为而不是历史记录表,这就是不能在这些实体之间共享相同分区函数的原因)
- 没有引用任何表或磁盘储存
- 一个或多个分区方案的基础
分区方案用于:
- 将特定分区映射到文件组
- 可用于一个或多个分区表、索引和索引视图
- 分区表或索引与特定的分区方案关联
- 分区表只通过分区方案与分区函数有间接关系
分区表依赖项:
分区表组件:
分区函数和可执行的基本操作的一些示例:
下面是一些分区方案和基本操作的示例:
在分区函数中发出split @15时,请注意Filegroup5的位置。
在上述示例中,请注意“范围右侧”和“范围左侧”之间的区别。
对于范围右侧,SQL Server会将Filegroup3上的旧分区3中的所有数据移至左侧带有合并分区2的Filegroup2中。由于插入和删除,此数据移动将导致事务日志增长。Filegroup3将是默认的“下一个使用”文件组。
对于范围左侧,SQL Server会将Filegroup2上旧分区2中的所有数据移至右侧合并分区2和Filegroup3中。由于插入和删除,此数据移动将导致事务日志增长。Filegroup3将是默认的下一个使用的文件组。
对表和索引进行分区#
在分区表中,分区列必须是聚集索引键、主键以及唯一索引和唯一性约束键的一部分。
二级索引不必使用与底层分区表相同的分区函数来实现索引对齐,只要每个索引使用的分区函数具有相同的特征(分区列的等效数据类型、边界值的数量和值,以及范围方向)。但是,对索引和底层分区表使用相同的分区函数和分区方案要方便得多。
索引对齐有助于实现分区消除,其中查询处理器可以从查询计划中消除未使用的分区,并且只访问查询所需的分区。使用SWITCH语句也需要索引对齐。如果表上有未对齐的二级索引并且需要使用SWITCH选项,则始终可以在切换过程中禁用该索引,并在完成后重新启用。
在凯睿德制造软件中,使用相同的分区函数可以保证索引对齐。
分区表中的数据移动#
下图描述了数据在分区之间的移动方式。
滑动窗口:更便宜的储存方案#
“滑动窗口:更便宜的储存方案”涉及将新分区滚入高性能I/O子系统,并将旧分区滚出高性能I/O子系统。仍然可以访问所有数据以进行查询或更新,但是预计最需要的数据可以驻留在更快的I/O子系统中,从而提高整体性能。例如,此类架构支持将最新6个月的数据保存在固态驱动器上,并将较旧的数据保存在15k串行连接SCSI驱动器上,而几乎不需要维护工作。关键是通过经济实惠的解决方案尽可能提高性能。
为了启用凯睿德制造软件“滑动窗口:更便宜的储存方案”,您需要执行以下操作:
-
找到安装CD中名为
P_RelocatePartitions.sql的脚本(路径应为:Software\Partitioning) -
设置含有适当调度和单个步骤的新作业,其代码应类似于:
-- number of days to retain on source I/O subsystem, e.g. for the 6 months scenario, you should set this value to 180 days
DECLARE @RetentionPeriodInDays INT = 180
-- set the target folder where to move filegroup files
DECLARE @NewRootDir NVARCHAR(512) = 'E:\ODS\Archive'
-- 0 (default) - runs normally and logs into message window;
-- 1 - does nothing, only prints what it would do
DECLARE @PrintScriptOnly BIT = 1
--optional, use only if only a specific target storage shall be moved
DECLARE @OldRootDir NVARCHAR(512)
--optional, not required on DWH and ODS databases.
-- Used to filter the filegroups (e.g. 'FG_HstTable%\_______' or 'FG\_%\_________\_%')
DECLARE @FileGroupSearchCriteria NVARCHAR(512)
--optional, not required on DWH and ODS databases.
-- Used to retrieve the date from the filegroup name
--(e.g. 'convert(date, left(convert(nvarchar,
-- SUBSTRING(fg.name, CHARINDEX(''_'', fg.name, 4)+1
--, len(fg.name)))+''01'', 8))'
-- or 'convert(date, LEFT(RIGHT(fg.name, charindex(''_'',reverse(fg.name),10)-1), 8))')
DECLARE @DateConversionStatement NVARCHAR(512)
EXECUTE [Control].[P_RelocatePartitions] @RetentionPeriodInDays, @NewRootDir, @PrintScriptOnly,
@OldRootDir, @FileGroupSearchCriteria, @DateConversionStatement
- 我们建议手动运行上述脚本,使用
@PrintScriptOnly=1检查是否正确捕获了所有数据库文件,从而验证所有输入参数 - 只要您有信心,就启用作业,数据库文件应该会移至目标目录中,而不会出现任何停机(确保您设置
@PrintScriptOnly=0,否则它总会执行一些操作)
滑动窗口:存档方案#
“滑动窗口:存档方案”涉及将新分区滚入分区表或视图,并将旧分区滚出分区表或视图。对旧数据进行存档时,新数据可供用户查询。关键是在移动分区时尽量减少停机时间。
可以对旧数据进行存档,并在必要时通过恢复适当的备份来检索旧数据,或者可以将旧数据转移到持久性较低、价格更便宜的I/O子系统,用户仍然可以使用该子系统进行查询。
可以通过将旧数据滑动到具有成本效益的I/O子系统来扩展滑动窗口实现。您可以将旧数据从高性能I/O子系统滑出到不具有相同高性能的低成本I/O子系统。
无法使用SQL Server中提供的备份和还原操作来完成此特定的滑动窗口实现。
在凯睿德MES中实现的方法如下:
- 将数据加载到位于经济实惠的I/O子系统中的另一个表
- 重建索引
- 删除旧分区并将新加载的表添加到分区表中
停机时间是切换分区所需的时间,无论您的数据集大小如何,切换分区的时间都可以忽略不计。
有关详细信息,请参阅SQL ServerTM联机丛书中的[设计分区以管理数据子集](http://technet.microsoft.com/en-us/library/ms191174(v=sql.105).aspx以及[使用分区切换有效地传输数据](http://technet.microsoft.com/en-us/library/ms191160(v=sql.105).aspx)
清除旧历史记录数据#
旧的历史记录表#
根据数据保留要求,还可以从凯睿德制造软件的历史记录表中清除旧数据。
为此,凯睿德制造软件根据安装的SQL Server版本实现了两种方法。
如果您的Standard Edition中没有分区功能,则可以通过发出直接删除语句来清除旧数据。
这是由凯睿德制造软件的储存过程[dbo].[P_PurgeEntityTablesForDay]实现的。
通常这在SQL Server作业和客户定义的保留天数中实现。删除的数据也可以导出到xml文件进行存档。
如果您有Enterprise版,因此 启用了分区,推荐的方法如下:
- 在包含要清除的数据的同一文件组中创建一个过渡表
- 将包含数据的分区切换到新表
- 删除新创建的表
与前一种方法相比,此方法具有许多优点,因为它不会生成日志并且需要极少的系统资源,从而尽可能地减少了对数据库的影响。
主实体表#
按照“启用ODS分区”中描述的步骤对主实体表执行操作后,您应该会找到一个名为\<dbname\>ODS_MainTablePartitioning。
此作业将执行以下4项操作:
- 将分区方案应用于所有尚未分区的实体表
- 生成读取T-SQL函数的“XML到表”,T-SQL函数允许像查询SQL表一样查询XML文件(验证导出到XML文件的数据时需要查询XML文件)
- 在ODS上将被联机清除的实体标记为已终止(即相应地设置分区列)
- 对XML文件应用实际导出,验证导出数据并删除分区(在内部删除分区会基于源表创建临时表,将包含数据的分区切换为删除,然后删除临时表)
Info
请注意,在删除这些分区后,如果导出的XML文件没有被删除,数据仍然可以恢复。您应该为这些分区设置备份策略。
启用ODS分区#
Info
不必在主表和历史记录表上都启用分区。我们建议对历史记录表进行分区,只有在大批量生产的情况下,才会对主实体进行分区,并采用滚动清除机制。
分区历史记录表#
为了在历史记录表上启用凯睿德制造软件ODS分区,您需要执行以下操作:
- 确保您拥有SQL Server Enterprise Edition (2019)或任何其他具有分区功能的版本
- 确认分区函数
PF_NavigoPartitionFunction以及分区方案PS_NavigoHstDataPartitionScheme和PS_NavigoHstIdxPartitionScheme已安装(位于\<databaseODS\>/Storage/Partition*下) - 定义分区ldf文件所在的位置。有关建议位置的信息,请参阅《安装指南》中的“数据库组和数据文件”部分
- 定义安装所需的分区方案。根据生成的数据量,决定是否需要每日、每周或每月分区。最常见的方法是从每月分区开始,然后根据需要进行调整
- 找到分区作业创建脚本(
03-ManagePartitions.sql),位于安装CD(路径:Software\Partitioning)中 - 对ODS数据库运行作业安装脚本。在运行该脚本之前,请用ODS数据库名称替换
$(ODSDatabaseName)字符串;用步骤2中定义的位置替换$(ODSDataFilesPath)字符串;最后用将用来访问ODS数据库的用户名替换$(ODSUser)字符串
此脚本将在ODS数据库中创建调度作业。此作业将于每天凌晨1点执行。以后可以像管理任何其他SQL Server作业一样管理该作业。
对主实体表进行分区#
为了在主实体表上启用凯睿德制造软件ODS分区,您需要执行以下操作:
- 确保您拥有SQL Server Enterprise Edition (2019)或任何其他具有分区功能的版本
- 确认分区函数
PF_NavigoMainDataPartitionFunction以及分区方案PS_NavigoMainDataPartitionScheme和PS_NavigoMainIdxPartitionScheme已安装(位于\<databaseODS\>/Storage/Partition*下) - 定义分区ldf文件的位置。请参阅《安装指南》中的“数据库组和数据文件”部分,了解推荐的位置
- 定义安装所需的分区方案。根据生成的数据量,确定需要每日、每周还是每月分区。最常见的方法是从每月分区开始,然后根据需要进行调整。
- 找到分区作业创建脚本(
04-MainTablesPartitioning.sql),位于安装CD(路径:Software\Partitioning) -
对ODS数据库运行作业安装脚本。在运行该脚本之前,请用ODS数据库名称替换
$(ODSDatabaseName)字符串;用步骤2中定义的位置替换$(ODSDataFilesPath)字符串; 用您想要在其中生成xml导出文件的文件夹替换$(ODSArchiveDataFilesPath);最后用将用来访问ODS数据库的用户名(通常是凯睿德制造软件的高级用户帐户)替换$(ODSUser)字符串 -
此脚本将在ODS数据库中创建一个具有名称格式
\<dbname\>ODS_MainTablePartitioning的调度作业,由4个步骤组成,负责将分区方案应用于所有尚未分区的实体;生成读取T-SQL函数的“XML到表”,T-SQL函数允许像查询SQL表一样查询XML文件;在ODS上将被联机清除的实体标记为已终止(即相应地设置分区列)并应用实际的分区导出和清除操作 - 在第一次运行前,您应按照步骤4设置保留期。默认情况下,它会将终止的实体保留1800天(即清除后约5年时间)。请注意,数据被导出到XML文件中,因此您可能需要将这些数据备份到其他数字容器(例如DVD或磁带),然后再从磁盘中实际清除这些文件。将XML文件从磁盘清除后,除非您有其他格式的备份,否则需要时无法恢复数据
- 此作业将于每天凌晨1点开始。以后可以像管理任何其他SQL Server作业一样管理该作业










