Oracle SQL Update查询需要数天才能更新

时间:2010-06-01 05:24:17

标签: sql oracle sql-update

我正在尝试根据来自源的记录更新目标表中的记录。例如,如果传入记录存在于目标表中,我会在目标中更新它们,否则我只需插入。我的源中有超过一百万条记录,而我的目标有4600万条记录。目标表基于日历键进行分区。我使用Informatica实现了这整个逻辑。我发现Informatica代码完全可以很好地查看Informatica会话日志,但它在更新中需要很长时间(更新一百万条记录的时间超过5天)。

有关在场景中可以采取哪些措施以提高性能的任何建议?

2 个答案:

答案 0 :(得分:7)

你可以试试这个

  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 );

语法起初看起来有点令人生畏,但如果我们从上到下阅读,那就非常直观了。请注意以下条款:

•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记录当前没有匹配的记录。

答案 1 :(得分:0)

我不确定这是如何适用于您的项目的,因为您可能需要进行大量更改。由于您要处理数百万条记录,我建议您批量处理。您可以使用SQL Loader实用程序。但这取决于来源的格式。如果它是一个文件(例如csv文件),那么它是正确的选择。