SQL解析过程中的查询转换 - Transforming Queries


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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值