About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(172)
分类: 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:
通过一系列查询转换技术,将原始SQL转为优化器更容易理解和分析的SQL,从而能够使用更多的谓词、连接条件等,达到获得{BANNED}最佳佳计划的目的。查询转换的过程,可以通过10053 trace file获取详细信息。查询转换是否能够成功和版本、优化器限制、隐含参数、补丁、HINTS等有关。