0

这是我们的使命:

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

我们的主要问题是找到一种在字段级别选择性地更新数据的有效方法。这适用于大约 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 包。不幸的是,我们在这方面几乎是新手。

4

3 回答 3

0

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

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

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

设置映射有点复杂,但我们在执行此操作时再次处理一列。

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

编辑: 我们也在可配置大小的批次中执行这些操作,因此工作集和提交永远不会很大。我们的默认值是批处理 1000 行,但某些特定情况受益于多达 40 000 行批处理。我们还为特定表的工作数据添加索引。

于 2010-03-22T19:06:59.287 回答
0

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

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

于 2010-03-17T15:32:50.797 回答
0

我查看了合并工具,但我不确定它是否可以灵活地根据一组预定义的规则来指示哪个数据源优先。

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

从我读过的内容来看,合并功能更像是一个排序联合。

于 2010-03-22T18:45:44.530 回答