Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SSIS पैकेज एक सर्वर पर 500 गुना अधिक समय तक चलता है

यदि आपने लॉगिंग चालू कर दी है, तो अधिमानतः 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 घटकों को समाप्त कर सकते हैं)।

  1. पहला डेटा प्रवाह फ़्लैट फ़ाइल और व्युत्पन्न स्तंभों को लेगा और उसे एक स्टेजिंग तालिका में ले जाएगा।
  2. फिर आपके पास Get Min Date + Delete लॉजिक को संभालने के लिए एक Execute SQL टास्क फ़ायर ऑफ है।
  3. फिर आपके पास अपनी स्टेजिंग टेबल से दूसरा डेटा फ़्लो क्वेरी करना है और इसे सीधे अपने गंतव्य में स्नैप करना है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर डेटाबेस में पहचान वृद्धि बढ़ रही है

  2. SQL सर्वर 2012 के लिए एक प्रोसेसर का चयन

  3. SQL सर्वर त्रुटि 109:INSERT कथन में VALUES खंड में निर्दिष्ट मानों की तुलना में अधिक स्तंभ हैं

  4. एसक्यूएल में दिनांक धारावाहिक?

  5. टीएसक्यूएल श्रेड एक्सएमएल - नेमस्पेस के साथ काम करना