Ако имате включено регистриране, за предпочитане към SQL Server, добавете събитието OnPipelineRowsSent. След това можете да определите къде прекарва цялото си време. Вижте тази публикация Вашата IO подсистема се забива и генерира всички тези временни файлове, защото вече не можете да съхранявате цялата информация в паметта (поради вашите асинхронни трансформации).
Съответното запитване от свързаната статия е следното. Той разглежда събитията в sysdtslog90
(Потребителите на SQL Server 2008+ заместват 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);
Успяхте да използвате тази заявка, за да разпознаете, че компонентът Merge Join е изоставащият компонент. Защо се представя различно между двата сървъра, не мога да кажа на този етап.
Ако имате възможност да създадете таблица във вашата целева система, можете да модифицирате процеса си, за да имате два 2 потока от данни (и да елиминирате скъпите асинхронни компоненти).
- Първият поток от данни ще вземе плоския файл и производните колони и ще ги приземи в етапна таблица.
- След това стартирате Изпълнение на SQL задача, за да обработите логиката Get Min Date + Delete.
- След това имате втория си поток от данни, който правите заявки от вашата етапна таблица и го прихващате направо към вашата дестинация.