Als u logboekregistratie hebt ingeschakeld, bij voorkeur naar SQL Server, voegt u de gebeurtenis OnPipelineRowsSent toe. U kunt dan bepalen waar het al zijn tijd doorbrengt. Zie dit bericht Je IO-subsysteem wordt dichtgeslagen en genereert al deze tijdelijke bestanden omdat je niet langer alle informatie in het geheugen kunt bewaren (vanwege je asynchrone transformaties).
De relevante vraag uit het gelinkte artikel is de volgende. Het kijkt naar gebeurtenissen in de sysdtslog90
(SQL Server 2008+ gebruikers vervangen sysssislog
) en voert er enige tijdanalyse op uit.
;
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);
U kon deze query gebruiken om te onderscheiden dat de component Samenvoegen samenvoegen de achterblijvende component was. Waarom het anders presteert tussen de twee servers, kan ik op dit moment niet zeggen.
Als u de mogelijkheid heeft om een tabel in uw doelsysteem te maken, kunt u uw proces aanpassen om twee gegevensstromen te hebben (en de kostbare asynchrone componenten elimineren).
- De eerste gegevensstroom zou de kolommen Flat file en Derived nemen en die in een staging-tabel plaatsen.
- Je hebt dan een Execute SQL Task-activering om de Get Min Date + Delete-logica af te handelen.
- Vervolgens laat je je tweede gegevensstroom een query uitvoeren vanuit je verzameltabel en deze rechtstreeks op je bestemming klikken.