首页 > 数据库 >Oracle之SQL优化实战分析

Oracle之SQL优化实战分析

时间:2024-06-03 09:10:44浏览次数:22  
标签:实战 分析 开发人员 数据库 T2 SQL Oracle 优化

分享一个案例,一条SQL引发的“血案”!

技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。

以一个例子为切入点



一、问题背景


这是一个数据仓库系统,正常情况下每天0~6点会跑批,生成前一天的业务报表,供管理层分析使用。

某天凌晨,监控系统频繁发出告警,大批业务报表出现延迟。原本6点前就应跑出的报表,一直持续到10点仍然没有结果。

DBA紧急介入,排查到某个进程占用了大量资源,经与开发人员沟通,先临时杀掉进程。

同时对比从线上收集的ASH/AWR报告,最终定位到某条SQL比较可疑。

经与开发人员确认系一新增功能,因上线紧急,只做了简单的功能测试。正是因为这一条SQL,导致整个系统运行缓慢,大量作业受到影响,修改SQL后系统恢复正常。

基础环境:

  • 主机类型:云环境 
  • 操作系统:CentOS release 7.8
  • 存储:EMC
  • 内存:128 G
  • CPU型号:Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz ( 1 U * 8 core) 
  • CPU核数:32CORE
  • 数据库环境:11.2.0.4

问题现象:

跑批任务延迟。

简单说明:

在很多应用场景中,SQL 的性能直接决定了系统的性能。此外,查询速度慢并不只是因为 SQL 语句本身,还可能是因为内存分配不佳、文件结构不合理、优化器判断异常等其他原因。

本文介绍一些通过调整 SQL 语句就能优化SQL的通用小技巧,优化 SQL 的方法不能解决所有的性能问题,但是却能处理很多因 SQL 写法不合理而产生的性能问题。

二、分析说明

  • 通过分析定位问题,分析问题原因;
  • 追溯历史数据,分析关键指标,这些关键指标可以用来做为参考指标。
  • 用实际数据来验证推断,排除掉其它干扰因素,定位问题的根本原因,帮助快速修复。

三、疑问点排查及分析思路1、具体分析

问题SQL:

SELECT /*+ INDEX (T1 xxxxx) */ SUM(T2.CRKSL),  SUM(T2.CRKSL*A2.DJ) ...
FROM xxxx T2, xxxx T1 
WHERE T2.CRKFLAG=xxx AND T2.CDATE>=xxx AND T2.CDATE<xxx;

SQL并不复杂,两表关联,不过两张表的数据量都较大。

执行计划:

 

 

优化器评估返回的数据量为3505T条记录,计划返回量127P字节,总成本9890G,返回时间999:59:59。

大写的牛批!!!

2、分析结论

看到这个结果我第一反应就是产生笛卡尔积了。执行计划也验证了这一结论,两表关联使用了笛卡儿积的关联方式。
笛卡儿连接是指两表没有任何条件限制的连接查询。一般情况下应尽量避免笛卡儿积。

3、一些启发

从案例本身来讲并没有什么特别之处,不过是开发人员疏忽导致了一条质量很差的SQL。

但从更深层次来讲,开发人员的一个疏忽造成了严重的后果,原来数据库竟是如此的脆弱。需要对数据库保持“敬畏”之心。

也不必过分苛责开发人员,谁都会犯错误,关键是如何从制度上保证不再发生类似的问题。

四、总结

1、严格遵守SQL开发规范

加强对数据库开发人员的培训工作,提高其对数据库的理解能力和SQL开发水平,向开发人员灌输SQL优化的思想,在工作中逐步积累,这样才能提高公司整体开发质量,也可以避免很多低级错误。

2、SQL Review制度

对于SQL Review,怎么强调都不过分。

常见做法是利用SQL分析引擎(商用或自研)进行分析或采取半人工的方式进行审核。审核后的结果可作为持续改进的依据。

