2013-05-22 64 views
1

我试图设计一个Ab Initio加载过程,没有任何Ab Initio培训或文档。是的,我知道。 一个设计决定是:对于传入的数据文件,将会有插入和更新。 我应该让供应商将它们分成数据文件(每晚1到10 GB),并让Ab Initio分别插入和更新?Ab Initio是否支持Oracle Merge语句?

我与看到的一个问题,是数据总不是你希望它是... 什么和插入的行可能已经存在(也许是清除失败或饲料供应商犯了一个错误) 或更新行心不是现在。

所以我不知道我是否应该只是将所有插入和更新...并使用Oracle MERGE语句 (并行装载后的数据到一个临时表中,没有当然的指数)

但我不不知道AbInitio是否支持合并。

从头开始的教程或文档在网上没有太多...你能指导我什么好的?

回答

0

我肯定不会依赖源系统来告诉我在目标表中是否存在行。我的直觉说要去并行,不可能(如果可能的话)压缩(如果可能的话)加载到临时表中,然后进行合并 - 如果Ab-Initio不支持合并,那么希望它支持调用PL/SQL过程或直接执行SQL语句。

如果这是一个大量的数据,我想为新数据集和当前数据集的连接键安排散列分区。

+0

你能解释分区表的优点吗? (我不是DBA)我很担心合并步骤的影响。它将合并到正在进行在线流量的表格中。 –

1

您刚刚描述的解决方案(在临时表中插入并更新,然后合并主表中的内容)是可行的。

一个设计决定是:对于传入的数据文件会有插入和更新。

我不知道这个决定的背景,但你应该知道这个解决方案会导致更长的执行时间。为了执行插入和更新,您必须使用比简单的“输出表”组件更慢的“更新表”组件。顺便说一下,不要同时使用相同的“更新表”组件来插入和更新。为插入使用单独的“更新表”,而另一个用于更新(您将以这种方式体验戏剧性的性能提升)。 (如果您可以更改上述设计决策,请改为使用“输出表”)

在任一情况下,将“更新表”/“输出表”组件设置为“永不中止”,以便您的图赢得'如果相同的插入语句出现两次或者没有条目进行更新,则失败。

最后,在完成所有插入和更新的处理时,应该从“运行SQL”组件触发/执行“oracle merge”语句。使用阶段确保它以这种方式发生...

如果您打算构建并行执行的图形,请确保相同条目的插入和更新语句将由相同的分区处理。 (使用最终表的主键作为“按键分区”组件中的键。)

如果您想概述在您的杂乱输入中出现多少重复插入或错误更新,请使用相应“更新表”/“输出表”的“拒绝”(最终为“错误”)端口“组件进一步处理。