sql >> データベース >  >> RDS >> Sqlserver

SSISDB をクリーンアップするにはどうすればよいですか?

    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 を使用して、「通常の」テーブルがまだ存在するが空であることがわかります すべてのデータを含むバージョン。

    参考文献



    1. 自己管理型PostgreSQLパーティションテーブル

    2. SQL Serverオペレーティングシステムエラー5:5(アクセスが拒否されました。)

    3. SQLSecure4.0の一般提供の発表

    4. PHPでSQLServerに接続できません