SQL在解析阶段主要完成以下步骤 :
1 . 包含VPD(虚拟专用数据库)的约束条件
虚拟专用数据库VPD详细信息见后备注。比如对于HR工资的查询,select salary from emp ;
如果设置VPD, 会隐含加入每个用户各自的账号,只能查看自己的,句子会变成类似:
select salary from emp where name='susan' ;
2. 对SQL语句进行文法检查,如果存在文法错误,则退出解析过程
确认sql语句是否正确书写(比如没有写from,select拼写错误等),
3. 到数据字典校验SQL涉及的对象和列是否存在,不存在就退出解析过程,这个过程会加载
Dictionary Cache .
4. 将对象进行名称转换,比如将synonym 转换为实际的对象等。若转换失败则退出解析。
5. 检查发出SQL语句的用户(一般指连接用户)是否有访问SQL中引用的对象的权限,若没有则
退出解析。
6. 将父游标保存到Library Cache中 (父游标的概念参考后面的说明)
先将SQL转化为ASCII数值,然后对这些ASCII数值进行hash函数的运算,运算后匹配
library cache里的hash bucket (hash bucket简单来讲是使用hash算法将进入library
cache中的SQL 通过一个类似二维数组来表示,比如t[3][6], 每次查找时通过hash算法算出
负荷的bucket号,找到对应bucket,比如前面t[3][6]中的3号,每个bucket后面会挂载所有
满足hash算法的object handle, object handle会存储SQL名称[对于SQL而言就是SQL文本],
namespace等) ,再匹配hash bucket上面的handle,也就是句柄,如果匹配成功,那么去找
子游标 (子游标的概念参考后面的说明),如果不成功(即不存在共享的父游标),就会在库缓
存中分配一些内存(Chunk),并将新产生的父游标保存进去,生成一个handle,这里也就是硬解
析,挂载hash bucket上。
7. 逻辑优化 -- 用一定的转换技巧(Transforming Queries,查询转换器),生成语法语义上等同
的新的SQL语句。查询语句的形式会影响所产生的执行计划,查询转换器的作用就是改变查询语
句的形式以产生较好的执行计划。
详细可以参考:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745
View Merging
Predicate Pushing
Subquery Unnesting
Query Rewrite with Materialized Views
OR-expansion
从Oracle 8i开始就有四种转换技术:视图合并(View Merging)、谓词推进(Predicate Pushing)、非嵌套子查询(Subquery Unnesting)和物化视图的查询重写(Query Rewrite with Materialized Views)。
视图合并: 如果SQL语句中含有视图,经分析后会把视图放在独立的“视图查询块”中,每个视图会产生一个视图子计划,当为整个语句产生执行计划时,视图子计划会被直接拿来使用而不会照顾到语句的整体性,这样就很容易导致不良执行计划的生成。视图合并就是为了去掉“视图查询块”,将视图合并到一个整体的查询块中,这样就不会有视图子计划产生,执行计划的优良性得到提升。
谓词推进:不是所有的视图都能够被合并,对于那些不能被合并的视图Oracle会将相应的谓词推进到视图查询块中,这些谓词通常是可索引的或者是过滤性较强的。
非嵌套子查询:子查询和视图一样也是被放于独立查询块中的,查询转换器会将绝大多数子查询转换为连接从而合并为同一查询块,少量不能被转换为连接的子查询,会将它们的子计划安照一个高效的方式排列。
物化视图的查询重写:当query_rewrite_enabled=true时,查询转换器寻找与该查询语句相关联的物化视图,并用物化视图改写该查询语句。
8. 物理优化 -- 首先,生成与每个逻辑优化产生的sql语句有关的执行计划, 接着, 根据
数据字典找到相关的统计信息或者动态收集的统计信息,计算出与执行计划相关的开销。最后,
选中最低开销的执行计划。涉及大量数学运算,所以这一步最消耗CPU资源。 子游标会在这一步生成 ,执行计划及绑定变量是子游标中的主要内容。
9. 将子游标保存到库缓存 -- 首先分配内存,然后将共享子游标存储进去,最后
将它与父游标关联,与子游标有关的关键内容是执行计划和执行环境,一旦保存到库缓存,父游标
与子游标就可以分别通过视图v$sqlarea和v$sql被具体化。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-676992/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-676992/