SSIS - 数据库字段级别的批量更新

时间:2010-03-17 15:28:24

标签: ssis bulk

这是我们的使命:

  • 从客户端接收文件。每个文件包含1到1,000,000条记录。
  • 将记录加载到暂存区域并应用业务规则验证。
  • 然后以批处理方式将有效记录泵入OLTP数据库,并遵循以下规则:
    • 如果记录不存在(我们有密钥,所以这不是问题),请创建它。
    • 如果记录存在,可以选择更新每个数据库字段。该决定是基于3个因素之一做出的......我认为这些因素并不重要。

我们的主要问题是找到一种在字段级别可选地更新数据的有效方法。这适用于大约12个不同的数据库表,每个表中有10到150个字段(原始数据库设计有很多不足之处,但它就是这样)。

我们的第一次尝试是引入一个镜像临时环境的表(每个系统字段的分段中的一个字段)并包含一个屏蔽标志。掩蔽标志的值代表3个因子。

然后我们将更新类似于......

UPDATE OLTPTable1 SET Field1 = CASE 
  WHEN Mask.Field1 = 0 THEN Staging.Field1
  WHEN Mask.Field1 = 1 THEN COALESCE( Staging.Field1 , OLTPTable1.Field1 )
  WHEN Mask.Field1 = 2 THEN COALESCE( OLTPTable1.Field1 , Staging.Field1 )
...

你可以想象,表现相当可怕。

有没有人处理类似的要求?

我们是一家MS商店,使用Windows服务启动处理数据处理的SSIS包。不幸的是,我们在这方面几乎都是新手。

3 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server 2008,请查看MERGE语句,这可能适合您的Upsert需求。

您是否可以使用条件拆分将输入发送到不同的处理阶段,具体取决于匹配的因素?听起来你可能需要为12个表中的每个表执行此操作,但可能您可以并行执行其中一些操作。

答案 1 :(得分:0)

我看了一下合并工具,但我不确定它是否允许根据预定义的规则集灵活地指出哪个数据源优先。

此功能对于允许多个成员使用可能有不同需求的流程的系统至关重要。

根据我的阅读,Merge函数更像是一个排序联合。

答案 2 :(得分:0)

我们使用类似于您在我们的产品中描述的方法来进行外部系统输入。 (我们处理了几百个目标表,最多240列)就像你描述的那样,有一百到一百万或更多行。

通常,我们不会尝试设置单个批量更新,我们尝试一次处理一个列的值。鉴于它们都是表示相同数据元素的单一类型,staging UPDATE语句很简单。我们通常会为映射值创建临时表,这是一个简单的

UPDATE target SET target.column = mapping.resultcolumn WHERE target.sourcecolumn = mapping.sourcecolumn.

设置映射有点牵扯,但我们在执行此操作时一次只处理一列。

我不知道你如何定义'可怕的'。对我们来说,这个过程一般是在一夜之间以批处理模式完成的,所以绝对性能几乎不是问题。

修改 我们也在可配置大小的批次中执行这些操作,因此工作集和& COMMIT绝不是巨大的。我们的默认值是一批1000行,但某些特定情况已从多达40 000行批次中受益。我们还为特定表的工作数据添加索引。