使用批量操作插入或更新的 SSIS 2008 R2 示例包:
这是一个示例包SSIS 2008 R2
,说明了如何使用批处理操作在两个数据库之间执行插入、更新。
- 使用
OLE DB Command
会减慢包的更新操作,因为它不执行批处理操作。每行都单独更新。
该示例使用两个数据库,即Source
和Destination
。在我的示例中,两个数据库都驻留在服务器上,但逻辑仍然可以应用于驻留在不同服务器和位置的数据库。
dbo.SourceTable
我在我的源数据库中创建了一个名为的表Source
。
CREATE TABLE [dbo].[SourceTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
[IsActive] [bit] NULL
)
此外,在我的目标数据库中创建了两个名为dbo.DestinationTable
和的表。dbo.StagingTable
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
dbo.SourceTable
将表中具有唯一值的大约 140 万行插入到RowNumber
列中。桌子dbo.DestinationTable
一dbo.StagingTable
开始都是空的。表中的所有行都dbo.SourceTable
将标志IsActive
设置为 false。
创建了一个带有两个 OLE DB 连接管理器的 SSIS 包,每个连接管理器都连接到Source
数据库Destination
。设计控制流程如下图:
首先对目标数据库Execute SQL Task
执行语句TRUNCATE TABLE dbo.StagingTable
以截断登台表。
下一节将解释如何Data Flow Task
配置。
SecondExecute SQL Task
执行下面给定的 SQL 语句,该语句dbo.DestinationTable
使用 中可用的数据更新数据dbo.StagingTable
,假设这两个表之间存在匹配的唯一键。在这种情况下,唯一键是 column RowNumber
。
更新脚本:
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
我设计了如下所示的数据流任务。
OLE DB Source
dbo.SourceTable
使用 SQL 命令读取数据SELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1
Lookup transformation
用于检查表中是否已经存在 RowNumber 值dbo.DestinationTable
如果记录不存在,它将被重定向到OLE DB Destination
命名为 as Insert into destination table
,它将行插入到dbo.DestinationTable
如果记录存在,它将被重定向到OLE DB Destination
命名为Insert into staging table
,它将行插入到dbo.StagingTable
. 暂存表中的这些数据将用于第二个`Execute SQL Task 执行批量更新。
为了激活 OLE DB Source 的更多行,我运行了以下查询来激活一些记录
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 1)
OR (RowNumber % 9 = 2)
包的第一次执行如下所示。所有行都被定向到目标表,因为它是空的。在我的机器上执行包大约需要3 seconds
.
再次运行行计数查询以查找所有三个表中的行计数。
为了激活 OLE DB Source 的更多行,我运行了以下查询来激活一些记录
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 3)
OR (RowNumber % 9 = 5)
OR (RowNumber % 9 = 6)
OR (RowNumber % 9 = 7)
包的第二次执行如下所示。314,268 rows
之前在第一次执行期间插入的内容被重定向到临时表。628,766 new rows
直接插入到目标表中。在我的机器上执行包大约需要12 seconds
. 314,268 rows
在第二个执行 SQL 任务中使用临时表更新了目标表中的数据。
再次运行行计数查询以查找所有三个表中的行计数。
我希望这能给你一个想法来实施你的解决方案。