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

SSISパッケージは1台のサーバーで500倍長く実行されます

    ロギングをオンにしている場合、できればSQL Serverに対して、OnPipelineRowsSentイベントを追加します。次に、すべての時間をどこで費やしているかを判断できます。この投稿 をご覧ください IOサブシステムが非難され、これらすべての一時ファイルが生成されるのは、(非同期変換のために)すべての情報をメモリに保持できなくなったためです。

    リンク先の記事からの関連クエリは次のとおりです。 sysdtslog90のイベントを調べます (SQLServer2008以降のユーザーはsysssislogに置き換えます )そしてそれらに対していくつかの時間分析を実行します。

    ;
    WITH PACKAGE_START AS
    (
        SELECT DISTINCT
            Source
        ,   ExecutionID
        ,   Row_Number() Over (Order By StartTime) As RunNumber
        FROM
            dbo.sysdtslog90 AS L
        WHERE
            L.event = 'PackageStart'
    )
    , EVENTS AS
    (
        SELECT
            SourceID
        ,   ExecutionID
        ,   StartTime
        ,   EndTime
        ,   Left(SubString(message, CharIndex(':', message, CharIndex(':', message, CharIndex(':', message, CharIndex(':', message, 56) + 1) + 1) + 1) + 2, Len(message)), CharIndex(':', SubString(message, CharIndex(':', message, CharIndex(':', message, CharIndex(':', message, CharIndex(':', message, 56) + 1) + 1) + 1) + 2, Len(message)) ) - 2) As DataFlowSource
        ,   Cast(Right(message, CharIndex(':', Reverse(message)) - 2) As int) As RecordCount
        FROM
            dbo.sysdtslog90 AS L
        WHERE
            L.event = 'OnPipelineRowsSent'
    )
    , FANCY_EVENTS AS
    (
        SELECT
            SourceID
        ,   ExecutionID
        ,   DataFlowSource
        ,   Sum(RecordCount) RecordCount
        ,   Min(StartTime) StartTime
        ,   (
                Cast(Sum(RecordCount) as real) /
                Case
                    When DateDiff(ms, Min(StartTime), Max(EndTime)) = 0
                        Then 1
                    Else DateDiff(ms, Min(StartTime), Max(EndTime))
                End
            ) * 1000 As RecordsPerSec
        FROM
            EVENTS DF_Events
        GROUP BY
            SourceID
        ,   ExecutionID
        ,   DataFlowSource
    )
    SELECT
        'Run ' + Cast(RunNumber As varchar) As RunName
    ,   S.Source
    ,   DF.DataFlowSource
    ,   DF.RecordCount
    ,   DF.RecordsPerSec
    ,   Min(S.StartTime) StartTime
    ,   Max(S.EndTime) EndTime
    ,   DateDiff(ms, Min(S.StartTime)
    ,   Max(S.EndTime)) Duration
    FROM
        dbo.sysdtslog90 AS S
        INNER JOIN
            PACKAGE_START P
            ON S.ExecutionID = P.ExecutionID
        LEFT OUTER JOIN
            FANCY_EVENTS DF
            ON S.SourceID = DF.SourceID
            AND S.ExecutionID = DF.ExecutionID
    WHERE
        S.message <> 'Validating'
    GROUP BY
        RunNumber
    ,   S.Source
    ,   DataFlowSource
    ,   RecordCount
    ,   DF.StartTime
    ,   RecordsPerSec
    ,   Case When S.Source = P.Source Then 1 Else 0 End
    ORDER BY
        RunNumber
    ,   Case When S.Source = P.Source Then 1 Else 0 End Desc
    

    、DF.StartTime、Min(S.StartTime);

    このクエリを使用して、マージ結合コンポーネントが遅延コンポーネントであることを識別できました。 2つのサーバー間でパフォーマンスが異なる理由は、現時点ではわかりません。

    宛先システムにテーブルを作成する機能がある場合は、プロセスを変更して2つの2データフローを作成できます(コストのかかる非同期コンポーネントを排除できます)。

    1. 最初のデータフローは、フラットファイルと派生列を取得し、それをステージングテーブルに配置します。
    2. 次に、SQL実行タスクを起動して最小日付の取得+削除ロジックを処理します。
    3. 次に、ステージングテーブルからクエリを実行し、宛先にスナップする2番目のデータフローがあります。


    1. MySQLのデフォルトの順序はWHEREによって異なります

    2. SQLAlchemyエラーMySQLサーバーがなくなりました

    3. 私のプログラムは、Pythonのmysqlコネクタlibを使用してMySQLに値を保存できません

    4. MySQLを使用した.NETMVC3のセットアップ