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

SQL优化实战分析

时间:2024-03-06 11:26:31浏览次数:34  
标签:实战 分析 开发人员 数据库 T2 SQL 优化

分享一个案例,一条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,优化
From: https://www.cnblogs.com/shujuyr/p/18056109

相关文章

  • mysql视图 触发器 事务 存储过程
    创建视图createviewemp2depasselectemp.*,dep.nameasdep_namefromempinnerjoindeponemp.dep_id=dep.id;   mysql>updateemp2depsetname="EGON"whereid=1;QueryOK,1rowaffected(0.05sec)Rowsmatched:1Changed:1Warnings:0......
  • MySQL 数据库巡检都有哪些内容
    一套正常运行的系统是一个复杂的系统工程,牵涉到主机、操作系统、网络、数据库、中间件、底层存储,还有系统的核心:应用。任何层面的故障都可能造成系统的不可用。今天聊一聊数据库层面的巡检问题。数据库巡检的目的:保障数据库的正常运行,保证数据的安全性,完整性、可靠性。这篇文章......
  • mysql报错代码汇总
    先给大家看几个实例的错误分析与解决方案。1.ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/data/mysql/mysql.sock'问题分析:可能是数据库没有启动或者是端口被防火墙禁止。解决方法:启动数据库或者防火墙开放数据库监听端口。2.ERROR1045......
  • Windows 下 强制修改 MySQL的 root 账号密码
    更新记录点击查看2024年3月6日发布。2024年2月6日初始化。关闭MySQL服务netstopMySQLnetstopMySQL57netstopMySQL80netstop自定义的服务名启动MySQL但不带权限转到mysql/bin目录然后执行mysqld–console–skip-grant-tables–shared-memory如果遇到......
  • mysql undo log
    undolog数据库事务四大特性中有一个是原子性,具体来说就是原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。实际上,原子性底层就是通过undolog实现的。undolog主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undolog,对于每个......
  • Mysql数据库安全和备份
    一、用户权限认证Mysql通过用户认证机制来和业务系统建立连接通道,当认证成功后,还需要通过访问控制模块来进行相关的权限验证,只有两次验证都通过后,才能继续执行SQL语句操作,这个过程涉及用户管理和访问控制两个模块。用户管理模块用于管理登录用户信息、设置相关权限,Mysql......
  • .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移、属性导航
    一、创建asp.netcoreweb(MVC)项目二、导包Microsoft.EntityFrameworkCore.DesignMicrosoft.EntifyFrameworkCore.ToolsPomelo.EntityFrameworkCore.MySql三、创建实例这里创建了两个实例namespacedemo.Models{publicclassSupplier{[DatabaseGe......
  • 《MySQL是怎样运行的:从根儿上理解 MySQL》PDF
    《MySQL是怎样运行的:从根儿上理解MySQL》采用诙谐幽默的表达方式,对MySQL的底层运行原理进行了介绍,内容涵盖了使用MySQL的同学在求职面试和工作中常见的一些核心概念。《MySQL是怎样运行的:从根儿上理解MySQL》总计22章,划分为4个部分。第1部分介绍了MySQL入门的一些知识,比如MySQ......
  • mysql报错:SQL 错误 [1030] [HY000]: Got error 100 - 'InnoDB error' from storage en
    在mysql中进行alter时,报错:SQL错误[1030][HY000]:Goterror100-'InnoDBerror'fromstorageengine 原因:在配置my.cnf或my.ini里面innodb_force_recovery参数的值大于0,它默认值为0,如果大于0,innodb就会禁用insert、update、delete、alter语句。解决方式:在配置my.cn......
  • 搜维尔科技:捕获、分析、优化,使用 Xsens Ergo 创建更安全的工作空间
    简化人体工程学分析,优先考虑员工福祉,并利用客观数据和见解提高生产力。捕获。分析。优化。使用XsensErgo创建更安全的工作空间1.质量数据使用高质量、客观且经过验证的运动数据进行详细的人体工程学分析2.随处使用在最具挑战性的工作环境中随时测量和分析3.快速、实时分......