sql >> Database >  >> RDS >> Sqlserver

SSIS-pakket draait 500x langer op één server

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).

  1. De eerste gegevensstroom zou de kolommen Flat file en Derived nemen en die in een staging-tabel plaatsen.
  2. Je hebt dan een Execute SQL Task-activering om de Get Min Date + Delete-logica af te handelen.
  3. Vervolgens laat je je tweede gegevensstroom een ​​query uitvoeren vanuit je verzameltabel en deze rechtstreeks op je bestemming klikken.


  1. De ALTER TABLE-instructie was in strijd met de FOREIGN KEY-beperking

  2. postgresql misvormde array letterlijk in create aggregaat initcond

  3. MySQL-weergaven gebruiken

  4. Hoe gebruiker in Superuser te veranderen in PostgreSQL