Pau*_*ker 22 ssis sql-server-2012
当我设置它时,我忽略了保留期.我的数据库变得非常大,所以我希望减小它的大小.如果我只是更改保留期(它是365),则会导致SSIS运行我的包时出现问题.我甚至以小增量更改了它,但删除语句会创建阻止新作业运行的锁.
任何想法如何解决这个问题?我想过要创建一个新的SSISDB.
bil*_*nkc 34
Phil Brammer遇到了这个以及其他一些与SSIS目录的护理和喂养相关的事情,他在他的帖子目录索引建议中介绍了这些内容.
根本问题是MS试图设计带有RI的SSIS,但它们是懒惰的,允许级联删除发生而不是显式处理它们.
开箱即用,新的SSIS 2012目录数据库(SSISDB)应用了一些基本索引,并将参照完整性设置为在大多数表之间执行级联删除.
输入SQL代理作业"SSIS服务器维护作业".默认情况下,此作业设置为每天午夜运行,并使用两个目录参数来运行:"定期清理日志"和"保留期(天)."这些是设置后,维护作业将清除指定保留期之外的所有数据.
此维护作业从内部操作中一次删除循环中的10条记录,然后级联到下游的多个表中.在我们的例子中,我们每天有大约3000个操作记录要删除(一次10个!),从internal.operation_messages转换为160万行.那只是一张下游桌子!整个过程完全完全锁定了SSISDB数据库中的任何SELECT/INSERT数据
在MS改变工作方式之前,支持的选项是
将维护作业计划移至适合您环境的更合适的时间
我知道在我现在的客户端,我们只在凌晨加载数据,因此SSISDB在工作时间内保持安静.
如果在安静期间运行维护作业不是一个选项,那么您正在考虑制作自己的删除语句以尝试使级联删除更少.
在我目前的客户,过去10个月我们每晚运行约200个套餐,也是365天的历史.我们最大的表格是一个数量级.
Schema Table RowCount
internal event_message_context 1,869,028
internal operation_messages 1,500,811
internal event_messages 1,500,803
Run Code Online (Sandbox Code Playgroud)
所有这些数据的驱动程序中internal.operations只有3300行,这与Phil关于这些数据如何呈指数增长的评论一致.
因此,确定operation_id要清除和从叶表中删除工作回到核心internal.operations表.
USE SSISDB;
SET NOCOUNT ON;
IF object_id('tempdb..#DELETE_CANDIDATES') IS NOT NULL
BEGIN
DROP TABLE #DELETE_CANDIDATES;
END;
CREATE TABLE #DELETE_CANDIDATES
(
operation_id bigint NOT NULL PRIMARY KEY
);
DECLARE @DaysRetention int = 100;
INSERT INTO
#DELETE_CANDIDATES
(
operation_id
)
SELECT
IO.operation_id
FROM
internal.operations AS IO
WHERE
IO.start_time < DATEADD(day, -@DaysRetention, CURRENT_TIMESTAMP);
DELETE T
FROM
internal.event_message_context AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
DELETE T
FROM
internal.event_messages AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
DELETE T
FROM
internal.operation_messages AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
-- etc
-- Finally, remove the entry from operations
DELETE T
FROM
internal.operations AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
Run Code Online (Sandbox Code Playgroud)
通常的警告适用 - 不要相信互联网上的randoms代码 - 使用ssistalk和/或系统表中的图表来识别所有依赖项 - 您可能只需要将删除操作分成更小的操作 - 您可能会因为删除RI而受益对于操作,但确保使用check选项重新启用它们,以便它们受信任. - 如果操作持续时间超过4小时,请咨询您的dba