SSIS 增量加载 – 更好的方法

在本文中,我们将通过示例向您展示配置 SSIS 增量加载的更好方法。我们已经在之前的案例中解释了增量加载,但我们使用了 OLE DB 命令转换来更新目标表中的记录。虽然这种方法适用于少量数据,但对于大型数据集,会存在性能问题。

在本例中,我们将向您展示配置 SSIS 增量加载的步骤。在开始创建包之前,让我们先看看源数据。

Incremental Load Source

现在让我们也看看目标表中的数据。

Incremental Load Target

我们的任务是将额外的 4 条记录加载到目标表中,并更新第 2、5、10 行中存在的数据。

配置 SSIS 增量加载

OLE DB 命令转换以逐行方式执行更新,这非常耗时。在本例中,我们将创建一个临时表或暂存表来存储更新的信息,然后通过执行 SQL 任务将这些记录传递到目标表。

步骤 1:将“数据流任务”和两个执行 SQL 任务从工具箱拖放到控制流区域,并将第一个执行任务重命名为“创建暂存表”,数据流任务重命名为“SSIS 增量加载”,最后一个任务重命名为“更新目标表”。

  • 创建暂存表:这可以是一个全局临时表或任何用于存储更新信息的永久表。每次包运行时,现有表都会被删除并重新创建。请记住,您也可以使用 TRUNCATE 语句来截断表,而不是删除和重新创建。
  • 数据流任务:将数据从源加载到目标
  • 更新目标表:使用暂存表中的数据更新目标表数据
SSIS Incremental Load 1

步骤 2:双击“执行 SQL 任务”将打开任务编辑器。在这里,我们将在目标数据库上创建暂存表,因此我们选择了指向数据库的已创建 OLE DB 连接管理器。请点击“SQL 语句”属性旁边的浏览按钮来编写自定义 SQL 语句。

SSIS Incremental Load 2

我们在上面截图中使用的 SQL 命令是

-- DROPPING EXISTING TABLE
IF OBJECT_ID('CDC_Staging', 'U') IS NOT NULL
   DROP TABLE  CDC_Staging;

-- CREATING NEW TABLE
CREATE TABLE CDC_Staging
(
 [Employee_ID] [int] PRIMARY KEY NOT NULL,
 [FirstName] [nvarchar](255) NULL,
 [LastName] [nvarchar](255) NULL,
 [Education] [nvarchar](255) NULL,
 [Occupation] [nvarchar](255) NULL,
 [YearlyIncome] [float] NULL,
 [Sales] [float] NULL
);

点击“确定”完成暂存表的创建。

SSIS Incremental Load 3

接下来,双击“数据流任务”以打开数据流选项卡。

步骤 3:将 OLE DB 源从工具箱拖放到数据流区域。双击数据流区域中的 OLE DB 源将打开 OLE DB 连接管理器设置。从下方,您可以观察到我们已选择以下数据库作为源数据库,选择 [CDC Source] 作为源表。

SSIS Incremental Load 2

步骤 4:点击“列”选项卡以验证列。您可以取消选中不需要的列(如果有)。

SSIS Incremental Load 3

点击“确定”关闭 OLE DB 源,然后拖放查找转换

SSIS Incremental Load 4

步骤 5:双击“查找转换”将打开“查找转换编辑器”以配置查找表(引用表)。在“常规”选项卡下,“指定如何处理不匹配的行”部分,将默认的“失败组件”更改为“忽略失败”选项。

提示:请参考查找文章来理解存在的属性,参考查找转换文章来理解配置设置。

SSIS Incremental Load 5

步骤 6:点击“连接”选项卡以配置查找连接设置。如果您已创建 OLE DB 连接管理器,则从列表中选择;否则,点击“新建”按钮并进行设置。这里我们选择了指向数据库的现有连接。

接下来,我们将使用 SQL 查询作为查找表,因为我们只需要一个列进行查找(即 Employee_ID),因此我们使用如下所示的查询。

SSIS Incremental Load 6

步骤 7:点击“可用输入列”,然后将所需的列拖放到可用的查找列上,以在两个数据集之间创建连接。源数据中的 Employee_ID 列将与查找表(即目标表)中的 [Employee_ID] 列进行匹配。

SSIS Incremental Load 7

步骤 8:拖放条件拆分转换,并将“查找匹配输出”作为源连接到条件拆分。

SSIS Incremental Load 8

步骤 9:双击它以提供条件。在此 SSIS 增量加载示例中使用的条件是 ISNULL (LKP_Employee_ID)。这意味着条件拆分会验证查找的 Employee ID 是否为 Null。

  • 如果 LKP_Employee_ID 为 Null,则表示目标表中不存在该记录,因此我们希望插入新记录。
  • 如果 LKP_Employee_ID 不为 Null,则表示目标表中已存在该记录,因此我们希望使用新数据更新现有数据。

从下方的图像可以看到,我们在“条件拆分转换”中使用了 1 个条件和 1 个默认输出。因此,我们总共得到两个输出。

SSIS Incremental Load 9

步骤 10:将两个 OLE DB 目标拖放到数据流区域,然后将输出箭头拖到新的 OLE DB 目标。会出现一个名为“输入输出选择”的弹出窗口,帮助您选择输入输出类型:INSERT 或 UPDATE。

SSIS Incremental Load 10

步骤 11:双击第一个 OLE DB 目标将打开 OLE DB 目标编辑器。选择 OLE DB 连接管理器,并选择数据库中存在的 [CDC Target] 表以插入新记录。

SSIS Incremental Load 11

步骤 12:点击“映射”选项卡以验证源列是否正确映射到目标列。如果您观察到下面的图像,我们没有为 Employee_ID 列进行映射,因为它是自动递增的标识列。

SSIS Incremental Load 12

步骤 13:双击第二个 OLE DB 目标将打开 OLE DB 目标编辑器。选择 OLE DB 连接管理器,并选择数据库中存在的 [CDC_Staging] 表。

提示:如果找不到表,请单独运行第一个执行 SQL 任务来创建它。

CDC Staging Table

步骤 14:重复步骤 12。

SSIS Incremental Load 15

在进入控制流选项卡之前,请将“验证外部元数据”从 TRUE 改为 FALSE,因为我们是在运行时(运行时)动态创建暂存表。

SetValidate External Metadata from TRUE to False

步骤 15:在控制流中,双击第二个执行 SQL 任务以打开任务编辑器。在这里,我们正在使用暂存表数据更新 [CDC Target] 数据。因此,我们选择了指向数据库的已创建 OLE DB 连接管理器。请点击“SQL 语句”属性旁边的浏览按钮来编写自定义语句。

SSIS Incremental Load 16

为了更新记录,我们在上述 SSIS 增量加载屏幕截图中使用的 SQL 命令是:

UPDATE [dbo].[CDC Target]
   SET [FirstName] = Staging.[FirstName]
      ,[LastName] = Staging.[LastName]
      ,[Education] = Staging.[Education]
      ,[Occupation] = Staging.[Occupation]
      ,[YearlyIncome] = Staging.[YearlyIncome]
      ,[Sales] = Staging.[Sales]
FROM [CDC Target]
   INNER JOIN
     [CDC_Staging] AS Staging 
	 ON [CDC Target].Employee_ID = Staging.Employee_ID

点击“确定”完成 SSIS 增量加载包的配置。让我们运行该包。

SSIS Incremental Load 18

让我们打开 SQL Server 管理工作室,检查我们是否使用 SSIS 增量加载(带暂存表)插入了新记录并更新了旧记录。

CDC Target

评论已关闭。