Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Paket SSIS berjalan 500x lebih lama di satu server

Jika Anda telah mengaktifkan logging, sebaiknya ke SQL Server, tambahkan event OnPipelineRowsSent. Anda kemudian dapat menentukan di mana ia menghabiskan seluruh waktunya. Lihat postingan ini Subsistem IO Anda dibanting dan menghasilkan semua file temp ini karena Anda tidak lagi dapat menyimpan semua informasi di memori (karena transformasi asinkron Anda).

Kueri yang relevan dari artikel tertaut adalah sebagai berikut. Itu terlihat di acara di sysdtslog90 (Pengguna SQL Server 2008+ menggantikan sysssislog ) dan melakukan beberapa analisis waktu pada mereka.

;
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.WaktuMulai, Min(WaktuMulai S.);

Anda dapat menggunakan kueri ini untuk membedakan bahwa komponen Gabung Gabung adalah komponen yang tertinggal. Mengapa kinerjanya berbeda antara dua server, saya tidak bisa mengatakannya saat ini.

Jika Anda memiliki kemampuan untuk membuat tabel di sistem tujuan Anda, Anda dapat memodifikasi proses Anda untuk memiliki dua 2 aliran data (dan menghilangkan komponen asinkron yang mahal).

  1. Alur data pertama akan mengambil file Flat dan kolom Derived dan memasukkannya ke dalam tabel staging.
  2. Kemudian, Anda harus mengaktifkan Execute SQL Task untuk menangani logika Get Min Date + Delete.
  3. Kemudian Anda memiliki kueri aliran data kedua dari tabel staging dan memasukkannya langsung ke tujuan Anda.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversikan kueri SQL Server ke MySQL

  2. Dapper.NET dan proc tersimpan dengan beberapa set hasil

  3. Bagaimana saya bisa mengubah data Geometri menjadi data Geografi di MS SQL Server 2008?

  4. Ganti spasi duplikat dengan satu spasi di T-SQL

  5. Dasar-dasar Otomatisasi Tugas SQL Server