[ORACLE] SQL执行

执行SQL的步骤:

输入SQL->解析SQL->(解析后的SQL)->优化器->(执行计划)->行源生成器->(查询计划/迭代计划)->SQL引擎->(结果集)

[ORACLE] SQL执行

 

一、SQL解析:

开始解析时,数据库会创建一个游标,存在于特定会话私有SQL去中。之后以分析的SQL语句和其他处理信息都存储在其中,SQL处理的最后一个步骤是关闭游标。游标和私有SQL区都位于PGA中。

分为硬解析和软解析。

    硬解析:在共享SQL区找不到该语句可以共用的SQL代码,需要重新完整的解析整个SQL,在通过优化器-行源生成器生成可执行的迭代计划, 也称为库缓存未命中。 数据库对DDL始终执行硬解析。

    软解析:不是硬解析就是软解析,在共享SQL区可以找到已经解析好的与该SQL相同的代码,数据库直接重用该代码,直接执行,也称为库缓存命中。

 

解析步骤:语法检查-语义检查-共享池检查。

    语法检查:检查SQL语句是否正确。

    语义检查:检查表或视图是否存在。

    共享池检查:检查是否可以使用软连接。

 

二、优化器

oracle 有两种优化器:

    基于 规则的优化器: Rule-Based Optimization(RBO)

    基于 成本的优化器: Cost-Based Optimization ( CBO )

 

RBO:

    RBO采用一套严格的规则,按照规则来写sql会生成固定的执行计划,不管其数据量如何,所以就导致了经常生成的执行计划不是最优的执行计划。 从oracle6开始一直用到oracle9i,到oracle10g就被抛弃了。

 

CBO:

    CBO是比RBO可靠的优化器,CBO会综合 查询条 件、可用的访问路径、为系统收集的统计信息、以及提示等,列出所有可能的执行计划,估算出每个计划的“成本”,选择成本最低的执行计划进行执行。

 

CBO的组件:

[ORACLE] SQL执行

 

查询转换器(Query Transformer):

    在执行查询语句时,oracle后改写查询语句,搜索其他的数据源(例如物化视图等),在保证相同结果的情况下,提高执行效率,这叫做查询重写。查询转换器确认更改查询的语句是否有助于优化器生成一个更好的查询计划,若可以则会执行查询重写。

 

估算器(Estimator):

    估算器估算给定的执行计划的总成本,主要基于以下4点因素: 选择性、 基数、 成本、 统计信息

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

 

计划生成器(Plan Generator):

    对提交的查询尝试不同的计划,选择出具有最低成本的计划

 

优化器提示(Hint):

     如果希望优化器按照编程人员的要求来执行,需要使用提示。有以下优化方式:

        ALL_ROWS :使用CDO,以获得最佳吞吐量(资源消耗最小)为目标优化。

        FIRST_ROWS:使用CDO,以返回首行的资源最小化为目标优化。

        CHOOSE:如果数据字典中有该表的统计信息,使用CBO,以最佳吞吐量为目标,若数据字典中没有该表的统计信息,使用RBO。

        RULE:使用RBO。

 

三、行源生成器(Row Source Generator):

    是一个软件,接收执行计划,生成一个称为查询计划的迭代计划,供SQL引擎执行。

 

四、SQL引擎

    SQL引擎执行计划返回了结果集。

 

## 参考

《ORACLE 11G CONCEPTS》

1
https://blog.****.net/w1014074794/article/details/44906845

[ORACLE] SQL执行

上一篇:MySQL - 自增id用完了会报错么?怎么办?


下一篇:MySQL慢日志全解析