第3章 查 询 转 换
查询转换(Query Transformation),又称为逻辑优化(Logical Optimization),也称为软优化,即查询转换器在逻辑上对语句做一些语义等价转换,从而能使优化器生成效率更高的执行计划。
语句在被提交到Oracle后,解析器(Parser)会对SQL语句的语法、语义进行分析,并将查询中的视图展开、划分为小的查询块(Query Block)。它们是嵌套或者相互关联的,而查询形式则决定了它们之间是如何关联的。这些查询块被传送给了查询转换器后,查询转换器会在不影响逻辑结果的前提下,决定如果改变查询形式(从而改变查询块之间的关系),是否能生成更好的执行计划。
查询转换器依据特定的方式决定是否对查询块进行转换。按照其所依赖的方式,转换技术可以分为两类:启发式查询转换(Heuristic Query Transformation),又称为基于规则的查询转换(Rule Based Query Transformation);基于代价的查询转换(Cost Based Query Transformation,CBQT)。
启发式查询转换是基于一套规则对查询进行转换,一旦满足规则所定义的条件,则对语句进行相应的转换,部分启发式转换技术在RBO时代就已经被引入了。
基于代价的查询转换是否对语句进行转换则取决于语义等价语句之间的代价对比,即采用代价最小的一种。
提示:大多数基于代价的查询转换都可以从执行计划的概要数据中找到线索;而启发式查询转换则需要从优化器跟踪(10053)信息中查找线索,并且许多跟踪记录仅能从11g的跟踪信息中发现。
不过,并不是每一项转换技术都被严格划分在某一类下,某些技术,例如子查询反嵌套,既包含了启发式查询转换,又存在基于代价的查询转换。
Oracle主要采用了以上两种转换技术,我们分别介绍两种转换技术,对于同时采用了两种转换规则的情况,我们会再做说明。
在本章中,我们将会了解到以下内容:
Oracle的逻辑优化技术中,存在哪些启发式查询转换技术,以及它们的具体含义和示例;
Oracle的逻辑优化技术中,存在哪些基于代价的查询转换技术,以及它们的具体含义和示例。