来源:辣条科技站Gamer发布时间: 2024-10-24 10:15:05
最近在南宁出差,搞某个银行的核心系统跑批优化项目。
Oracle 19c Aix 生产环境跑完整体的批要40多分钟左右,在Ob国产环境(国产系统+国产海光CPU)跑要3个小时?。这个真不怪Ob,只能说海光处理器真是垃圾中的战斗机。
不过还好,测试环境硬件相对不给力的情况下,给哥优化到95分钟跑完,还算不错成绩了,目标是整体跑批时间搞到80分钟左右,就给领导交差。?
今天在跑批串行的节点(前后有依赖关系的节点上)遇到条慢SQL,挺有意思的,分享下。
表数据量:
慢SQL:
慢SQL执行计划:
主要慢的SQL和计划:
这条SQL执行时间跑10秒,慢在 PRIOR DBMS_RANDOM.VALUE IS NOT NULL ORDER BY PROD_TYPE 这段,如果去掉就非常快,毫秒级别出结果。
但是去掉以后返回的结果集数量和没去掉之前差别很大,BRANCH_ROLE 字段存储的内容是 'Role1|Role2|Role3|Role4|Role5' 这种数据格式,行的数据存放到一个列里面。
因为这条SQL没写 START WITH 条件, 我猜开发想实现的逻辑是将父节点和子节点关联成功的前提下,将每行的 BRANCH_ROLE 字段内 'Role1|Role2|Role3|Role4|Role5' 数据拆分成每一行
(REGEXP_SUBSTR(BRANCH_ROLE, '[^|]+', 1 , LEVEL) BRANCH_ROLE)
,才写了个 PRIOR DBMS_RANDOM.VALUE IS NOT NULL 条件,将不确定性带入递归条件中。
只要达到 CONNECT BY NOCYCLE LEVEL <= REGEXP_COUNT (BRANCH_ROLE, '[^|]+') 这个计数器条件以后,就停止递归。
假如 PROD_TYPE 有 10行,每行列拆行的情况下,数据会翻倍。
不过开发这个逻辑没写全,我按照他这个逻辑改写一版。
改写SQL
(PROD_TYPE 、ACCT_CCY 、SEQ_NO联合主键)
:
简单点说就是每一行数据展开 BRANCH_ROLE 列内的数据。改写的SQL看得懂就看,看不懂也不多说,说起来又一大堆?。
改成这样后SQL执行时间降到 58毫秒,优化也算是结束了, XXXXXXX 那段递归不慢不需要优化,因为 BRANCH 是唯一键。
整体SQL速度和执行计划:
验证环节:
差集比对后是等价的,我换过几个条件试过都是这样,只能说业务开发想实现的逻辑没写全,我给完善了下。、
其实还有个更简单,更激进的写法,速度比上面我改写的更快,考虑到金融行业的严谨性,没敢给。
PG好像也有个函数能实现这种逻辑,速度直接秒杀,不过哥忘了。
热门推荐
夸父追日最新版下载,夸父追日下载安装最新版本3.1.1 v3.1.0
2022-12-10 11:04:41烈焰皇城游戏下载-烈焰皇城安卓版下载v1.0.2
2023-02-13 16:58:08卫士云盘下载-卫士云盘appv3.13.1 最新版
2023-03-10 09:26:25乐享购全球app下载-乐享购全球购物包邮商城安卓版下载v1.3.8
2023-04-18 07:16:06大鱼吃小鱼3老版本完整版手游下载-大鱼吃小鱼3完整关卡旧版下载v2.1
2023-05-17 20:12:49pixaloop怎么让水动起来-怎么让照片动起来
2023-06-08 15:18:19人气榜