生成和显示执行计划

参考《Oracle高性能SQL引擎剖析》、《Oracle® Database SQL Tuning Guide》

一,什么是执行计划

Oracle数据库用于执行SQL语句的步骤的组合是一个执行计划。每个步骤要么从数据库物理上检索数据行,要么为发出语句的用户准备数据行。执行计划包括语句访问的每个表的访问路径,以及使用适当的连接方法对表(连接顺序)进行排序。执行计划指示oracle过滤数据并产生最终结果集,它是影响SQL执行性能的关键因素。

当向oracle提交一条SQL后,SQL引擎会做三个处理:解析(parse)、执行(execute)和获取(fetch)。

1,SQL编译器(SQL Compiler)

将语句编译到一个共享游标中。SQL编译器由解析器、查询优化器和行源生成器组成。

生成和显示执行计划_第1张图片

解析器(parser)——执行对SQL语句的语法、语义分析,将查询中的视图展开、划分为小的查询块。

查询优化器(query optimizer)——为语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,并调用计划生成器(plan generator)生成计划,比较计划的代价,最终选择一个代价最小的计划。查询优化器由查询转换器(query transform)、代价估算器(estimator)和计划生成器(plan generator)组成。

查询转换器——查询转换器决定是否重写用户的查询(包括视图合并、子查询反嵌套),以生成更好的查询计划。

代价估算器——代价估算器使用统计数据来估算操作选择率、返回数据集的势和代价,并最终估算出整个执行计划的代价。

计划生成器——计划生成器会考虑可能的访问路径、关联方法和关联顺序,生成不同的执行计划,让查询优化器从这些计划中选择出代价最小的一个计划。

行源生成器——行源生成器从优化器接收到优化的执行计划后,为该计划生成行源。行源是一个可被迭代控制的结构体,它能以迭代方式处理一组数据行、并生成一组数据行。

2,SQL执行引擎(SQL Execution Engine)

SQL执行引擎依照语句的执行计划进行操作,产生查询结果。在每一个操作中,SQL执行引擎会以迭代方式执行行源、生成数据行。

二,生成执行计划

要获得一条SQL的执行计划,方法大致分为两类:一是从内存或历史数据中读取曾经执行语句的执行计划,另一是使用Explan Plan命令解析语句后,从表PLAN_TABLE获得生成的执行计划。

一条SQL在解析过程中会生成一个SQL_ID来唯一标识这条语句。同一条SQL在不同环境中执行时可能生成不同版本的游标,不同的游标可能会有不同的执行计划,每个游标会按顺序赋予一个序列号CHILD_NUMBER,它的第一个值为0。也就是说同一条SQL可能会有多个执行计划,第一个执行计划的CHILD_NUMBER值为0,第二个执行计划的CHILD_NUMBER值为1,依次类推。同一DB中,为了区分不同执行计划(同一SQL的不同执行计划或者不同SQL间的执行计划),每个执行计划都有一个哈希值PLAN_HASH_VALUE,它是用SQL的当前执行计划计算的哈希值。12C引入了FULL_PLAN_HASH_VALUE,它是用SQL的全部执行计划计算的哈希值。不同版本的游标,对应的执行计划可能相同,也可能不同。

你可能感兴趣的:(ORACLE_SQL,Tuning)