为啥一个简单的更新游标要花这么多时间?
Posted
技术标签:
【中文标题】为啥一个简单的更新游标要花这么多时间?【英文标题】:Why does a simple update cursor take so much time?为什么一个简单的更新游标要花这么多时间? 【发布时间】:2014-08-21 04:35:29 【问题描述】:此脚本在过去 10 分钟内运行。它在一个只有 10 条记录的表上运行。脚本有什么问题?
declare
cursor cus is
select * from customers
for update of salary;
begin
for i in cus
loop
update customers
set salary = salary * 0.15
where current of cus;
end loop;
end;
【问题讨论】:
它还在运行!这件事有严重的问题! ;) 因为很多事情: 1. 你多次点击目标表(当你获取一行和更新它时至少两次 -update
语句总是有一个“读取”部分); 2. 而不是使用单个简单的update
语句,而是将它放在 PL/SQL for
循环语句中,在那里它会被执行(发送到 SQL 引擎)的行数是 @987654325 的行数@表有。因此,在这种情况下,绝对没有必要使用 PL/SQL。但是对于只有 10 条记录的表来说,10 分钟是很多时间。看起来该表在您运行脚本之前已被锁定。
感谢@NicholasKrasnov - 在这种特殊情况下不使用更新的想法。只是想弄清楚使用 pl/sql 块可以做什么。
【参考方案1】:
一种简单的光标,但我不使用“当前位置”,而是匹配一个键。
更新客户 设置薪水 = i.salary *.15 其中 cus_key = i.cus_key
【讨论】:
以上是关于为啥一个简单的更新游标要花这么多时间?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Cloud Firestore 更新这么多? [复制]