甲骨文学习之性能优化(一)SQL语句处理

  

,当向甲骨文提交一个sql命令时,Oracle到底做了哪些事情?对这个问题有很好的理解,能帮助你更好的分析sql语句的优化。

,执行一条sql语句从开始到结束,需要经历4个步骤:

<李>

分析,对提交的语句进行语法分析,语义分析和共享池检查。

<李>

优化——生成一个可在数据库中用来执行语句的最佳计划

<李>

行资源生成——为会话取得最佳计划并建立执行计划

<李>

语句执行,完成实际执行查询的行资源生成步骤的输出。对应DDL来说,这一步就是语句的结,束。对应选择来说,这一步是取数据的开始。


,以上步骤,有的是可以省略的,例如优化,行资源生成器阶段。这样可以节省大量的时间。

凹坠俏难爸阅苡呕?一)SQL语句处理"

一、分析:

,语法分析,sql是否符合语法标准。

完成,select  *, form 标签;   select  *, form 选项卡   ,,,,,,,,   ERROR  at  line  1:   ora - 00923:,得到keyword  not  found  where 预期

,语义分析,假设sql是合法的,但是它有意义吗?你要访问的对象,你有访问权限吗?查询的列存在吗?是否存在歧义等待。

完成conn 斯科特/老虎   连接。   完成,select  x 得到双;   select  x 得到双   ,,,,,,   ERROR  at  line  1:   ora - 00904:,“X”: invalid 标识符         完成,select  *,得到dba_objects;   select  *得到dba_objects   ,,,,,,,,,,,,,   ERROR  at  line  1:   ora - 00942: table 或是view  does  not 存在

,对于DML语句,还有第三步。

,共享池检查,此语句是否被其他用户使用过?可以重用已经执行过的工作吗?如果是,就是软解析软解析,如果否,那就是硬解析。

,DDL总是硬解析,语句从不重用。

,共享池是SGA中的一部分,用来缓存以前执行过的sql语句,PLSQL,数据字典内容的缓存(以行的形式缓存内容,而缓冲区缓存是以块的方式缓存内容)以及其他许多信息,以供会话重用。

,从技术上来说,甲骨文的语句解析分为两种:

<李>

硬解析——语句通过语句执行的每一个步骤从分析到优化,到行资源生成,到语句执行。

<李>

软解析——语句通过语句执行的某些步骤,特别是跳过优化步骤(最昂贵的步骤)。为了执行软解析,必须通过两个步骤。首先甲骨文必须进行语义匹配,查看提交给甲骨文的语句是否已经被执行过,然后,进行环境匹配。比如一个会话的初始化参数optimizer_mode=ALL_ROWS,一个会话的初始化参数optimizer_mode=FIRST_ROWS,这两个会话的环境就不一样。

,

,为了开始这个处理,甲骨文必须在共享池中寻找语句。为了高效的完成此操作,Oracle将每个提交的sql语句,进行哈希算法,生成一个hash_values.oracle使用hash_values查找共享池中是否有相同的语句。

凹坠俏难爸阅苡呕?一)sql语句处理"

,一旦找到,甲骨文将进行语义和环境检查,sql语句都相同,难道还有语义不同的吗?我们看下面的例子。

<李>

建立两个用户,

完成,create  user  a  identified  by ;      User 创建。      完成,create  user  b  identified  by  b;      User 创建。

2。赋予用户权限

完成,grant  connect  resource 用一个;      Grant 成功了。      完成,grant 连接,resource 用b;      Grant 成功。

3。启用一个会话

完成conn  a/连接。   完成,create  table  emp  (id  int);      Table 创建。   完成,select  *,得到电磁脉冲;      no  rows 选择

4。启用另一个会话

完成conn  b/b   连接。   完成,create  table  emp  (id  int);      Table 创建。   完成,select  *,得到电磁脉冲;      no  rows 选中   完成,select  *,得到电磁脉冲;      no  rows 选择

甲骨文学习之性能优化(一)SQL语句处理