Optimizer Cost Based Query Transformation基于成本的查询转换简介

540阅读 0评论2023-05-05 dingjun123
分类:Oracle

一个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:


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

上一篇:使用统计信息首选项收集统计信息
下一篇:rownum prevent query transformation