sql 优化_五分钟读完《SQL优化最佳实践》之原理篇,SQL优化必看

大白君上个礼拜读完了《SQL优化最佳实践》,书中讲解了SQL优化的常见案例以及背后的原理,值得细细品味,今天在这里跟大家分享一下基本原理。

我们从一个sql执行过程开始入手,下面的图展示了一个sql被数据库执行的全过程。

52ab5568295bafda10b4459cf1880769.png

sql执行过程

我们先来看看这张图。

Syntax check:

语法检查,检查你的sql语句的书写错误,例如将“from”写成“form”,相信你应该也干过吧。

Sematic check

语义检查,数据库会对sql语句进行语义分析,其中包括对象的有效性,用户是否具有访问权限等。

Shared Pool Check

数据库首先将SQL文本转化为ASCII字符,然后根据哈希算法计算其对应的值(就是对应于V$SQL.SQL_ID)。根据计算出的这个值到共享池中的一个区域(就是library cache)中找到对应的一块结构(又称bucket),然后比较bucket里是否存在该SQL语句。如果找到该语句,则返回对应的执行计划(可能有多个,需要选择一个)。执行计划就是数据库基于现有的优化器对sql语句进行解析优化之后保存的执行步骤,此过程比较费时,故将解析之后的sql语句的执行计划进行保存,避免重复优化。如果没有找到,则进入硬解析的过程。

Hard Parse

即硬解析。如果数据库无法在内存中找到这条语句,则需要经历一个硬解析的过程。在这个过程中需要申请一块内存空间(并通过名叫latch的结构保证不被别人访问)。同时还需要访问数据字典获得对象必要的信息。

Optimization

在这一阶段,数据库会根据很多因素由优化器生成最优的执行计划。

Row Source Generation

所谓Row Source是指在上面的执行计划中每一步采用什么样的方法去关联、获得数据。Row Source可能对应于表、视图、结果集、表关联操作、分组操作等。最终结果是一棵树的形态。可以看成是执行计划的树形表达,也是执行器执行执行计划的输入转变。

Execution

这一步就是执行器根据Row Source树的每一步去执行。

这其中,执行计划是我们关心的重点,我们来看看数据库是怎么根据我们sql语句制定最优的执行计划的。首先我们需要理解对于数据库来说针对一个特定sql什么样的执行计划是最优的。

成本与优化器

要想找到最优的执行计划,那我们就需要对执行计划的执行代价有一个量化的标准——成本,成本是指(单数据库读取时间+多数据块读取时间+CPU处理时间)/单数据库块读取所花费的时间(成本在不同版本的数据库的定义是不大相同的)。

对sql语句进行成本量化并找到最优解的过程是由优化器来完成的。优化器是数据库最核心的功能,也是最复杂的一部分。学习SQL优化,从本质来讲就是学习从优化器的角度如何看待SQL,如何制定出更优的执行计划。

统计信息

那么,优化器是根据什么来计算代价,从而找到最优解的呢?数据库设计者自然不会傻到将所有的执行计划都执行一遍吧!优化器的信息来源就是统计信息。

统计信息包括但不限于

  1. 表统计信息,表中数据的总行数,行平均长度,数据块中平均空余空间(字节),高水位线下的数据块个数(全表扫描的数据块数)。
  2. 索引统计信息,记录表上的索引信息,索引的块数,索引的高度,索引的聚簇因子。其中聚簇因子用于表示表中数据的存储顺序和某些索引字段顺序的符合程度,聚簇因子是优化器是否采用索引扫描的重要依据。
  3. 字段统计信息,字段块数,不同的值得个数,选择率,直方图信息等。

了解了数据库执行sql的过程,我们在写sql语句的过程中,需要根据执行计划的优化策略来优化我们的sql语句。

