Oracle 中 MERGE 过程的性能问题 - 错误的查询?

问题描述 投票:0回答:1

我目前面临一个在两个表之间执行 MERGE 操作的 Oracle 存储过程的性能问题。此过程的目的是将更改从一个表存档到另一个表,但需要相当长的时间才能完成。

我有两个表:第一个表会定期被覆盖,我想创建一个新表来检测更改并将其存档。

我该怎么做?

任何帮助将不胜感激。

谢谢

我已经尝试过,但需要很长时间,

CREATE OR REPLACE PROCEDURE ArchiveData AS
BEGIN
  MERGE INTO target_table t
  USING source_table s ON (t.key1 = s.key1 AND t.date = s.date AND t.type = s.type AND t.component = s.component)
    WHEN NOT MATCHED THEN
    INSERT (
      t.field1,
      t.key1,
      t.date,
      t.type,
      t.component,
   
    ) VALUES (
      s.field1,
      s.key1,
      s.date,
      s.type,
      s.component,
   
    );
END ArchiveData;

我等了大约 2 个小时,它仍在运行,即使涉及的表只有 5k 行。

sql oracle performance merge
1个回答
0
投票

我目前面临一个 Oracle 存储过程的性能问题,该存储过程在两个表之间执行

MERGE
操作。此过程的目的是将更改从一个表存档到另一个表,但需要相当长的时间才能完成。

您尝试修改的表可能已被另一个会话修改,但该会话尚未发出

COMMIT
ROLLBACK
,因此表/行被锁定,而另一个会话正在等待锁定被释放。

尝试运行该过程,如果代码“永远”等待,则转到您正在使用的任何其他客户端(即 SQL Developer、SQL*Plus 等或您拥有的具有未提交数据的打开会话的任何工具)并运行

COMMIT
(或
ROLLBACK
)命令并查看该过程是否突然完成。如果是,那么它正在等待表/行上的锁被释放。

如果您不知道哪个会话锁定了该行,那么您可以尝试关闭其他所有内容,当连接关闭时,它将隐式

ROLLBACK
任何更改。如果这仍然不起作用,那么您可以尝试终止连接到数据库的所有非活动会话(首先询问您的同事,这样您就不会杀死某人正在积极使用的东西)。

© www.soinside.com 2019 - 2024. All rights reserved.