我们的一个 SQL 实例有一个大型 MDS 数据库,几乎 100% 的大小是由于一个名为stg.Stg_Project_Leaf
. 它最近开始破坏我们每周的索引重建,所以我需要弄清楚这一点。
据我所知,这是“项目”实体的叶成员暂存表,作为构建 BI 多维数据集/报告的 ETL 过程的一部分进行设置和自动化(由先前的顾问)。
看起来它在过去几年中每半小时处理大约 10k 行,并且从未被清除过。但是,当我检查时ImportStatus_ID
,我看到 0 行等待处理。(大多数是 1 - 成功,不到 1% 是 2 - 失败。)
我可以只用TRUNCATE
这张桌子吗?
该系统正在以自动化方式使用,它不像人们登录到 MDS 控制台并单独监控和回滚更改。我发现了一些对清除这些表(mdm.udpStagingClear
或可能mdm.udpDeletedMembersPurge
)的存储过程的引用,但我不确定其中哪一个是我需要的,也不知道如果他们尝试执行 300m 是否会炸毁日志行。
简而言之:官方的答案是使用新的 proc
mdm.udpEntityStagingBatchTableCleanup
来清理实体暂存表,但在实践中,DELETE
或者TRUNCATE
应该可以正常工作(或者可能是必要的),只要您了解批处理详细信息。我找到了对 SQL 2012 补丁的引用,该补丁向 MDS添加了 3 个存储过程,包括我需要的一个:
另请参阅本文以了解使用相同 procs 的计划清理选项。
不过,出于我的目的,我仍然担心用 300 多万行必须删除的行来炸毁 tran 日志,所以我详细研究了
mdm.udpEntityStagingBatchTableCleanup
. 此存储过程执行以下操作:@Model_ID
,早于@CleanupOlderThanDate
)。DELETE
的每个表构建相应的叶表、合并表和关系表的动态语句。DISTINCT Entity_ID
DELETE
语句中的每一个,通过连接到临时表进行过滤。mdm.tblStgBatch
自身中删除,再次通过连接到临时表进行过滤。没有尝试限制一次删除的行数,在我的情况下,300+ 百万行全部用于单个
Entity_ID
,这可能会炸毁事务日志。不过,好消息是,如果我打算删除所有
Entity_IDs
日期(我确实这样做了),那么这在功能上等同于 aTRUNCATE
,只要我小心不要在活动批次的中间尝试它。最后,虽然我找不到任何明确建议截断这些表的官方 MS 资源,但我确实找到了几篇文章,其中 DBA
TRUNCATE
在导入过程的开始或结束时执行例程:所以我的计划是做一个初始的
TRUNCATE
,然后安排mdm.udpEntityStagingBatchTableCleanup
定期运行。