我试图根据来自源的记录更新目标表中的记录.例如,如果传入记录存在于目标表中,我会在目标中更新它们,否则我只需插入.我的源中有超过一百万条记录,而我的目标有4600万条记录.目标表基于日历键进行分区.我使用Informatica实现了这整个逻辑.我发现Informatica代码完全可以很好地查看Informatica会话日志,但它在更新中需要很长时间(更新一百万条记录超过5天).
有关在场景中可以采取哪些措施来改善性能的任何建议?
你可以试试这个
1 MERGE
2 INTO target_table tgt
3 USING source_table src
4 ON ( src.object_id = tgt.object_id )
5 WHEN MATCHED
6 THEN
7 UPDATE
8 SET tgt.object_name = src.object_name
9 , tgt.object_type = src.object_type
10 WHEN NOT MATCHED
11 THEN
12 INSERT ( tgt.object_id
13 , tgt.object_name
14 , tgt.object_type )
15 VALUES ( src.object_id
16 , src.object_name
17 , src.object_type );
Run Code Online (Sandbox Code Playgroud)
语法起初看起来有点令人生畏,但如果我们从上到下阅读,那就很直观了.请注意以下条款:
•MERGE(第1行):如前所述,这是Oracle中的第4个DML语句.我们可能希望直接添加的任何提示都遵循此关键字(即MERGE/*+ HINT*/);
•INTO(第2行):这是我们为MERGE指定目标的方式.目标必须是表或可更新视图(此处不能使用内嵌视图);
•USING(第3行):USING子句表示MERGE的源数据集.这可以是单个表(如我们的示例中所示)或内联视图;
•ON()(第4行):ON子句是我们提供源数据集和目标表之间的连接的地方.请注意,连接条件必须在括号中;
•WHEN MATCHED(5号线):该条款是我们指示Oracle在做什么的时候,我们已经有了目标表匹配的记录(即有源和目标数据集之间的连接).在这种情况下,我们显然想要更新.这个子句的一个限制是我们不能更新ON子句中使用的任何列(当然我们不需要它们已经匹配).任何包含连接列的尝试都会引发不直观的无效标识符异常; 和
•WHEN NOT MATCHED(第10行):此子句是我们INSERT记录的当前匹配项.
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |