我试图在没有任何Ab Initio培训或文档的情况下设计Ab Initio加载过程。是的,我知道。 设计决策是:对于传入的数据文件,将有插入和更新。 我是否应该让Feed提供程序将它们分成数据文件(每晚大小为1-10 GB)并让Ab Initio单独插入和更新?
我看到的问题是,数据并不总是你期望的那样...... 并且可能已经存在Insert行(可能是清除失败或者Feed提供程序出错) 或者UPdate行不存在。
所以我想知道我是否应该只组合所有插入和更新......并使用Oracle Merge语句 (在将数据并行加载到当前没有索引的临时表之后)
但我不知道AbInitio是否支持Merge。
网上的ab initio教程或文档并不多...你能指引我做任何好事吗?
答案 0 :(得分:1)
您刚刚描述的解决方案(在临时表中插入和更新,然后合并主表中的内容)是可行的。
设计决策是:对于传入的数据文件,将有插入和更新。
我不知道这个决定的背景但你应该知道这个解决方案会导致更长的执行时间。为了执行插入和更新,您必须使用比更简单的“输出表”组件更慢的“更新表”组件。顺便说一句,不要同时使用相同的“更新表”组件进行插入和更新。使用单独的“更新表”进行插入,使用另一个进行更新(通过这种方式,您将体验到显着的性能提升)。 (如果您可以更改上述设计决策,请改用“输出表”。)
在任何一种情况下,将“更新表”/“输出表”组件设置为“永不中止”,这样,如果相同的插入语句出现两次或者没有更新条目,则图形不会失败。
最后,当完成所有插入和更新的处理时,应从“运行SQL”组件触发/执行“oracle merge”语句。使用阶段确保它以这种方式发生......
如果您打算构建具有并行执行的图形,请确保相同条目的insert和update语句将由相同的分区处理。 (使用最终表的主键作为“按键分区”组件中的键。)
如果您想了解杂乱输入中出现多少重复插入或错误更新,请使用相应“更新表”/“输出表”组件的“拒绝”(并最终“错误”)端口进一步处理。
答案 1 :(得分:0)
我当然不会依赖源系统来告诉我目标表中是否存在行。我的本能说要去并行,nologging(如果可能),压缩(如果可能)加载到临时表然后合并 - 如果Ab-Initio不支持Merge,那么希望它支持对PL / SQL的调用过程,或直接执行SQL语句。
如果这是大量数据,我也想在新的和当前数据集的连接键上安排散列分区。