能不能想办法 提升一下如下update语句的性能

UPDATE OPT_ACCT_FDIM A
SET ACCT_SKID = (SELECT ACCT_SKID
FROM OPT_ACCT_FDIM_BKP B
WHERE A.ACCT_ID = B.ACCT_ID);

SELECT COUNT(*) FROM OPT_ACCT_FDIM; -------这个表 有 226474 条数据

SELECT COUNT(*) FROM OPT_ACCT_FDIM_BKP; ------ 这个表 有 227817 条数据

SELECT COUNT(*)
FROM OPT_ACCT_FDIM A, OPT_ACCT_FDIM_BKP B
WHERE A.ACCT_ID = B.ACCT_ID
AND A.ACCT_SKID <> B.ACCT_SKID; -------要更新 226474 条

那么现在已经很清楚了,业务逻辑就是根据 根据2个表的acct_id 字段关联,然后根据B表的字段update A表,那么这里呢 要更新整个A表

UPDATE的执行计划我们就不用看了,肯定是HASH JOIN,开发人员说 这个update 跑了30分钟,还没完成,其实我估计 这个SQL至少得1小时才能跑完。

其实,select 语句是很好优化的,但是update,delete这样的SQL, 如果要想从SQL上面优化,几乎不可能,优化update,delete我们要用PL/SQL来实现。

对于我们这里的UPDATE语句,我们可以利用rowid 来快速更新,PL/SQL 代码如下:

SQL> DECLARE
2 CURSOR CUR_B IS
3 SELECT
4 B.ACCT_ID, B.ACCT_SKID, A.ROWID ROW_ID
5 FROM OPT_ACCT_DIM A, OPT_ACCT_DIM_BKP B
6 WHERE A.ACCT_ID = B.ACCT_ID
7 ORDER BY A.ROWID; ---如果表的数据量不是很大,可以不用 order by rowid
8 V_COUNTER NUMBER;
9 BEGIN
10 V_COUNTER := 0;
11 FOR ROW_B IN CUR_B LOOP
12 UPDATE OPT_ACCT_DIM
13 SET ACCT_SKID = ROW_B.ACCT_SKID
14 WHERE ROWID = ROW_B.ROW_ID;
15 V_COUNTER := V_COUNTER + 1;
16 IF (V_COUNTER >= 1000) THEN
17 COMMIT;
18 V_COUNTER := 0;
19 END IF;
20 END LOOP;
21 COMMIT;
22 END;
23 /

PL/SQL procedure successfully completed.

Elapsed: 00:01:21.58

现在多快啊,1分22秒搞定

其实,以前的update就相当于下面的PL/SQL代码:

declare
cursor c_update is
select b.acct_skid, a.acct_id
from opt_acct_fdim a, opt_acct_fdim_bkp b
where a.acct_id = b.acct_id;
v_counter number;
begin
v_counter := 0;
for v_row in c_update loop
update opt_acct_fdim
set acct_skid = v_row.acct_skid
where acct_id = v_row.acct_id; ---注意,这里没有rowid
v_counter := v_counter + 1;
if (v_counter >= 1000) then
commit;
v_counter := 0;
end if;
end loop;
commit;
end;
/

我自己测试了一下上面的PL/SQL 代码,跑了30分钟没跑完,为什么跑这么久呢?

其实原因就在于这里:

update opt_acct_fdim
set acct_skid = v_row.acct_skid
where acct_id = v_row.acct_id;

因为缺少 rowid定位,那么又会对表进行全表扫描,而且每更新一行就会去做全表扫描。

而我们利用rowid定位block,那么不用 全表扫描了 性能提升上 百倍。

12 UPDATE OPT_ACCT_DIM
13 SET ACCT_SKID = ROW_B.ACCT_SKID
14 WHERE ROWID = ROW_B.ROW_ID;

其实这本书 Oracle Database 10g PL/SQL 程序设计 ---清华大学出版社 p132页 里面就有这个方法

itpub 这篇帖子:http://www.itpub.net/viewthread.php?tid=1052077 也提到过这个方法

总结:对于大批量的update,delete,我们可以利用rowid 来进行优化,性能往往提升 上百倍。

