我有一个表(在oracle中)大小约8.6亿条记录(850gb),我们得到大约2-3万条记录作为源(flatfile)。 如果记录已经存在,我们正在对目标进行查找,如果它是要插入的新记录(scd1),它将更新。 我们使用的转换是unconnectedlookup,sorter,filter和router,更新策略转换,它一直很好,但随着表格庞大而且变得越来越大,它需要永远插入和更新,昨晚需要19小时到240万条记录(210万条是新的,所以插入,其余的是更新)。 今天我有大约190万人通过我不确定需要多长时间才能得到任何建议或帮助我们如何处理这个?
答案 0 :(得分:0)
1)在主键上进行SQ匹配并过滤掉空值(Oracle表中缺少的记录)或非空(更新)之后,只使用连接的查找到oracle表。不要检查其他列以进行更新。跳过分拣机和过滤器。只需使用更新策略。
2)或者使用joiner并将平面文件管道作为主文件。然后检查空值以查找insert
或updates
。
3)检查你的目标表是否没有任何触发器等。如果是,则检查其逻辑并在ETL中实现它。
答案 1 :(得分:0)
您有多少次插入与更新?
Update else Insert
目标
属性。 答案 2 :(得分:0)
由于您正在处理850mil数据,因此您有两个主要瓶颈 - 目标查找和写入目标。 你可以想到这个策略 -
此致 科希克
答案 3 :(得分:0)
1)如果源和目标位于同一个数据库中,请尝试使用merge语句。
2)我们也可以使用sql loader连接来提高性能。
答案 4 :(得分:0)
显然,瓶颈在于目标查找和目标加载(更新具体)。
请尝试以下操作来调整现有代码:
1)如果您在查找转换中,请尝试删除任何不需要的查找端口。只保留查找条件中使用的字段,只是为了检查记录是否存在。
2)尝试为目标表添加索引,以获取用于更新的字段
3)将会话的提交间隔增加到更高的值。
4)部分下推优化:
您可以将一些处理下推到数据库,这可能会更快,而不是在Informatica中执行此操作
创建一个临时表来保存该负载的传入数据。
创建映射以将传入文件加载到登台表。在加载开始之前截断它以清除上一次运行的记录。
在现有映射的SQL覆盖中,在登台表和目标表之间执行左连接以查找插入/更新。这将比Informatica查找更快,并消除了构建Informatica查找缓存所需的时间。
5)使用MD5消除不需要的更新
要使用MD5,您需要在目标表中添加一个新字段并进行映射以更新现有记录。
然后在现有映射中添加一个步骤来计算传入列的MD5。
如果识别出记录的更新,则检查为传入列计算的MD5是否与目标列的MD5相同。如果校验和也匹配,则不要更新记录。仅当校验和不同时才更新记录。通过这种方式,您将过滤掉不需要的更新。如果没有查找匹配,则插入记录。
优势:您正在减少不需要的更新。
缺点:您必须执行一次性过程才能为表格中的现有记录填充MD5值。
如果这都不起作用,请与您的数据库管理员联系,以确定数据库端是否存在任何可能减慢负载的问题。