关注技术大白,带你阅读技术书籍,了解技术内幕

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
《oracle数据库性能优化的艺术》是资深数据库专家、unix系统专家、系统架构师近20年工作经验的结晶。 《oracle数据库性能优化的艺术》内容高屋建瓴,用辩证法中的系统化分析方法,不仅从硬件(服务器系统、存储系统、网络系统等)、软件(操作系统、中间件系统、应用软件等)和应用场景(用户访问模式、用户使用频度、数据承载压力等)等多个相关联的维度深入阐述了具有普适意义的数据库性能评估与优化的思维方法和工作流程,而且还从流程的角度详细讲解了应该如何在数据库系统的架构阶段、设计阶段、开发阶段、部署阶段、运行阶段等各环节中去寻找性能问题的瓶颈和解决方案。 全书一共12章:第1章从系统工程的角度总结了性能问题可以分为哪些阶段去考虑、性能问题有哪些种类,以及性能改进的工程方法等;第2章详细讲解了在数据库的设计阶段如何去考虑数据库的性能问题;第3~6章从物理数据库部署、数据库访问设置、硬件资源设定、存储空间和内存资源的使用、实例配置与缓存优化等多方面讲解了数据库系统在部署阶段的性能优化问题;第7章探讨了如何平衡数据库可靠性和性能之间的矛盾;第8章完整呈现了oracle数据库的表分区能力,是解决与大规模数据处理相关的性能问题的关键;第9章从索引和执行计划的角度讲解了数据库性能优化的方法;第10~12章着重介绍了在数据库系统部署并运行后,如何获得数据库运行时的性能状态,如何对正在使用的各种资源进行分析,分析时使用什么工具,以及如何解读这些工具返回的信息。 《oracle数据库性能优化的艺术》重在“授人以渔”,虽然主要内容是围绕oracle数据库系统展开的,但是书中的观点同样适用于db2、sql server、mysql、postgresql等数据库系统。 oracle数据库性能优化的艺术 目录 前言 第1章 综述:优化是一个系统工程 / 1 1.1 性能问题是一个系统工程 / 3 1.2 性能改进的工程方法 / 23 第2章 设计与优化:物理数据库结构设计 / 39 2.1 数据库的特定运行平台 / 40 2.2 物理设计与性能的关系 / 41 2.3 应用框架与性能特征 / 43 2.4 物理表设计的关注点 / 44 2.5 索引的初始设计 / 60 第3章 部署与优化:准备基本运行环境 / 73 3.1 性能问题在表象上的欺骗性 / 74 3.2 理解数据库需要的系统资源 / 76 3.3 小型机数据库部署准备 / 94 3.4 x86系统数据库部署准备 / 107 第4章 部署与优化:数据库的优化部署 / 112 4.1 实例初始配置注意点 / 114 4.2 数据库空间使用关注 / 119 4.3 表空间的创建管理 / 130 4.4 创建表时的性能因素 / 135 4.5 数据导入与索引维护 / 144 第5章 实例优化:配置高效运行环境 / 145 5.1 实例配置与缓存优化 / 146 5.2 sql与缓存的使用 / 165 5.3 pga内存分配原则 / 175 5.4 oracle虚拟化关注点 / 176 第6章 存储优化:配置高效存储环境 / 181 6.1 i/o问题的表象与内涵 / 182 6.2 存储介质的基础配置 / 183 6.3 存储i/o能力探究 / 197 第7章 综合部署:oracle可靠性设置 / 201 7.1 数据库设置的综合考虑 / 202 7.2 rac下的设置 / 225 7.3 加密表数据 / 227 7.4 加密表空间 / 231 第8章 对象优化:大表分区方式部署 / 232 8.1 分区技术适用的范围/ 233 8.2 分区技术的基本概念/ 234 8.3 分区表的管理操作 / 238 8.4 分区的技术实现 / 239 第9章 索引定义:索引设置与执行计划 / 260 9.1 索引对象/ 261 9.2 oracle优化器 / 263 9.3 索引的技术指标 / 285 9.4 索引与sql优化 / 294 9.5 避免索引不作为 / 296 9.6 创建虚拟的索引 / 303 9.7 创建压缩的索引 / 305 9.8 索引的使用监测 / 305 9.9 对分区表建立索引/ 310 第10章 实例效率:识别数据库内部作为 / 312 10.1 研究数据库运行效率 / 313 10.2 操作系统的使用方法 / 338 10.3 调整计划探讨 / 349 第11章 优化践行:数据库层面的优化 / 351 11.1 oracle自动统计 / 352 11.2 使用awr / 355 11.3 使用addm / 363 第12章 优化践行:操作系统层面的优化 / 369 12.1 平台的性能相关性 / 370 12.2 分配和调度内存资源 / 372 12.3 设置系统进程资源 / 381 12.4 系统i/o资源的使用 / 382 12.5 关闭系统中无用的服务 / 387 写在最后 / 391
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值