Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Das SSIS-Paket läuft 500-mal länger auf einem Server

Wenn Sie die Protokollierung aktiviert haben, vorzugsweise in SQL Server, fügen Sie das OnPipelineRowsSent-Ereignis hinzu. Sie können dann feststellen, wo es seine ganze Zeit verbringt. Siehe diesen Beitrag Dass Ihr IO-Subsystem angegriffen wird und all diese temporären Dateien generiert, liegt daran, dass Sie nicht mehr alle Informationen im Speicher behalten können (aufgrund Ihrer asynchronen Transformationen).

Die relevante Abfrage aus dem verlinkten Artikel lautet wie folgt. Es betrachtet Ereignisse im sysdtslog90 (Benutzer von SQL Server 2008+ ersetzen sysssislog ) und führt einige Zeitanalysen für sie durch.

;
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.StartZeit, Min(S.StartZeit);

Sie konnten diese Abfrage verwenden, um zu erkennen, dass die Merge Join-Komponente die verzögerte Komponente war. Warum es zwischen den beiden Servern unterschiedlich abschneidet, kann ich an dieser Stelle nicht sagen.

Wenn Sie in Ihrem Zielsystem eine Tabelle erstellen können, können Sie Ihren Prozess so ändern, dass er zwei 2 Datenflüsse hat (und die kostspieligen asynchronen Komponenten eliminieren).

  1. Der erste Datenfluss würde die Flatfile- und abgeleiteten Spalten nehmen und diese in einer Staging-Tabelle landen.
  2. Sie haben dann einen Task „SQL ausführen“ ausgelöst, um die Logik „Get Min Date + Delete“ zu handhaben.
  3. Dann haben Sie Ihren zweiten Datenfluss, der Ihre Staging-Tabelle abfragt und direkt in Ihr Ziel einrastet.