一条insert语句导致的性能问题分析(二)

简介: 今天对之前描述的问题一条insert语句导致的性能问题分析(一) 进行了进一步的补充。 有一条insert语句的主要性能瓶颈在于insert子句中的查询语句,查询中的主要资源消耗在于对两个表进行了多次关联 语句主要的结构如下: insert into xxxxx...
今天对之前描述的问题 一条insert语句导致的性能问题分析(一) 进行了进一步的补充。
有一条insert语句的主要性能瓶颈在于insert子句中的查询语句,查询中的主要资源消耗在于对两个表进行了多次关联
语句主要的结构如下:
insert into xxxxx   (select * from TEST_vip_new minus select * from TEST_vip_new_bak
        ) a left join TEST_vip_new_bak b
        on a.cn=b.cn
对于这个test_vip_new和test_vip_new_bak我产生了疑问,觉得这个临时表test_vip_new_bak有些多余。带着这种思路分析,看起来逻辑很简单啊,于是就联系了开发的同学,一起讨论一番。
但是讨论完之后,还是让我有些不知所措。
首先,语句为什么要多次关联,自己做了一个小的测试,感觉这种关联方式还是有些多余。
SQL> create table a (id number);
Table created.
SQL> create table b (id number);
Table created.
SQL> insert into a values(1);
1 row created.
SQL> insert into a values(2);
1 row created.
SQL> insert into b values(1);
1 row created.
SQL> select * from a minus select * from b;
        ID
----------
         2
SQL> select *from a left join b on a.id=b.id;
        ID         ID
---------- ----------
         1          1
         2
如果按照这样的思路,仿照原来的结构输出就是下面这样的结果。
SQL> select *from (select * from a minus select * from b) a left join b on a.id=b.id;
        ID         ID
---------- ----------
         2
但是和开发讨论了一番,发现我的想法有些简单了,具体的场景中数据过滤的逻辑比上面这种略微复杂一些。
通过一个两个测试表来模拟。
create table a (id1 number,id2 number);create table game_new (id1 number,id2 number);
create table game_new_bak (id1 number,id2 number);
如果原来的数据内容为(1,1),在运行存储过程之后,会修改为(1,2)
SQL> insert into game_new values(1,2);
1 row created.
然后存储过程在运行过程中,会插入一些新的数据,假设为(2,2)
SQL> insert into game_new values(2,2);
1 row created.
而临时表game_new_bak中的数据是存储过程运行之前的数据状态,即(1,1)
SQL> insert into game_new_bak values(1,1);
1 row created.
按照这种情况,两个表做了minus操作之后会输出两行,即修改之后的数据和新增的数据。
而这个需求需要实现的是,根据id1进行匹配,把修改前的id2一并输出。这样就知道修改前是什么样的数据了,如果是新增的,那这列的值就保持为空。
SQL>   select a.id1,a.id2,b.id2 from (select * from game_new minus select *from game_new_bak)  a left join game_new_bak b on a.id1=b.id1     
       ID1        ID2        ID2
---------- ---------- ----------
         1          2          1
         2          2
