Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1134596
  • 博文数量: 158
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3675
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

About me:Oracle ACE,optimistic,passionate and harmonious. Focus on oracle programming,peformance tuning,db design, j2ee,Linux/AIX,web2.0 tech,etc

文章分类

全部博文(158)

文章存档

2024年(12)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

分类: Oracle

2023-05-05 16:45:00

一个SQL客户端发送到ORACLE服务器后,需要经过下列操作:

1.SQL经过语法和语义正确性检查,拆分成1个或多个关联的查询块(query block),比如select * from t where t.id in (select b.id from b),这个SQL有2个查询块,一个子查询,一个外层查询。可以通过查看执行计划的outline获得类似如@“SEL$1”的东西,就是指定的查询块,也可以在10053中看到。拆分成多个查询块的目的是便于ORACLE进行查询转换改写。

2.分析后的SQL查询块传给查询转换器进行等价改写,等价改写的目的是生成结构更好更便于ORACLE优化器理解的SQL,这样,优化器更容易判断SQL中表的正确访问方法以及JOIN顺序、JOIN方法。

查询转换器根据版本不同有一系列规则,并且有基于规则(启发式)的查询转换和基于成本的查询转换两种技术。启发式是针对结构简单的SQL,ORACLE认为进行查询转换,肯定比不进行查询转换好,比如simple view merging.复杂的SQL,比如complex view merging,会考虑COST,转换后的COST比不转换的低才会转换。

正确的查询转换是能够生成正确执行计划的重要条件,可能受BUG、也可能产生BUG(比如查询转换后性能更差或结果不正确等)、限制(版本不支持或SQL复杂需要改写)、受补丁(fix control)、隐含参数、HINTS、版本特性控制。常见查询转换有view merge,subquery unnest,predicate push(OJPPD、JPPD、FPD..)、OR EXPANSION、Join Elimination、transitivity等。

3.查询转换完毕后,根据统计信息计算各查询块的COST以及考虑JOIN顺序、JOIN方法后的{BANNED}最佳终COST,选择{BANNED}最佳小的一个,生成执行计划。

从上面可以得知,比较重要的是:

1)正确的查询转换,和众多因素有关,可能需要改写语句

2)正确的统计信息

启发式查询转换(一系列的RULE):

      很多启发式查询转换在RBO情况下就已经存在。常见的有:

Simple View merge (简单视图合并)

SU (Subquery unnest 子查询展开)

OJPPD (old style Join predicate push-down 旧的连接谓词推入方式)

FPD (Filter push-down 过滤谓词推入)

OR Expansion (OR扩展)

OBYE(Order by Elimination 排序消除)

JE (Join Elimination 连接消除或连接中的表消除)

Transitive Predicate (谓词传递)

…等技术


基于COST的查询转换(通过COST计算):

       10G R2开始引入的新查询转换方法,更准确。常见的有:

CVM (Complex view Merging 复杂视图合并)

JPPD (Join predicate push-down 关联谓词推入)

DP (Distinct  placement)

等技术

11G开始将以下的全部纳入CBQT:

  • Aggregate Subquery Elimination
  • Common subexpression elimination
  • Complex View Merging
  • Filter predicate push-down in a view - Note:1082122.1 
  • Group by placement
  • Intersect conversion into join
  • Join Elimination
  • Join predicate push down - Note:1082106.1
  • Materialized view rewrite
  • Minus conversion into anti-join
  • Native Full Outer Join- Note:1082125.1
  • OR expansion
  • Order by Elimination
  • Outer to inner join conversion
  • Predicate move-around
  • Star transformation
  • Subquery unnesting
    • IN / EXISTS -> SEMI JOIN
    • NOT IN / NOT EXISTS -> ANTI JOIN
    • Null-Aware and Single Null-Aware ANTI JOIN - Note:1082123.1 
  • Transitive Predicates - Note:1082133.1


     通过一系列查询转换技术,将原始SQL转为优化器更容易理解和分析的SQL,从而能够使用更多的谓词、连接条件等,达到获得{BANNED}最佳佳计划的目的。查询转换的过程,可以通过10053 trace file获取详细信息。查询转换是否能够成功和版本、优化器限制、隐含参数、补丁、HINTS等有关。

阅读(320) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~