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