我正在运行一个PL/SQL脚本,它主要作用于文件F41021(最重的文件之一),我想找到一种方法来忽略应用程序或其他会话的任何锁定,这可能会减慢运行速度,因为要更新的项目数量非常高,更新背后需要逻辑。
我使用一个简单的合并结构。下面是一个伪代码:
DECLARE
{Variables};
BEGIN
FOR T IN ({Subquery}) LOOP
INSERT INTO Table_Temp
SELECT {Extensive calculation} FROM {Many Tables};
MERGE INTO Table_1
USING (SELECT * FROM Table_Temp WHERE {Conditions for Table_Temp})
ON ({Pivoting Fields})
WHEN MATCHED THEN UPDATE
SET {Updatable Fields};
END LOOP;
END;
/
我预见的问题是,如果任何一行中存在锁,SQL将等待该锁被提交:由卡住的进程引起的锁将是一场噩梦。由于项目数量太多,我无法等待或监视锁定的会话。
我不知道如何添加FOR UPDATE SKIP LOCKED。同时,我正在寻找一些本身不会严重影响性能的东西(例如,子查询的UPDATE太慢)。我既不能让PL/SQL由于一个坏记录而中断:我们需要更新可以更新的内容&稍后处理剩余的项目,这意味着用EXCEPTION或错误来破坏SQL不会有帮助,因为这将迫使我们重新开始运行。
有没有一种方法可以让MERGE语句检测任何锁并忽略它而不是等待它被释放?可能是SQL提示?
1条答案
按热度按时间hts6caw31#
我认为您应该首先从Table_1中选择where {that_where_condition_for_update}进行更新nowait,并处理遇到锁定行时引发的异常。并且只有在没有找到锁定的行时才运行merge语句。尽管如此,merge语句仍然有一些东西,它不仅锁定受更新(或删除,视情况而定)影响的行。因此,我认为如果您能够完全避免合并,并进行更新和插入,那将更好。