为什么oracle 隐式游游标+rowid进行存储过程批量更新慢,造成锁表,单独在sql窗体中执行秒过 10

问题:1.存储过程在执行时,A表长时间被锁。已确定无任何程式使用A表。2.存储过程执行时间非常长。达到半小时以上。但是将beginend之间的代码放在PL/SQLsql窗... 问题:
1.存储过程在执行时,A表长时间被锁。已确定无任何程式使用A表。
2.存储过程执行时间非常长。达到半小时以上。但是将begin end之间的代码放在PL/SQL sql窗体中单独执行却只需6秒则可完成所有更新。
3.在update 和insert中,未commit之前是全表锁定,还是只是对update语句中占用的记录进行锁定?如果我的表被锁了,其他程式如果向A表中写入记录,此时写入是等待还是将数据写入数据库的缓冲区?在update和insert执行时,表是否在瞬间是出于全表锁定状态的?
代码执行逻辑
存储过程:
Create or replace 。。。XXX
BEGIN
FOR CR IN (SELECT A.ROWID,B.VALUE1 FROM A,(SELECT C.VALUE1 FROM C,D,E WHERE 查询条件 ) B )
LOOP
UPDATE A SET A.VALUE1 = B.VALUE1
WHERE
A.ROWID = CR.ROWID;
END LOOP;
commit;
END;
END XXX;
说明:
A表数据10W条,C表数据1000W+,D表数据1000W+,E表数据100W+,查询条件中有CDE关联的主键及索引,SELECT查询语句执行计划中COST值1000以内。
该语句查询的结果为10万条左右。
SELECT A.ROWID,B.VALUE1 FROM A,(SELECT C.VALUE1 FROM C,D,E WHERE 查询条件
需要将该语句查询结构更新到A表(10W条)中对应的字段中。
展开
 我来答
JerryShang0226
2019-08-07 · TA获得超过1844个赞
知道小有建树答主
回答量:1039
采纳率:86%
帮助的人:193万
展开全部
for 里的语句条件不对,A、B表都没链接条件
另外你这种loop写法还不如直接写一个update,反正也没有做到分批提交。
要分批提交,最简单定义个变量,每次循环+1,5000一次commit这样写
if mod(i,5000)= 0 then
commit;
endif;
追问
最开始使用update + exisits 进行条件判断进行写操作的,但是被锁表了。 后来又改为游标的。游标中是使用rowid作为条件的。但是实现的效果不理想。中间有加每1W条进行一次commit的操作。依旧长时间锁表,存储过程长时间处于等待状态。是否可能是数据库主机的内存不足造成?
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式