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

Làm cách nào để tối ưu hóa hoạt động Nâng cấp (Cập nhật và Chèn) trong gói SSIS?

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 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 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 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 SourceDestination 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ệnh TRUNCATE 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 trong dbo.DestinationTable sử dụng dữ liệu có sẵn trong dbo.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ột RowNumber .

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 SQL SELECT 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ảng dbo.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ào dbo.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ào dbo.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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi ‘datetimeoffset’ thành ‘datetime2’ trong SQL Server (Ví dụ T-SQL)

  2. Khi nào tôi nên sử dụng ĐĂNG KÝ CHÉO qua THAM GIA INNER?

  3. Có .NET tương đương với newsequentialid () của SQL Server không

  4. Làm thế nào bạn có thể đặt tên cho các Bảng của Tập dữ liệu mà bạn trả về trong một chương trình đã lưu trữ?

  5. SQL Server Parallel Backup Restore -2