Informatica 9.5.1,巨大的表(scd1)

时间:2016-05-25 17:48:20

标签: oracle oracle11g oracle10g informatica informatica-powercenter

我有一个表(在oracle中)大小约8.6亿条记录(850gb),我们得到大约2-3万条记录作为源(flatfile)。 如果记录已经存在,我们正在对目标进行查找,如果它是要插入的新记录(scd1),它将更新。 我们使用的转换是unconnectedlookup,sorter,filter和router,更新策略转换,它一直很好,但随着表格庞大而且变得越来越大,它需要永远插入和更新,昨晚需要19小时到240万条记录(210万条是新的,所以插入,其余的是更新)。 今天我有大约190万人通过我不确定需要多长时间才能得到任何建议或帮助我们如何处理这个?

5 个答案:

答案 0 :(得分:0)

1)在主键上进行SQ匹配并过滤掉空值(Oracle表中缺少的记录)或非空(更新)之后,只使用连接的查找到oracle表。不要检查其他列以进行更新。跳过分拣机和过滤器。只需使用更新策略。

2)或者使用joiner并将平面文件管道作为主文件。然后检查空值以查找insertupdates

3)检查你的目标表是否没有任何触发器等。如果是,则检查其逻辑并在ETL中实现它。

答案 1 :(得分:0)

您有多少次插入与更新?

  • 只需更新几次,请尝试使用Update else Insert目标 属性。
  • 如果有许多更新和少量插入,请执行更新 只要找到钥匙,而不检查是否有任何改变
  • 如果有许多源行与您已有的源行匹配(即不会更改任何内容的更新),请尝试消除它们。但是不要比较所有列 - 而是使用哈希。只需创建一个额外的计算列,其中包含在所有列上计算的MD5。然后,您需要做的就是比较一列而不是全部来检测更改。

答案 2 :(得分:0)

由于您正在处理850mil数据,因此您有两个主要瓶颈 - 目标查找和写入目标。 你可以想到这个策略 -

  • 映射1 - 创建新映射以将平面文件数据加载到临时表TMP1中。
  • 映射2 - 修改现有映射。只需修改查询查询并在SQL Override中加入TMP1和target(860mil)表。这将减少时间,I / O,查找缓存。 另外,请确保您在目标中的键列上有索引。并且你在加载时删除 - 创建所有其他索引。跳过分拣机将有所帮助,但添加木匠将无济于事。

此致 科希克

答案 3 :(得分:0)

1)如果源和目标位于同一个数据库中,请尝试使用merge语句。

2)我们也可以使用sql loader连接来提高性能。

答案 4 :(得分:0)

显然,瓶颈在于目标查找和目标加载(更新具体)。

请尝试以下操作来调整现有代码:

1)如果您在查找转换中,请尝试删除任何不需要的查找端口。只保留查找条件中使用的字段,只是为了检查记录是否存在。

2)尝试为目标表添加索引,以获取用于更新的字段

3)将会话的提交间隔增加到更高的值。

4)部分下推优化:

您可以将一些处理下推到数据库,这可能会更快,而不是在Informatica中执行此操作

  • 创建一个临时表来保存该负载的传入数据。

  • 创建映射以将传入文件加载到登台表。在加载开始之前截断它以清除上一次运行的记录。

  • 在现有映射的SQL覆盖中,在登台表和目标表之间执行左连接以查找插入/更新。这将比Informatica查找更快,并消除了构建Informatica查找缓存所需的时间。

5)使用MD5消除不需要的更新

  • 要使用MD5,您需要在目标表中添加一个新字段并进行映射以更新现有记录。

  • 然后在现有映射中添加一个步骤来计算传入列的MD5。

  • 如果识别出记录的更新,则检查为传入列计算的MD5是否与目标列的MD5相同。如果校验和也匹配,则不要更新记录。仅当校验和不同时才更新记录。通过这种方式,您将过滤掉不需要的更新。如果没有查找匹配,则插入记录。

    优势:您正在减少不需要的更新。

    缺点:您必须执行一次性过程才能为表格中的现有记录填充MD5值。

如果这都不起作用,请与您的数据库管理员联系,以确定数据库端是否存在任何可能减慢负载的问题。