Oracle SQL 更新查询需要几天时间才能更新

Posted

技术标签:

【中文标题】Oracle SQL 更新查询需要几天时间才能更新【英文标题】:Oracle SQL Update query takes days to update 【发布时间】:2010-06-01 05:24:17 【问题描述】:

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

关于可以在场景中做些什么来提高性能的任何建议?

【问题讨论】:

为了节省其他做数学的人,五天内一百万大约是每分钟 140 或每秒 2。 解释计划说什么?你能发表声明吗? 【参考方案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 );

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

•MERGE(第 1 行):如前所述,这是 Oracle 中的第 4 条 DML 语句。我们可能希望添加的任何提示都直接跟在这个关键字后面(即 MERGE /*+ HINT */);

•INTO(第 2 行):这是我们为 MERGE 指定目标的方式。目标必须是表或可更新视图(此处不能使用内嵌视图);

•USING(第 3 行):USING 子句表示 MERGE 的源数据集。这可以是单个表(如我们的示例)或内联视图;

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

•WHEN MATCHED(第 5 行):当我们在目标表中已经有匹配的记录(即源数据集和目标数据集之间存在连接)时,该子句是我们指示 Oracle 做什么的地方。在这种情况下,我们显然想要一个 UPDATE 。此子句的限制之一是我们不能更新 ON 子句中使用的任何列(当然我们不需要,因为它们已经匹配)。任何包含连接列的尝试都会引发不直观的无效标识符异常;和

•WHEN NOT MATCHED(第 10 行):此子句用于插入当前没有匹配的记录。

【讨论】:

投了赞成票。您不希望逐行进行这种规模的更新,或者从数据库中提取数百万条记录并将它们推回(尤其是通过网络)。将逻辑推送到数据库中。【参考方案2】:

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

【讨论】:

以上是关于Oracle SQL 更新查询需要几天时间才能更新的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 10g 中更新查询需要很长时间

SQL查询优化更新

在 VPS 主机中更新 PHP 版本

使用索引进行 Oracle Sql 调优

oracle 有记录就更新没有添加问题

具有更改查询的 Oracle SQL Tuning Advisor