SQL Server 2016 MDS企业版:迁移完成周期记录并删除原库指定记录
嘿,针对你在SQL Server 2016 MDS里遇到的性能瓶颈和数据归档需求,我整理了一套实操性强的方案,分步骤来做会更稳妥,还能避免踩坑:
一、前期准备工作
- 创建归档表:首先得建一个和MDS实体表结构匹配的归档表,要包含所有你需要保留的字段(包括MDS自带的系统字段,比如
VersionId、CreatedDate这类用于追溯的字段)。可以用这条语句快速生成结构(记得替换实际的库名和实体表名):
-- 替换ArchiveDB为你的归档数据库,YourEntityArchive为归档表名,tbl_YourEntity为MDS里的实体表 SELECT TOP 0 * INTO [ArchiveDB].[dbo].[YourEntityArchive] FROM [MDS].[mdm].[tbl_YourEntity];
MDS的实体表默认在mdm库下,命名规则是tbl_加上实体的内部名称,如果你不确定,可以查系统视图mdm.viw_SYSTEM_ENTITY找对应实体的表名。
- 确认权限:确保你拥有这几项权限:MDS实体的删除权限、归档表的插入权限,还有SQL Server的批量操作权限,避免操作到一半报错。
二、迁移并删除已完成周期的记录
根据数据量大小,有两种方案可选:
方案1:分批次迁移(适合超大数据量)
如果数据量很大,一次性操作容易锁表或者超时,建议用循环批量处理,每次处理固定条数的记录:
DECLARE @BatchSize INT = 1000; -- 可根据服务器性能调整批次大小 WHILE EXISTS (SELECT 1 FROM [MDS].[mdm].[tbl_YourEntity] WHERE [CycleStatus] = 'Yes') BEGIN BEGIN TRANSACTION; -- 插入归档表 INSERT INTO [ArchiveDB].[dbo].[YourEntityArchive] SELECT TOP (@BatchSize) * FROM [MDS].[mdm].[tbl_YourEntity] WHERE [CycleStatus] = 'Yes'; -- 删除MDS中的记录 DELETE TOP (@BatchSize) FROM [MDS].[mdm].[tbl_YourEntity] WHERE [CycleStatus] = 'Yes'; COMMIT TRANSACTION; WAITFOR DELAY '00:00:01'; -- 可选,给服务器留一点资源释放时间,避免压力过大 END
注意替换CycleStatus为你实际的属性列名(MDS里的属性列名可能是Attribute_CycleStatus,具体要看实体表的结构)。
方案2:一次性迁移(数据量较小时用)
如果数据量不大,直接用事务包裹插入和删除操作,确保原子性:
BEGIN TRANSACTION; -- 迁移数据到归档表 INSERT INTO [ArchiveDB].[dbo].[YourEntityArchive] SELECT * FROM [MDS].[mdm].[tbl_YourEntity] WHERE [CycleStatus] = 'Yes'; -- 删除MDS中的已完成记录 DELETE FROM [MDS].[mdm].[tbl_YourEntity] WHERE [CycleStatus] = 'Yes'; COMMIT TRANSACTION;
⚠️ 这种方式会锁表,一定要在业务低峰期操作,避免影响正常使用。
三、MDS元数据一致性维护(关键!)
MDS是带元数据和业务规则的系统,只删底层表的记录可能导致元数据不一致,所以要做额外处理:
方法1:用MDS门户批量删除
如果数据量不是特别大,直接在MDS界面操作更安全:
- 登录MDS门户,进入对应的实体页面;
- 用高级筛选找出
Cycle Status为Yes的记录; - 全选这些记录,点击「删除」按钮确认。
这种方式会自动维护MDS的元数据,比如更新版本、清理业务规则关联数据,但数据量太大时可能会超时。
方法2:结合MDS系统存储过程
如果数据量很大,界面操作超时,可以用MDS的系统存储过程来清理元数据:
DECLARE @EntityId INT, @ModelId INT; -- 获取对应实体和模型的ID SELECT @ModelId = ModelId, @EntityId = EntityId FROM mdm.tblEntity WHERE EntityName = '你的实体名' AND ModelName = '你的模型名'; -- 先删除底层表的记录(用上面的批量或一次性方式) -- 然后调用存储过程清理元数据 EXEC mdm.udpEntityMemberDelete @EntityId, @ModelId, NULL, NULL;
四、迁移后的性能优化
为了避免MDS再次变慢,做完迁移后可以做这些优化:
- 重建索引:对MDS实体表和归档表都重建索引,提升查询和操作性能:
-- 重建MDS实体表索引 ALTER INDEX ALL ON [MDS].[mdm].[tbl_YourEntity] REBUILD; -- 重建归档表索引 ALTER INDEX ALL ON [ArchiveDB].[dbo].[YourEntityArchive] REBUILD;
- 调整业务规则:修改现有业务规则,让它们只作用于
Cycle Status为No的记录。在MDS门户的业务规则编辑页面,添加条件「Cycle Status equals No」,把原有的业务规则嵌套在这个条件下,避免对已归档的记录做不必要的规则验证。
内容的提问来源于stack exchange,提问作者E.IK
相关产品推荐
相关产品推荐

