Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Gói SSIS chạy lâu hơn 500 lần trên một máy chủ

Nếu bạn đã bật ghi nhật ký, tốt nhất là cho SQL Server, hãy thêm sự kiện OnPipelineRowsSent. Sau đó, bạn có thể xác định nơi nó đang sử dụng tất cả thời gian của nó. Xem bài đăng này Hệ thống con IO của bạn bị đóng sập và tạo ra tất cả các tệp tạm thời này là do bạn không còn có thể lưu giữ tất cả thông tin trong bộ nhớ (do các biến đổi không đồng bộ của bạn).

Truy vấn có liên quan từ bài báo được liên kết là như sau. Nó xem xét các sự kiện trong sysdtslog90 (Người dùng thay thế SQL Server 2008+ sysssislog ) và thực hiện một số phân tích thời gian trên chúng.

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

Bạn có thể sử dụng truy vấn này để phân biệt rằng thành phần Kết hợp Hợp nhất là thành phần tụt hậu. Tại sao nó hoạt động khác nhau giữa hai máy chủ, tôi không thể nói vào thời điểm này.

Nếu bạn có khả năng tạo một bảng trong hệ thống đích của mình, bạn có thể sửa đổi quy trình của mình để có hai luồng dữ liệu 2 (và loại bỏ các thành phần không đồng bộ tốn kém).

  1. Luồng dữ liệu đầu tiên sẽ lấy Tệp phẳng và các cột Có nguồn gốc và đưa chúng vào một bảng dàn.
  2. Sau đó, bạn tắt lệnh Execute SQL Task để xử lý logic Lấy Ngày + Xóa.
  3. Sau đó, bạn có truy vấn luồng dữ liệu thứ hai từ bảng dàn dựng của mình và đưa nó vào ngay đích của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có bất kỳ chức năng hồi quy tuyến tính nào trong SQL Server không?

  2. Tôi cần chuyển tên cột bằng cách sử dụng biến trong câu lệnh select trong Thủ tục lưu trữ nhưng tôi không thể sử dụng truy vấn động

  3. SQL Server có tạo chỉ mục Không phân cụm trên tất cả các cột của bảng theo mặc định không

  4. Cách lấy Chuỗi kết nối từ cơ sở dữ liệu

  5. Tạo tệp XML từ SQL Server 2008