Phil Brammer は、これに遭遇し、SSIS カタログの管理と供給に関連する他の多くの事柄に遭遇しました。これについては、彼の投稿 カタログ索引作成の推奨事項 .
根本的な問題
根本的な問題は、MS が RI を念頭に置いて SSIS を設計しようとしたことですが、それらは怠惰であり、明示的に処理するのではなくカスケード削除が発生することを許可していたことです。
解決策
MS が動作方法を変更するまで、サポートされているオプションは
私の現在のクライアントでは、平日にしかデータをロードしないので、営業時間中は SSISDB は静かです。
静かな時間帯にメンテナンス ジョブを実行することができない場合は、独自の削除ステートメントを作成して、カスケード削除を suck less にすることを検討しています。 .
私の現在のクライアントでは、過去 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
そのすべてのデータのドライバー、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, [email protected], 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;
通常の注意事項が適用されます
- インターネット上のランダムなコードを信用しない
- ssistalk やシステム テーブルの図を使用して、すべての依存関係を特定します
- 削除操作をより小さな操作に分割するだけでよい場合があります
- オペレーションの RI を削除することでメリットが得られる場合もありますが、確実に信頼されるようにチェック オプションを使用して再度有効にしてください。
- 操作が 4 時間以上続く場合は、データベース管理者に相談してください
2020 年 7 月編集
Tim Mitchell には、SSIS カタログの自動クリーンアップ そして SSIS カタログ データベース そして彼の素晴らしい新刊 The SSIS Catalog:Install, Manage 、エンタープライズ ETL インフラストラクチャの保護と監視
@Yong Jun Kim コメントに記載
これは、Azure Data Factory 内で SSIS IR を使用している場合に当てはまります。 *_scaleout
を使用して、「通常の」テーブルがまだ存在するが空であることがわかります すべてのデータを含むバージョン。
参考文献
- カタログの索引付けに関する推奨事項
- 注意してくださいSSIS サーバー メンテナンス ジョブ
- SSIS サーバー メンテナンス ジョブを実行して SQL の古いデータを削除するとパフォーマンスが低下するサーバー 2012