利用 rowid 提升update性能 .相关推荐

  1. mysql多线程查询_MySQL 利用多线程提升查询性能的一种思路

    转载自:http://dinglin.iteye.com/blog/1432443 背景 报表统计类的查询是一类耗时的查询.使用场景是QPS并不大,单每个查询由于需要访问较多数据,对大量数据做处理,执 ...

  2. 【深度学习】利用深度可分离卷积减小计算量及提升网络性能

    [深度学习]利用深度可分离卷积减小计算量及提升网络性能 文章目录 1 深度可分离卷积 2 一个深度可分离卷积层的代码示例(keras) 3 优势与创新3.1 Depthwise 过程3.2 Point ...

  3. Visual C++利用Intel C++ 编译器提升多核性能与多媒体指令支持获取更高的程序效率与缩小程序体积

    Intel c++编译器有下列优点,建议VC++项目开发采用intel c++编译器取代VS自带c++编译器: 与 Microsoft Visual C++ 相兼容,可以嵌入 Microsoft Vi ...

  4. 如何利用全站加速,提升网站性能和用户体验?

    随着网络技术的发展,越来越多的应用基于互联网发布,再好的应用,如果打开速度慢,10个用户会有9个用户选择离开,相关统计数据显示,每增加0.1秒的加载延迟,将会导致客户活跃度下降1%.在目前获客成本较高 ...

  5. Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能

    关于mod_xsendfile https://tn123.org/mod_xsendfile/ Lighttpd中的X-sendfile RoR网站如何利用lighttpd的X-sendfile功能 ...

  6. 重新标注128万张ImageNet图片:多标签,全面提升模型性能

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 自发布以来,ImageNet 数据集逐渐成为机器学习社区最流行的图像分 ...

  7. 各类Transformer都得稍逊一筹,LV-ViT:探索多个用于提升ViT性能的高效Trick

    [导读]本文探索了用于提升ViT性能的各种训练技巧.通过一系列实验对比.改进与组合,本文所提方案取得了SOTA方案,超越了EfficientNet.T2TViT.DeiT.Swin Transform ...

  8. 重新标注128万张ImageNet图片:多标签,提升模型性能

    2021-01-28 14:47:13 机器之心报道 作者:杜伟.魔王 自发布以来,ImageNet 数据集逐渐成为机器学习社区最流行的图像分类基准,但 ImageNet 自身存在着标签噪声,以及单标 ...

  9. IBM对话智能+未来:十年提升AI性能效率千倍?

    来源:云科技时代 140多前的1879年,爱迪生经过几千次试验发明了电灯:之后过了90年的1969年美国把人类送到了月球,1970年空中客车公司诞生.在1870年代,人类初次进入电力时代的时候,没有人 ...

最新文章

  1. 手把手教你使用YOLOV5训练自己的数据集并用TensorRT加速
  2. 22.调用element方法控制dom元素
  3. Activemq实战
  4. matlab xlsread参数_利用MATLAB批量完成科研数据处理
  5. mysql链接压测_MySQL压测工具mysqlslap的介绍与使用
  6. dll文件 修改特征码_Could not load dynamic library cublas64_10.dll
  7. 从 Wi-Fi 6 的到来,看家庭网络的优化之路!
  8. 如何才能快速提高自己的能力?!
  9. pdf edit注册码
  10. mkv转换mp4格式,mkv格式转mp4
  11. 一文详解AndroidX,再也不会傻傻分不清了
  12. 樱桃一次吃多少合适 这些知识一定要关心
  13. 在可靠的头肩底中淘金(转 封起De日子)
  14. NSG是什么?适用于哪些产品?
  15. 卫生统计学v是什么意思_卫生统计学 名词解释
  16. 推荐系统(十一) 2021-2022年工业界推荐算法实践经验汇总
  17. Centos7设置阿里源
  18. HDU-1814-TwoSAT
  19. 预测大盘最准确的指标_通达信指标——大盘预测 (主图)
  20. nag在逆向中是什么意思_[求助]关于NAG删除资源的问题。

热门文章

  1. Nmap源码分析(服务与版本扫描)
  2. android 获取音乐文件的内置专辑图片
  3. Linux C 实现生产者消费者问题
  4. Centos7.2 基于LAMP框架部署Discuz论坛
  5. Qt下使用Shader绘制三角形
  6. java两行两行读取问文件,正则提取两行之间所有行内容方法.
  7. sybase asa转mysql_为Sybase ASA创建外部存储过程(Java示例)
  8. 机器视觉_Java机器学习,第2部分
  9. B站王道论坛计算机网络,成都理工大学计算机网络考研学长经验分享
  10. linux怎么让某一个组对一文件可读可写,设置linux文件权限,使得同一用户组的可以对一个文件自由修改...