Gói mẫu sử dụng SSIS 2008 R2 chèn hoặc cập nhật bằng hoạt động hàng loạt:
Đây là gói mẫu được viết bằng SSIS 2008 R2 minh họa cách thực hiện chèn, cập nhật giữa hai cơ sở dữ liệu bằng cách sử dụng các hoạt động hàng loạt.
- Sử dụng
OLE DB Commandsẽ làm chậm các hoạt động cập nhật trên gói của bạn vì nó không thực hiện các hoạt động hàng loạt. Mỗi hàng đều được cập nhật riêng lẻ.
Mẫu sử dụng hai cơ sở dữ liệu là Source và Destination . Trong ví dụ của tôi, cả hai cơ sở dữ liệu đều nằm trên máy chủ nhưng logic vẫn có thể được áp dụng cho các cơ sở dữ liệu nằm trên các máy chủ và vị trí khác nhau.
Tôi đã tạo một bảng có tên là dbo.SourceTable trong cơ sở dữ liệu nguồn của tôi Source .
CREATE TABLE [dbo].[SourceTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
[IsActive] [bit] NULL
)
Ngoài ra, đã tạo hai bảng có tên dbo.DestinationTable và dbo.StagingTable trong cơ sở dữ liệu đích của tôi Destination .
CREATE TABLE [dbo].[DestinationTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
CREATE TABLE [dbo].[StagingTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
Đã chèn khoảng 1,4 triệu hàng trong bảng dbo.SourceTable với các giá trị duy nhất thành RowNumber cột. Các bảng dbo.DestinationTable và dbo.StagingTable đã trống để bắt đầu. Tất cả các hàng trong bảng dbo.SourceTable có cờ IsActive đặt thành false.
Đã tạo một gói SSIS với hai trình quản lý kết nối OLE DB, mỗi trình kết nối với Source và Destination cơ sở dữ liệu. Thiết kế Luồng điều khiển như hình dưới đây:
-
Execute SQL Taskthực thi câu lệnhTRUNCATE TABLE dbo.StagingTabledựa vào cơ sở dữ liệu đích để cắt ngắn các bảng dàn. -
Phần tiếp theo giải thích cách thực hiện
Data Flow Taskđược định cấu hình. -
Execute SQL Taskthực thi câu lệnh SQL đã cho bên dưới cập nhật dữ liệu trongdbo.DestinationTablesử dụng dữ liệu có sẵn trongdbo.StagingTable, giả sử rằng có một khóa duy nhất phù hợp giữa hai bảng đó. Trong trường hợp này, khóa duy nhất là cộtRowNumber.
Tập lệnh để cập nhật:
UPDATE D
SET D.CreatedOn = S.CreatedOn
, D.ModifiedOn = S.ModifiedOn
FROM dbo.DestinationTable D
INNER JOIN dbo.StagingTable S
ON D.RowNumber = S.RowNumber
Tôi đã thiết kế Nhiệm vụ Luồng Dữ liệu như được hiển thị bên dưới.
-
OLE DB Sourceđọc dữ liệu từdbo.SourceTablesử dụng lệnh SQLSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1 -
Lookup transformationđược sử dụng để kiểm tra xem giá trị RowNumber đã tồn tại trong bảngdbo.DestinationTablehay chưa -
Nếu bản ghi không tồn tại, nó sẽ được chuyển hướng đến
OLE DB Destinationđược đặt tên làInsert into destination table, sẽ chèn hàng vàodbo.DestinationTable -
Nếu bản ghi tồn tại , nó sẽ được chuyển hướng đến
OLE DB Destinationđược đặt tên làInsert into staging table, sẽ chèn hàng vàodbo.StagingTable. Dữ liệu này trong bảng dàn sẽ được sử dụng trong phần thứ hai `` Thực thi tác vụ SQL để thực hiện cập nhật hàng loạt.
Để kích hoạt thêm vài hàng cho Nguồn OLE DB, tôi đã chạy truy vấn bên dưới để kích hoạt một số bản ghi
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 1)
OR (RowNumber % 9 = 2)
Lần thực hiện đầu tiên của gói trông như hình dưới đây. Tất cả các hàng được chuyển hướng đến bảng đích vì nó trống. Quá trình thực thi gói trên máy của tôi mất khoảng 3 seconds .
Chạy lại truy vấn đếm hàng để tìm số hàng trong cả ba bảng.
Để kích hoạt thêm vài hàng cho Nguồn OLE DB, tôi đã chạy truy vấn bên dưới để kích hoạt một số bản ghi
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 3)
OR (RowNumber % 9 = 5)
OR (RowNumber % 9 = 6)
OR (RowNumber % 9 = 7)
Lần thực thi thứ hai của gói trông như hình dưới đây. 314,268 rows đã được chèn trước đó trong lần thực thi đầu tiên được chuyển hướng đến bảng dàn. 628,766 new rows đã được chèn trực tiếp vào bảng đích. Quá trình thực thi gói trên máy của tôi mất khoảng 12 seconds . 314,268 rows trong bảng đích đã được cập nhật trong Tác vụ SQL Thực thi thứ hai với dữ liệu bằng cách sử dụng bảng dàn.
Chạy lại truy vấn đếm hàng để tìm số hàng trong cả ba bảng.
Tôi hy vọng điều đó cung cấp cho bạn ý tưởng để triển khai giải pháp của mình.