Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SSIS пакетът работи 500 пъти по-дълго на един сървър

Ако имате включено регистриране, за предпочитане към SQL Server, добавете събитието OnPipelineRowsSent. След това можете да определите къде прекарва цялото си време. Вижте тази публикация Вашата IO подсистема се забива и генерира всички тези временни файлове, защото вече не можете да съхранявате цялата информация в паметта (поради вашите асинхронни трансформации).

Съответното запитване от свързаната статия е следното. Той разглежда събитията в sysdtslog90 (Потребителите на SQL Server 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);

Успяхте да използвате тази заявка, за да разпознаете, че компонентът Merge Join е изоставащият компонент. Защо се представя различно между двата сървъра, не мога да кажа на този етап.

Ако имате възможност да създадете таблица във вашата целева система, можете да модифицирате процеса си, за да имате два 2 потока от данни (и да елиминирате скъпите асинхронни компоненти).

  1. Първият поток от данни ще вземе плоския файл и производните колони и ще ги приземи в етапна таблица.
  2. След това стартирате Изпълнение на SQL задача, за да обработите логиката Get Min Date + Delete.
  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 Server DateTime

  2. комбиниране на днес и общото предишно от днес на същата колона води до една sql заявка

  3. Как да преименувате име на таблица в SQL Server

  4. Изберете от една таблица и вмъкнете в други две таблици

  5. Как да намеря директорията с данни за екземпляр на SQL Server?