热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

SQL优化方法论

知识点概述:SQL虽然实现简单却极易引发性能问题,当系统数据量、并发访问量上去后,不良SQL就会拖跨整个系统,我们甚至找不出

知识点概述:SQL虽然实现简单却极易引发性能问题,当系统数据量、并发访问量上去后,不良 SQL 就会拖跨整个系统,我们甚至找不出哪些 SQL 影响了系统。即便找到也不知如何动手优化。 SOL 优化是一个复杂的工程。指导SQL优化的方法论是什么?

您好,这个微课重点讲解SQL优化方法论。

假如你已经知道系统的问题出在数据库。那请问,是SQL还是其他问题,你如何定位,如何判断?在假设你通过努力判断出是SQL问题,那该如何优化,是手动改写,还是不用改写,加加索引啥的……

SQL 优化并不简单,做好SQL优化需要掌握数据库体系结构、表和索引设计、高效 SQL写法、高级 SQL语法、多种优化工具等知识,甚至还得分析业务特点,以及了解优化器的缺点。只有建立SQL优化方法论体系,才能够迅速找到最适合的方法来优化SQL ,从而解决由SQL引 发的性能问题。这些都比编写SQL本身要复杂得多,因此要成为SQL优化高手仅知道一点优化基础是远远不够的,还需要经验的沉淀,并且要转化成你的方法论。由于不改写SQL通常来说比改写高效,而不改写的优化一般都和数据库的体系逻辑架构有关。不过能不改写优化固然好,有时等价改写也是必需的,而且改写分为两部分:一个是等价改写;一个是根据业务改写。业务改写是优化的最高境界,和开发人员交谈后发掘出真正的需求,然后写出来的代码表面上看和旧代码逻辑完全不等价,实际却等价。

做事要有方法论,要先整体后局部,解决问题要注意效率,先尽量考虑不改写的优化,再考虑改写的优化。而不改写的优化靠的是体系结构知识的沉淀,而改写则要考虑逻辑等价改写和业务改写两大思路。其中业务改写是SQL优化的最高境界。

以不同调优场景,可分为单纯(局部)场景的优化和复杂(整体)场景的优化。局部分析调优使用的工具,这个其实是在说SQL的执行计划了,这是SQL优化最重要的手段之一,通过分析执行计划,可以知道SQL的访问路径,知道它慢在哪里,从而进行SQL优化。整体调优工具,先撇开主机,网络,存储等层面的因素,暂时从数据库的整体层面入手,主要工具有AWR,ASH,ADDM,AWRDD这四个工具。

基于这些场景的工具应用,就是针对单纯场景的优化和复杂场景的优化手段。单纯场景其实可以理解为无菌真空实验室里的实验。比如一条SQL很慢,原因是未走高效的索引查询而走全表扫描,加个索引就快了,执行速度从10s变成了0.1s;或者是SQL执行速度被控制在1s左右,逻辑读控制在50个左右,应该就可以了。复杂场景就是刚才加了索引后,本应该从10s变为0.1s,结果还是10s,甚至更慢,这是咋回事了?原来,现在系统整体出了问题,数据库主机资源耗尽,啥语句都跑不快,还有那个逻辑读在 50 左右的 SQL ,如果一天执行几百几干万次,这要是能将逻辑读降低一点,得省多少的逻辑读啊。要考虑 SQL 本身没问题而是被环境影响,还要考虑到执行频率,判断其调优价值与调优空间,这些在单纯的环境里,是不用考虑的。

对我们学习也是有规律可循的。首先是获取系统整体信息的手段,一般是通过报表和日志获取。好比破案一样,这就是收集证据的阶段。接下来要找到蛛丝马迹,那就是如何发现问题。其实数据库性能工具的应用(报表获取和关注点)和体检是非常类似的。我们去医院体检,最终会得到一份体检报告,往往能看到很多总体性指标 这些指标会判断你是否健康。没毛病最好,万一有毛病,报告里要进一步判断是什么毛病,是高血压,还是骨质增生,还是胃有毛病……这就是现实中的体检报告。假设体检报告说你有胃病 很可能只告诉你胃有问题。却无法告诉你具体啥毛病 因为你手上的体检报告不会详细到拥有你胃部所有相关指标。你要得到这些指标需要做进步信息收集,那就是胃镜。做完后医生发现你胃部有大量息肉无法判断这些息肉是否为良性。于是还要做进一步的检查,这就是活检。如果患者拿着有各种晦涩指标的体检报告来到门诊请教医生,他一定会关注各种指标来判断患者具体是什么毛病。同样你也会对 Oracle 性能报告中的各种指标进行关注来判断数据库出了什么毛病。两者非常类似,关注不同的指标。

我练我掌握,总结一下自己平时工作中是如何sql优化的指导方法,对本讲的内容进行简单应用,巩固提升,最后,祝同学们学习进步!

参考文档:《收获,不止SQL优化》


推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了一个误删Oracle数据文件导致数据库无法打开的问题,并提供了解决方式。解决方式包括切换到mount状态、离线删除报错的数据文件等。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
author-avatar
黄于諭春琪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有