如果是这样的情况,就完全可以使用一次表关联就可以改进。可以用下面的形式。
select a.id1,a.id2,b.id2 from game_new a ,game_new_bak b where a.id1=b.id1(+)
所以就建议语句从原来的形式
SELECT A.CN,A.GRADE,A.RANK,A.SCORE,DECODE(SIGN
(A.RANK-(NVL(B.RANK,-1))),1,2,-1,3,0,1),
SYSDATE,(NVL(B.RANK,-1)),B.SIGN,B.FLAG,B.TAG,B.SCORE FROM ( SELECT *
FROM GAME_VIP_NEW MINUS SELECT * FROM GAME_VIP_NEW_BAK ) A LEFT JOIN
GAME_VIP_NEW_BAK B ON A.CN=B.CN
修改为:
SELECT /*+parallel(4)*/ A.CN,A.GRADE,A.RANK,A.SCORE,DECODE(SIGN
(A.RANK-(NVL(B.RANK,-1))),1,2,-1,3,0,1),
SYSDATE,(NVL(B.RANK,-1)),B.SIGN,B.FLAG,B.TAG,B.SCORE FROM GAME_VIP_NEW a,cydba.GAME_VIP_NEW_BAK B
where  A.CN=B.CN(+)
考虑到执行的情况和资源情况,加了一个并行,可以在一定程度上缓解这个问题。
在本地的环境中进行了测试,发现几分钟就可以轻松搞定,做了基本的确认,就和开发进行了反馈,对线上的存储过程内容进行了修改。
这个问题的解决也就终于告一段落。
目录
相关文章
|
NoSQL 算法 Linux
秋招无望,五个C++项目助你上岸(可以写进简历)
秋招无望,五个C++项目助你上岸(可以写进简历)
|
安全 算法 编译器
【C++ 泛型编程 入门篇】 C++ 模板元编程之枚举内嵌 实战教程
【C++ 泛型编程 入门篇】 C++ 模板元编程之枚举内嵌 实战教程
273 0
|
10月前
|
弹性计算 关系型数据库 数据库
从自建到云端,数据库迁移全攻略
本文详细介绍了将自建数据库迁移至阿里云RDS的全过程,涵盖WordPress网站安装、数据库迁移配置及验证等步骤。通过DTS数据传输服务,实现库表结构、全量和增量数据的无缝迁移,确保业务连续性和数据一致性。方案具备零成本维护、高可用性(最高99.99%)、性能优化及全面的数据安全保障等核心优势。此外,提供了详细的图文教程,帮助用户快速上手并完成迁移操作,确保业务稳定运行。点击文末“阅读原文”了解更多详情及参与活动赢取精美礼品。
472 13
|
SQL 网络协议 安全
有哪些常见的网络攻击类型?
【8月更文挑战第8天】
716 15
|
12月前
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
360 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
机器学习/深度学习 搜索推荐 TensorFlow
使用Python实现深度学习模型:智能饮食建议与营养分析
使用Python实现深度学习模型:智能饮食建议与营养分析
808 3
独家直播|DB-GPT架构设计与源码解读(第一期)
🚀 DB-GPT首期源码解读系列上线啦! 10.8 晚7点,与DB-GPT项目发起人陈发强一起,深入探索DB-GPT的架构设计与源码解读。 🔎 直播看点: ● 架构全剖析:从设计思考到架构逻辑,全面剖析DB-GPT。 ● 源码速度解读:多模型管理、智能体、RAG、AWEL等核心模块一网打尽。 ● 项目作者面对面:陈发强,蚂蚁集团DB-GPT开源项目发起人,分享实战经验与洞见。 ● 有问必答:围绕DB-GPT的使用问题有问必答,线上帮你解issue! 👉 立即扫码预约,与DB-GPT作者零距离交流!
|
人工智能 NoSQL 关系型数据库
现代数据库技术的发展与挑战
数据库作为现代软件系统的核心组成部分,经历了长足的发展。本文将探讨现代数据库技术的发展趋势,以及面临的挑战,包括大数据处理、实时性要求和安全性等方面的技术创新和应对策略。
|
安全 API 数据安全/隐私保护
Django与第三方服务的集成:支付、邮件等
【4月更文挑战第15天】本文介绍了Django集成支付服务和邮件服务的方法。对于支付服务,包括选择支付网关(如支付宝、微信支付、Stripe)、安装Django库、配置参数、创建支付视图及处理支付结果。而对于邮件服务,涉及配置邮件服务器、使用`django.core.mail`发送邮件,以及集成SendGrid等第三方服务以增强邮件功能。集成这些服务能丰富Django应用功能,同时要注意安全性与可靠性。
|
弹性计算 数据安全/隐私保护
2024年10秒搭建雾锁王国(Enshrouded)服务器保姆级教程
2024年10秒搭建雾锁王国(Enshrouded)服务器保姆级教程随着游戏行业的不断发展,玩家们对于游戏体验的要求也越来越高。为了满足玩家们的需求,阿里云提供了游戏联机主机一键部署方案,本文将为大家分享基于云主机10秒钟完成雾锁王国游戏主机搭建教程,让大家的游戏体验更加顺畅。
251 0