记一次生产环境存储过程优化的过程(42秒-->0.06秒)

简介: 记一次生产环境存储过程优化的过程(42秒-->0.06秒)

1. 概述

 

在拿awr报告时发现有一个存储过程效率很慢,执行要很长时间,所以在测试环境模拟,开始了我的优化之路..下面写一下我的整体优化步骤和优化后的效果。

 

1.存储过程如下:

 

通过awr报告定位到这条问题存储过程。

 

 

推荐一个艿艿写的 6000+ Star 的 SpringBoot + SpringCloud + Dubbo 教程的仓库:https://github.com/YunaiV/SpringBoot-Labs

 

2.分析存储过程:

 

调试后分析大概需要42秒。

 

 

推荐一个艿艿写的 3000+ Star 的 SpringCloud Alibaba 电商开源项目的仓库:https://github.com/YunaiV/onemall

 

3、查看表数据量和定义

 

数量级为144万

 

 

表定义如下:

 

4、改写sql查看执行计划

 

因为update部分耗时比较多,所以考虑改写成select看有没走索引。

 

 select updatetime,sendtootm from Tab_TempDriverScan
 where ScanWay = '1' and ShipmentNumber = v_shipmentnumber and LPN = idx.LPN and SKU = idx.SKU;

 

这里用了索引范围扫描,继续下一步。

 

5、考虑update开并行

 

** **

 

 update /*+ parallel(Tab_TempDriverScan,8) */ Tab_TempDriverScan set UpdateTime = SYSDATE, SendToOTM = '1'
 where ScanWay = '1' and ShipmentNumber = v_shipmentnumber and LPN = idx.LPN and SKU = idx.SKU;

 

减少了12秒,但是还不是很理想。

 

6、应用bulk collect优化

 

改写后如下

 

 

核心脚本:

 

TYPE Tab_TempDriverScan_rec_type IS RECORD --声明记录类型
 (
 v_shipmentnumber Tab_TempDriverScan.shipmentnumber%TYPE,
 v_power_unit Tab_TempDriverScan.power_unit%TYPE,
 v_IsSend Tab_TempDriverScan.IsSend%TYPE);
 TYPE nested_Tab_TempDriverScan_type IS TABLE OF Tab_TempDriverScan_rec_type; --声明记录类型变量
 Tab_TempDriverScan_tab nested_Tab_TempDriverScan_type;
...................
LOOP
 fetch header1 BULK COLLECT
 into Tab_TempDriverScan_tab; --应用bulk collect
 EXIT WHEN header1%NOTFOUND;
........................

 

测试分析

 

 

这时候时间只需要0.06秒,性能获得了很大提升,到这里就剩下后面上生产测试验证的环节了,这步就忽略啦。

相关文章
|
7月前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
171 0
|
6月前
|
存储 关系型数据库 MySQL
索引的威力--记一次MySQL存储过程优化
在MySQL存储过程中,一个`INSERT INTO SELECT`语句起初执行超过130秒,优化后,执行时间降低到1秒内,实现了100倍的性能提升。问题在于`NOT IN`子查询导致的慢查询,最终通过创建单列索引获得了最佳效果。文章还介绍了索引创建的基本语法,并讨论了单列索引与组合索引的优缺点。作者强调,随着数据量增加,索引对于查询性能的重要性,计划未来采用读写分离来进一步优化处理大量插入和查询的场景。
141 0
|
7月前
|
存储 定位技术 数据库
开启数据库性能之旅:MSSQL存储过程索引优化深度解析
开启数据库性能之旅:MSSQL存储过程索引优化深度解析
|
7月前
|
存储 SQL 缓存
解锁MSSQL存储过程优化之道:参数化查询的技术深度探究
解锁MSSQL存储过程优化之道:参数化查询的技术深度探究
130 0
|
存储 SQL 算法
存储过程编写经验和优化措施
在网友的博客中看到这编文章不错,就记了下来。供大家参考,在写存储过程时的经验之谈 1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。
133 0
|
存储 关系型数据库 MySQL
对一个MySQL存储过程的优化
在编写MySQL存储过程的过程中,我们会时不时地需要对某些存储过程进行优化,其目的是确保代码的可读性、正确性及运行性能。
977 0