首页 > 其他分享 >信创过程中Oceanbase的一次优化记案例录

信创过程中Oceanbase的一次优化记案例录

时间:2024-12-02 14:46:25浏览次数:5  
标签:SCAN Oceanbase pay1 ID 案例 policy TABLE 信创 id

某金融保险公司业务中这条sql在oracle中跑非常快,而在OB上跑需要25s,找我们这边看看是否还有优化空间,本人不才,懂一点点SQL优化的皮毛,做个简单的记录。
--原慢sql如下:35s
select count(1) from
( select count(*) LISTNUM from sx.t_AAA a
LEFT JOIN (select STAFF_CODE, policy_id from sx.T_spop where flag = '3' ) pn on pn.policy_id = a.policy_id
LEFT JOIN (
SELECT to_char(pay2.INTO_ACCOUNT_DATE, 'yyyy-mm-dd hh:mm:ss') accountDate, pay1.policy_id
FROM sx.t_spopa pay1,
sx.t_spa pay2
WHERE pay2.PAY_APPLY_ID = pay1.PAY_APPLY_ID
AND pay1.INSURER_SUB_COMPANY_CODE IN('3070100')
AND pay2.sub_company IN('3070100')
AND pay1.PAY_STATUS IN ('1', '2', '3', '4') ) pa ON a.POLICY_ID = pa.POLICY_ID
INNER JOIN ( select policy_id policy_id_D from sx.t_sufd group by policy_id ) b on a.policy_id = b.policy_id_D
WHERE 1 = 1
AND a.POLICY_NO IS NOT NULL
AND SUBSTR(VERSION, INSTR(VERSION, '.', 1), 2) = '.0'
AND pa.accountDate >= to_date('2024-11-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
AND pa.accountDate <= to_date('2024-11-22 23:00:00', 'yyyy-mm-dd hh24:mi:ss')
AND A.INSURER_SUB_COMPANY_CODE in ('3070100')
AND A.OWB_SUP_BRANCH_CODE in ( select F_ORGAN_ID from om w where w.if_display = '0' and w.F_CODE_P09 in ('350500'))
AND A.CHANNEL in ('11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '23', '51', '52', '71')
)
--执行计划:

ID OPERATOR NAME EST. ROWS COST
0 SCALAR GROUP BY 1 141898
1 SUBPLAN SCAN 1 141898
2 SCALAR GROUP BY 1 141898
3 NESTED-LOOP JOIN 8 141838
4 NESTED-LOOP OUTER JOIN 6 141637
5 NESTED-LOOP JOIN 5 141242
6 NESTED-LOOP JOIN 175 75421
7 NESTED-LOOP JOIN 161 12746
8 TABLE SCAN W(IDX_ORGAN_02) 1 92
9 TABLE SCAN a(IDX_TEST_1126_2) 321 25235
10 TABLE LOOKUP PAY1 17 387
11 DISTRIBUTED TABLE SCAN PAY1(IDX_POLICY_PAY_APPLY_01) 17 9
12 TABLE LOOKUP PAY2 2 376
13 DISTRIBUTED TABLE SCAN PAY2(IDX_PAY_APPLY_02) 18 10
14 TABLE SCAN T_spop(idx_pol_01) 1 83
15 SUBPLAN SCAN B 1 46
16 MERGE GROUP BY 1 46
17 TABLE SCAN t_sufd(idx_sufd_01) 2 46

执行计划后续的没有特别有用的信息,于是没有全部粘贴列出。

--分析:
看了执行计划对比后,目前感觉OB没有走到理想的状态,和oracle的CBO执行还是有比较大的区别,很抱歉oracle生产库没法拿出执行计划做对比。
检查了left join的耗时状况:
select STAFF_CODE, policy_id from sx.T_spop where flag = '3';
--返回2.2w行,耗时9s

SELECT to_char(pay2.INTO_ACCOUNT_DATE, 'yyyy-mm-dd hh:mm:ss') accountDate, pay1.policy_id
FROM sx.t_spopa pay1,
sx.t_spa pay2
WHERE pay2.PAY_APPLY_ID = pay1.PAY_APPLY_ID
AND pay1.INSURER_SUB_COMPANY_CODE IN('3070100')
AND pay2.sub_company IN('3070100')
AND pay1.PAY_STATUS IN ('1', '2', '3', '4');
--返回113w行,耗时3.84s

select policy_id policy_id_D from sx.t_sufd group by policy_id;
--返回1545w行,耗时21s

并结合关联列的情况,这样看确实能看到大致能看出哪里出了问题,于是改写了下:
select count(*) LISTNUM from sx.t_AAA a
where A.CHANNEL in ('11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '23', '51', '52', '71')
and A.INSURER_SUB_COMPANY_CODE in ('3070100')
and SUBSTR(VERSION, INSTR(VERSION, '.', 1), 2) = '.0'
and a.POLICY_NO IS NOT NULL
and EXISTS(SELECT 1 from om w where w.if_display = '0' and w.F_CODE_P09 in ('350500') and A.OWB_SUP_BRANCH_CODE = w.F_ORGAN_ID)
and EXISTS(SELECT 1 FROM sx.t_sufd b where a.policy_id = b.policy_id)
and EXISTS(SELECT 1 FROM sx.t_spopa pay1,
sx.t_spa pay2
WHERE pay2.PAY_APPLY_ID = pay1.PAY_APPLY_ID
AND pay1.INSURER_SUB_COMPANY_CODE IN('3070100')
AND pay2.sub_company IN('3070100')
AND pay1.PAY_STATUS IN ('1', '2', '3', '4')
AND a.POLICY_ID = pay1.POLICY_ID
AND pay2.INTO_ACCOUNT_DATE >= to_date('2024-11-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
AND pay2.INTO_ACCOUNT_DATE <= to_date('2024-11-22 23:00:00', 'yyyy-mm-dd hh24:mi:ss'))
and EXISTS(SELECT 1 FROM sx.T_spop where flag = '3' AND policy_id = a.policy_id);

执行计划:

ID OPERATOR NAME EST. ROWS COST
0 SCALAR GROUP BY 1 459
1 NESTED-LOOP SEMI JOIN 0 459
2 NESTED-LOOP SEMI JOIN 0 459
3 NESTED-LOOP JOIN 0 459
4 NESTED-LOOP JOIN 0 459
5 SUPLAN SCAN VIEW6 0 459
6 MERGE DISTINCT 0 459
7 SORT 0 459
8 NESTED-LOOP JOIN 0 459
9 TABLE LOOKUP PAY2 1 92
10 DISTRIBUTED TABLE SCAN PAY2(IDX_PAY_APPLY_06) 1 46
11 TABLE LOOKUP PAY1 16 364
12 DISTRIBUTED TABLE SCAN PAY1(IDX_POLICY_PAY_APPLY_11) 16 9
13 TABLE LOOKUP A 1 29
14 DISTRIBUTED LOOKUP A(PK_t_AAA) 1 5
15 TABLE GET W 1 31
16 TABLE SCAN B(IDX_UN_FEE_DETAIL_01) 1 21
17 SUPPLAN SCAN VIEW4 1 229
18 TABLE SCAN T_spop(idx_pol_01) 1 228

--改写后SQL在OB上跑了336us。

总结:
原慢sql是视图合并了引起执行计划乱且引起谓词推入不了,不能提前过滤数据,于是改为手动推入提前过滤数据后,性能得到了非常大的提升。
另一方面看Oceanbase的CBO虽然没有oracle那么强,在信创的道路上Oceanbase各方面的表现还是很不错了。

标签:SCAN,Oceanbase,pay1,ID,案例,policy,TABLE,信创,id
From: https://www.cnblogs.com/feichangdajingjing/p/18581709

相关文章

  • DBMove信创数据库迁移产品:企业数据迁移的智慧之选
    一、国产异构数据库迁移工具的重要性在国产替代和信创进程推进中,数据库迁移是企业发展过程中不可避免的关键环节。当前国产数据库厂商有160多家,数据库产品有200余个。国产数据库迁移存在选型麻烦,迁移过程过于复杂的问题。一方面,企业的数据量不断增长,数据类型也日益复杂。传统......
  • .NET开源低代码平台-Microi吾码-成功案例-工业生产管理ERP系统
    工业生产管理ERP系统简介系统截图项目在线demo试用简介一套非常强大的ERP系统,由予珩科技团队基于Microi吾码独立开发该企业开发的服装生产ERP【目前已售97套】:https://microi.blog.csdn.net/article/details/143637262共150+功能模块、216张物理表、63个接口引擎、1......
  • 【WEB漏洞】并发漏洞+经典案例
    一、简单介绍1.1并发漏洞概述1.2并发漏洞常出现的功能点及解决方法1.2.1用户注册/账户管理1.2.2秒杀/抢购功能1.2.3支付与结算1.2.4文件读写1.2.5日志记录1.2.6缓存更新1.2.7任务调度......
  • python3通过驱动包连接oceanbase并将数据导出为excel
    1.创建文件夹driver并将驱动包放到项目中2.编写db_config配置#db_config.py#驱动包路径driver_path='../driver/oceanbase-client-2.2.9.jar'#连接参数url='jdbc:oceanbase://osidaoobdit01.cn-shanghai-finance-1.oceanbase.aliyuncs.com:1526/***?pool=false'......
  • 11.11大促背后的技术保障:SLA与SLO的深度解析与实践案例
    作者:京东物流冯志文背景又到一年的11.11大促日,最近很多团队邮件上下游确认SLA,你是不是还没搞明白服务质量SLA、SLO等概念?本文通过理论知识以及基于SLO告警治理的实践经验分享。详细介绍如何设置SLO、有效的告警泛滥治理、以及如何根据SLO的指标来指导11.11大促及优化服务性能和......
  • Multi-Agent 系统架构综述与项目代码实际案例讲解
    Multi-Agent系统架构综述与项目代码实际案例讲解文章目录Multi-Agent系统架构综述与项目代码实际案例讲解1.背景介绍2.MAS系统要素拆解分析Agent的角色资料常见角色用户代理(UserProxy):环境代理(EnvProxy):意图识别者(IntentRecognizer):总结者(Su......
  • 字符串比较内容、模拟用户登录案例
    1.equals、equalsIgnoreCase在之前我们使用“==”比较的是字符串的地址,但是地址对于我们来说没有用,我们要比较的是字符串的内容。而equals和equalsIgnoreCase就是用于比较字符串的内容的两种方法1.equals比较两个对象的内容是否一致,如果一致则为true,否则为false调用方式:直接......
  • HNU-嵌入式系统-实验三(下)_应用案例
    在前述学习实践基础(HNU-嵌入式系统-实验三(上)_基础内容)上,利用“STM32开发板”,设计并实现一个具备AD、DMA、串口通信等功能的应用案例。工程文件已上传至github,自取1.功能介绍:(1)STM32板子上有两种工作模式:1)流水灯模式,Led灯以流水形式进行亮灭2)数码管显示模式,可以在......
  • 【docker】Dockerfile指令讲解,与企业案例应用
    Dockerfile简介Dockerfile是一个文本文件,包含了构建Docker镜像所需的所有命令。通过执行dockerbuild命令,Docker会按照Dockerfile中的指令一步步构建出镜像。Dockerfile基本结构一个简单的Dockerfile可能包含以下内容:FROMubuntu:20.04LABELmaintainer="y......
  • 48. Web前端网页案例——【王者荣耀游戏主题网页( 6页)】 大学生期末大作业 html5+css3+
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐♬♬♬​​​​​​​欢迎光临我的CSDN!这里是Web前端网页案例大集汇,有各行各业的前端网页案例,每天会持续更......