Jika Anda telah mengaktifkan logging, sebaiknya ke SQL Server, tambahkan event OnPipelineRowsSent. Anda kemudian dapat menentukan di mana ia menghabiskan seluruh waktunya. Lihat postingan ini Subsistem IO Anda dibanting dan menghasilkan semua file temp ini karena Anda tidak lagi dapat menyimpan semua informasi di memori (karena transformasi asinkron Anda).
Kueri yang relevan dari artikel tertaut adalah sebagai berikut. Itu terlihat di acara di sysdtslog90
(Pengguna SQL Server 2008+ menggantikan sysssislog
) dan melakukan beberapa analisis waktu pada mereka.
;
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.WaktuMulai, Min(WaktuMulai S.);
Anda dapat menggunakan kueri ini untuk membedakan bahwa komponen Gabung Gabung adalah komponen yang tertinggal. Mengapa kinerjanya berbeda antara dua server, saya tidak bisa mengatakannya saat ini.
Jika Anda memiliki kemampuan untuk membuat tabel di sistem tujuan Anda, Anda dapat memodifikasi proses Anda untuk memiliki dua 2 aliran data (dan menghilangkan komponen asinkron yang mahal).
- Alur data pertama akan mengambil file Flat dan kolom Derived dan memasukkannya ke dalam tabel staging.
- Kemudian, Anda harus mengaktifkan Execute SQL Task untuk menangani logika Get Min Date + Delete.
- Kemudian Anda memiliki kueri aliran data kedua dari tabel staging dan memasukkannya langsung ke tujuan Anda.