指优化器不在将子查询当做一个独立的单元来处理,而是将该子查询转为它自身和外部查询之间的等价的表连接,将子查询拆开,
将子查询中的表、视图从子查询中拿出来,然后后外部查询的表、视图做连接,或者会把该子查询转换为一个内嵌视图(inline view)然后再和外部查询的表、视图做连接(子查询展开)
Oracle子查询前的where条件是以下
single-row(=,>,<,<=,>=,<>)
exists
not exists
in
not in
any all
能否做子查询展开取决如下2个条件:
1 子查询展开所对应的等价改写sql和原sql在语义上一定要是完全等价的。
2 对???不拆开的子查询会把它转换为一个内嵌视图的子查询展开。
对于第一种情况,Oracle 10g及以后的版本中,Oracle也不会考虑子查询展开的成本。及Oracle都会做子查询展开
不将视图作为单独的处理单元,将视图的基表拿出来与外部查询的表合并,不会再有视图的出现
Outer join view merging,针对那些使用了外连接,以及所带视图的视图定义sql语句中不含distinct,group by 等聚合函数的目标sql的视图合并
外连接视图合并的通用限制,该视图被作为外连接的驱动表,或者该视图定义的sql语句中只包含一个表
例
3复杂视图的合并
复杂视图的合并会推迟group by,distinct操作,所以不一定能带来效率的提升
Join predicate pushdown,优化处理带视图的另一个优化手段,会把视图当做一个独立的单元,但优化器会把处于该视图外部查询中和该视图的连接条件推入到该视图的定义的sql语句内部,为了能使用上基表的index
Oracle仅仅支持如下类型的视图做谓词推入
视图定义sql语句中包含union all、union
视图定义sql包含distinct
视图定义sql包含group by视图
和外部查询之间的连接类型是外连接
和外部查询之间的连接类型是反连接
和外部查询之间的连接类型是半连接
例
11gr2被引入,优化器处理带union-all的目标的sql 的一种优化手段,把多个union的相同结果提取出来为一个结果集,然后再和原union all中剩下的部分表做连接
优化器针对分区表的目标sql的一种优化手段,当指定目标sql中的分区表的某个局部分区索引由于某种原因在某些分区上变得不可用(unusable),
oracle将目标sql等级的改写成按分区union all的形式,不可用index union all可用index
11g r2引入
对同一个目标sql而言,oracle可能会采用不止一种的查询转换手段
是优化器处理带多表连接的目标的sql的一种优化手段,使用表与表之间通过外键相连的情形,还使用于表与表之间外连接的情况
优化器在处理带in字句的sql时,会将其转换为or,2者等价
优化器在处理带in的sql时,通常会采用以下4中方法
Inlist lterator
Inlist expansion
inlist filter
对in做子查询展开,或者既展开又做视图合并
-----针对in后面是常量集合的一种处理方法
需要注意的地方:1 inlist lterator是oracle针对in的首选处理方法
2 来处理in的前提条件是in所在的列一定要有index
3 不能让oracle强制走inlist lterator,没有相关的hint
---优化器把in后面的子查询所对应的结果集当做过滤条件,并且走filter执行计划
目标sql的in后面子查询不是常量的集合
Oracle未对目标sql进行子查询展开
4对in子查询展开/视图合并
In 后面不实常量
In后面的子查询可以展开