甲骨文的SQL更新查询需要花费数天更新(Oracle SQL Update query takes

2019-10-22 13:00发布

我试图更新基于来自source在记录目标表中的记录。 举例来说,如果输入的记录出现在目标表我会在目标更新它们否则我会简单地插入。 我有超过一百万条记录在我的源代码,而我的目标有46万条记录。 目标表是基于日历的关键分区。 我使用Informatica实现这个整个逻辑。 我发现,Informatica的代码是完全没有看Informatica的会话日志,但其在更新需要花费较长时间(超过5天更新一百万条记录)。

至于什么任何建议可以在场景中进行,以提高性能?

Answer 1:

你可以试试这个

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

起初的语法看起来有点吓人,但如果我们通读从上到下,这是很直观的。 请注意以下条款:

•合并(1号线):如前所述,这是目前在甲骨文第四DML语句。 任何提示,我们不妨直接添加按照这个关键字(即合并/ * + * HINT /);

•INTO(2号线):这是我们如何确定目标的融合。 目标必须是一个表或一个可更新视图(直列视图不能在此处使用);

•使用(第3行):USING子句表示用于MERGE源数据集。 这可以是一个单一的表(如在我们的例子),或者直列图。

•ON()(行4):ON子句是我们提供源数据集和目标表之间的连接。 请注意,连接条件必须是在括号中;

•WHEN MATCHED(5号线):该条款是我们指示Oracle在做什么的时候,我们已经有了目标表匹配的记录(即有源和目标数据集之间的连接)。 显然,我们想在这种情况下,一个UPDATE。 一个本条款的限制,是因为我们不能更新任何ON子句中使用(当然,我们并不需要,因为他们已经匹配)列。 任何企图包括连接列将引发一个直观无效的标识符除外; 和

•不匹配的(10号线):该条款是我们插入一张没有电流的匹配记录。



Answer 2:

我不知道这是怎么适用于您的项目,因为你可能需要改变很多。 既然你是在处理数百万条记录,我会建议一个批处理作业。 您可以使用SQL Loader实用程序。 但是,这取决于源的格式。 如果它是一个文件(如CSV文件),这是正确的选择。



文章来源: Oracle SQL Update query takes days to update