SQL Review的中间结果可以保留,作为系统上线后的对比分析依据,进而可将SQL的审核、优化、管理等功能集成起来,完成对SQL整个生命周期的管理。

3、限流/资源控制

有些数据库提供了丰富的资源限制功能,可以从多个维度限制会话对资源(CPU、MEMORY、IO)的使用,可避免发生单个会话影响整个数据库的运行状态。

标签:实战,分析,开发人员,数据库,T2,SQL,Oracle,优化
From: https://www.cnblogs.com/gdjgs/p/18228031

相关文章

  • MySQL 使用方法以及教程
    一、引言MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时,Python作为一种强大的编程语言,也提供了多种与MySQL交互的库,其中pymysql就是其中之一。本文将介绍MySQL数据库的基础使用,并通过Pytho......
  • 基于docker的oracle12.2.0.1部署及oracle使用与docker镜像容器制作迁移方法
    基于docker的oracle12.2.0.1部署及oracle使用与docker镜像容器制作迁移方法本文介绍了基于docker的oracle12.2.0.1部署,包含了oracle基本配置、监听器和实例启动方法、PDB和CDB操作方法、表空间建立和用户数据库建立、常见启动问题解决等,并介绍了镜像制作、镜像打包、镜像迁移......
  • Kubernetes Calico网络重大故障排查实战
    引言  在当前的Kubernetes实践环境中,Calico作为优选的网络解决方案应用非常广泛,它提供了高效的网络连接和安全策略管理,是构建和维护大规模云基础设施的关键组件,所以其稳定运行至关重要。Calico的简介与原理  Calico是一个纯三层的数据中心网络方案,它提供了高性能......
  • SQLmap注入
    SQLmap注入sqlmap只是用来检测和利用sql注入点,并不能扫描出网站有哪些漏洞,使用前先使用扫描工具扫出sql注入点。sqlmap采用了五种独特的SQL注入技术。1.布尔盲注:可以根据返回页面判断条件真假的注入。2.时间盲注:不能根据返回页面的内容判断出任何信息,要用条件语句查询时间......
  • MYSQL 移机重装步骤(windows11)
     MYSQL移机重装步骤(windows11) 目的:已有电脑A,D盘安装有mysql(安装方式为免安装),准备在另一台电脑B上,复制安装电脑A上的mysql(8.0.23版本)。要求:电脑A的 mysql数据库表都恢复,且设置的用户和密码等都恢复。 步骤: 1 先从电脑A复制mysql文件夹到电脑B的D盘,如:D:\mysql......
  • MySQL进阶之索引
    1索引概述  索引(index)是帮助MySOL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。  索引的优缺点优势劣势......
  • 小程序抓包实战:Fiddler配置与使用详细
    实验环境FiddlerClassic微信(3.9.10.27)步入正题一,既然要抓包当然我们得先下载了,点击FiddlerClassic即可下载,下载完成后一路下一步就行;二,Fiddler配置,依次打开Tools>Options>HTTPS,勾选图中三项即可如果出现证书提升直接按照;三,设置代理端口以及允许计算机连接,......
  • 在Macos上,使用homebrew下载并配置mysql
    下载mysqlbrewinstallmysql启动mysql注意:由于启动mysql的指令会先将在Github上的官方维护的tap克隆到homebrew-services文件夹中,因此需要先确定能够稳定地访问Github如果很不幸你无法稳定的访问Github,我们可以更改homebrew主仓库的git远程地址和homebrew核心软件仓库的git......
  • MySQL注入之Fuzz测试&WAF Bypass小结
    目录BurpSuiteFuzz测试内联注释绕过union[]select联合查询绕过敏感函数绕过from[]information_schema查表报错注入示例常规绕过思路总结空格绕过引号绕过逗号绕过比较符号绕过逻辑符号绕过关键字绕过编码绕过等价函数绕过宽字节注入多参数请求拆分生僻函数输出内容过滤BurpSuite......
  • 【C语言项目实战】使用单链表实现通讯录
                                                                  ......