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).
- 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.
- Sau đó, bạn tắt lệnh Execute SQL Task để xử lý logic Lấy Ngày + Xóa.
- 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.