sql >> Databáze >  >> RDS >> Sqlserver

SSIS Package běží 500x déle na jednom serveru

Pokud máte zapnuté protokolování, nejlépe na SQL Server, přidejte událost OnPipelineRowsSent. Poté můžete určit, kde tráví veškerý svůj čas. Viz tento příspěvek Váš IO subsystém je zablokován a generuje všechny tyto dočasné soubory, protože již nejste schopni uchovávat všechny informace v paměti (kvůli vašim asynchronním transformacím).

Relevantní dotaz z odkazovaného článku je následující. Sleduje události v sysdtslog90 (Uživatelé SQL Server 2008+ nahrazují sysssislog ) a provede na nich určitou časovou analýzu.

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

Tento dotaz jste mohli použít k zjištění, že komponenta Merge Join byla zpožděnou komponentou. Proč se mezi těmito dvěma servery chová odlišně, v tuto chvíli nemohu říci.

Pokud máte možnost vytvořit tabulku v cílovém systému, můžete upravit svůj proces tak, aby měl dva 2 datové toky (a odstranit nákladné asynchronní komponenty).

  1. První datový tok převezme sloupce Plochý soubor a Odvozené a uloží je do pracovní tabulky.
  2. Potom se spustí úloha Spustit SQL, která bude zpracovávat logiku Get Min Date + Delete.
  3. Pak se váš druhý datový tok dotazuje z vaší pracovní tabulky a ukládá jej přímo do cíle.


  1. SQL Server REPLACE() vs TRANSLATE():Jaké jsou rozdíly?

  2. SQL Server – Kdy použít klastrovaný vs neklastrovaný index?

  3. Mysql místo připojení k serveru vytiskne nápovědu

  4. Lze SQL Server Express LocalDB připojit vzdáleně?