为啥一个简单的更新游标要花这么多时间?

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

【讨论】:

以上是关于为啥一个简单的更新游标要花这么多时间?的主要内容,如果未能解决你的问题,请参考以下文章

郁闷了,非常简单的hibernate更新操作为啥就不执行

为啥 Cloud Firestore 更新这么多? [复制]

为啥每次递归都使用这么多的堆栈空间?

为啥这段代码会消耗这么多堆?

大数据!一个大学新生开学要花多少钱?各地月均生活费竟差这么多……

使用 LSTM 预测一个简单的合成时间序列。为啥这么糟糕?