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 Command
sẽ 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 Task
thực thi câu lệnhTRUNCATE TABLE dbo.StagingTable
dự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 Task
thực thi câu lệnh SQL đã cho bên dưới cập nhật dữ liệu trongdbo.DestinationTable
sử 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.SourceTable
sử 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.DestinationTable
hay 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.