यदि आपने लॉगिंग चालू कर दी है, तो अधिमानतः SQL सर्वर पर, OnPipelineRowsSent ईवेंट जोड़ें। फिर आप यह निर्धारित कर सकते हैं कि यह अपना सारा समय कहाँ बिता रहा है। यह पोस्ट देखें आपका IO सबसिस्टम इन सभी अस्थायी फ़ाइलों को बंद कर रहा है और उत्पन्न कर रहा है क्योंकि अब आप सभी सूचनाओं को स्मृति में नहीं रख पा रहे हैं (आपके async परिवर्तनों के कारण)।
लिंक किए गए आलेख से प्रासंगिक क्वेरी निम्नलिखित है। यह sysdtslog90
. में घटनाओं को देखता है (एसक्यूएल सर्वर 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);
आप इस क्वेरी का उपयोग यह जानने में सक्षम थे कि मर्ज जॉइन घटक लैगिंग घटक था। यह दो सर्वरों के बीच अलग-अलग प्रदर्शन क्यों करता है, मैं इस समय नहीं कह सकता।
यदि आपके पास अपने गंतव्य सिस्टम में एक तालिका बनाने की क्षमता है, तो आप अपनी प्रक्रिया को दो 2 डेटा प्रवाह के लिए संशोधित कर सकते हैं (और महंगे async घटकों को समाप्त कर सकते हैं)।
- पहला डेटा प्रवाह फ़्लैट फ़ाइल और व्युत्पन्न स्तंभों को लेगा और उसे एक स्टेजिंग तालिका में ले जाएगा।
- फिर आपके पास Get Min Date + Delete लॉजिक को संभालने के लिए एक Execute SQL टास्क फ़ायर ऑफ है।
- फिर आपके पास अपनी स्टेजिंग टेबल से दूसरा डेटा फ़्लो क्वेरी करना है और इसे सीधे अपने गंतव्य में स्नैप करना है।