我目前面临一个在两个表之间执行 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 行。
我目前面临一个 Oracle 存储过程的性能问题,该存储过程在两个表之间执行
操作。此过程的目的是将更改从一个表存档到另一个表,但需要相当长的时间才能完成。MERGE
您尝试修改的表可能已被另一个会话修改,但该会话尚未发出
COMMIT
或 ROLLBACK
,因此表/行被锁定,而另一个会话正在等待锁定被释放。
尝试运行该过程,如果代码“永远”等待,则转到您正在使用的任何其他客户端(即 SQL Developer、SQL*Plus 等或您拥有的具有未提交数据的打开会话的任何工具)并运行
COMMIT
(或ROLLBACK
)命令并查看该过程是否突然完成。如果是,那么它正在等待表/行上的锁被释放。
如果您不知道哪个会话锁定了该行,那么您可以尝试关闭其他所有内容,当连接关闭时,它将隐式
ROLLBACK
任何更改。如果这仍然不起作用,那么您可以尝试终止连接到数据库的所有非活动会话(首先询问您的同事,这样您就不会杀死某人正在积极使用的东西)。