高性能sql优化-执行计划

一、序言

    执行计划是sql调优必不可少的一部分,如果你还是简单的认为我们向数据库发出一条sql语句,数据库只是根据我们的需求解析sql语句,然后返回我们想要的结果,那你真的是太天真了,因为数据库还会对每条通过会话发出的sql进行一系列的检查、分析和处理,然后由优化器选择生成护着选定出一个成本最低的执行计划,然后执行这个执行计划得到我们的结果的。

二、详解

    1、执行计划的概念

          用户成功连接数据库,也就是意味着,用户个数据库之间成功建立起了会话。伺候,用户每通过会话发出一条sql语句,数据库系统就会对其进行一系列的检查分析和处理。

          首先,会话申请系统对用户发出sql语句进行语法、语义等分析检查

                  如果没通过,会报错,并且终止该sql语句的执行;

                  如果通过,会话将咋自己的服务进程空间内查找该sql语句的相关的信息

                         如果发现,则进入执行等后续的步骤,

      这个对话在其服务进程空间内查找sql语句相关的信息的过程我们称之为快速解析或者软软解析

                        如果未发现,在其服务进程空间内没有发现该sql相关的信息,那么系统将会向系统申请在实例共享池中查找该sql语句的相关的信息

                               如果发现,则将其复制到绘画的服务进程空间,然后执行后续的步骤,

      这个会话在实例共享池中查找sql语句的相关信息,并将其复制到会话服务进程空间的过程,被称为软解析。

                               如果没有发现,在会话的实例共享池中没有发现该sql的相关信息,那么会话将向系统申请将该sql语句加载进实例共享池,同时,优化器会根据数据库内各种相关的信息,对该sql语句进行分析和计算等一系列的操作,最后优化器会为该sql语句选择一个它认为最优的执行计划,接着,继续执行后续的步骤。

     这个将sql语句加载进实例共享池,并且对sql语句分析和计算等操作,最后为之生成执行计划等信息的过程,称之为硬解析。

  

    快速软解析、软解析和硬解析三种情况下,进入执行等后续的步骤都是一样的,即执行查找到的或者生成的sql语句的执行计划中标识的每个步骤,最终获取该sql语句的结果,并将结果返回为用户。快速软解析、软解析和硬解析三种情况他们消耗的资源一次增加,尤其是硬解析,会消耗大量的系统资源,因此特别是在生产环境的OLTP业务系统中,应该尽量避免大量的硬解析操作。

     目前,几乎所有的高版本的关系库的优化器都是基于成本的,所以绝大多数情况下,sql语句不会成为影响最终执行计划的决定性因素,但有些场景,针对同一语义和解结果的sql语句,不同的写法会影响优化器为之生成和选定的执行计划,因此sql调优时,我们可以通过改写sql语句来改变其执行计划,从而达到提升sql语句性能的目的。

    (优化器分为两种,一种是基于成本的,一种是规则的)

    2、系统统计数据

         简单来说,系统统计数据反应了数据库系统的处理能力,会对执行计划中所有的操作的成本计算产生重要的影响,Oracle数据库中相关系统包的相关存储过程负责对系统统计数据进行收集,系统统计数据主要包含CPU转速、单块读消耗的时间、多块读消耗的时间、多块读平均每次都去的数据块数等。

         系统统计数据收集分为两种:一种是非负载模式,另一种是负载模式。两种模式下,系统统计数据包含有不同的数据项,同时也针对不同的场景,前者适用于各种负载场景;后者主要适用于典型负载场景。

          系统统计数据是非常的重要的,它们不但会影响优化器计算分析sql语句执行计划相关成本时所采用的算法,同时还会影响最终sql语句生成和选择的执行计划。

    3、对象统计数据

           优化器对用户提交过来的sql语句进行硬解析时,会格局系统统计数据和对象统计数据等各种信息,计算出所有或者部分候选执行计划的成本,最后,选择出成本最低的作为该sql语句的最终执行计划。因此对象统计数据时优化器计算成本时的重要依据。单就sql语句执行计划来说,其可能比系统统计数据产生更大的影响。

           对象统计数据主要包含三部分:表(包括分区和子分区)相关统计数据、索引(包括分区和子分区)相关统计数据和字段相关统计数据。通过相关关系包中相关存储过程,可以对这些对象统计数据进程收集。

三、总结

    执行计划是调优必备的,希望大家能够加大对执行计划的重视程度。过程就是这样的,实践起来还是比较麻烦的,希望你能够坚持。

猜你喜欢

转载自blog.csdn.net/JavaWeb_Hao/article/details/82721800