简单过滤谓词推入,即简单地将主查询中的作用于视图的过滤谓词推入视图中。简单过滤谓词推入是启发式查询转换技术,只要满足条件就会进行转换。
上述查询中,主查询中的过滤条件"STATUS"=:A 被推入了视图的查询语句中。
谓词迁移(Predicate Move Around)
谓词迁移是指在对多个视图的复杂查询中,将其中一个视图的谓词条件提取(Pull Up)出来, 并推入(Push Down)另外的视图中,成为其谓词的一部分。
提示:谓词迁移可以通过优化器参数_pred_move_around 控制。
以下例子即发生谓词迁移的语句。
上述例子中,视图 V2 的谓词条件"OWNER">'A’被迁移至了视图 V1 当中。
“或”操作扩张(OR Expansion)
如果查询语句的 WHERE 子句由多个条件以 OR 关联组成,那么查询转换器则会尝试将查询转换为多个等价的子查询,并将这些子查询拼接(Concatation)起来,这样的转换技术就称为“或”扩张。
提示:如果 OR 关联的条件都为同一字段时,查询转换器则不会对其进行“或”扩张。是否对语句进行“或”扩张转换,可以由优化器参数_no_or_expansion(TRUE 为禁止“或”扩张)和提示OR_EXPAND 控制。在计划概要数据中,可以由 USE_CONCAT 判断该执行计划是否由“或”扩张转换后生成。
在上述例子中,OR 关系表达式的谓词条件被扩展成对表的两次访问,并将它们的结果集进行拼接。
物化视图查询重写(Materialized View Re-write)
我们知道,视图是一个逻辑对象,其实质就是一条查询语句。而在 Oracle,存在一种特殊对象,物化视图(Materialized View,MV),它是一个物理对象,其数据被存储在相应的段(Segment)上,其内容由一条查询语句决定。因此,执行构造物化视图的查询语句或者与该语句兼容的查询语句时,直接读取物化视图上面的数据会比读取相关表对象上面的数据效率更高。当查询转换器发现 一个查询或子查询的逻辑结构与一个物化视图相兼容时,它能将其重写成对物化视图的查询,从而 提高语句的整体性能。
提示:是否进行查询重写,可以由参数 query_rewrite_enabled 或者提示 REWRITE/NO_REWRITE 控制。
示例:
上面例子中,物化视图 MV_TABLES 的定义语句为:
而上例的查询语句中,以下部分:
与定义物化视图 MV_TABLES 的查询语句兼容,并且过滤条件 created>:A 中的字段亦为物化视图所有的字段,因而该语句被重写为对物化视图的查询。重写后的语句,与下面的语句等价:
集合操作关联转变(Set Join Conversion,SJC)
当查询中存在集合操作(INTERSECT、MINUS)时,查询转换器可以将进行集合操作的子查询转 变为关联(Join)查询,这样的转换就称为集合操作关联转变(Set Join Conversion)。
提示:尽管该项技术在 10g 时被引入,但在目前为止(11.2.0.1),所有版本中其默认为关闭。可以通过优化器参数_convert_set_to_join 和提示 SET_TO_JOIN/NO_SET_TO_JOIN 控制其是否启用。
INTERSECT 转换为内连接
INTERSECT 是属于数据集合操作中的交集操作,转换器能将其转换为内连接操作。
上述例子中,INTERSECT 操作被消除,取而代之的是哈希关联操作。
MINUS 转换为反连接
MINUS 是属于数据集合操作中的集合相减操作,转换器能将其转换为反连接操作。
上述例子中,MINUS 操作被消除,取而代之的是嵌套循环反关联操作。
由约束(Constraint)生成过滤谓词
当查询语句中谓词条件或关联条件的字段上存在约束(非空约束、检查约束)时,优化器会将 约束内容考虑进来,决定是否由其生成新的谓词过滤条件。
在上例中,字段 T_OBJECTS.STATUS 上存在约束 T_OBJECTS_STATUS_CK,限制其内容为’VALID’或’INVALID’。查询转换器结合该约束内容与语句中的过滤条件 status='NOTEXIST’共同考虑,为该执行计划生成了一个 FILTER 操作(NULL IS NOT NULL),从而避免了不必要的读取操作。从执行计划的估算代价来看,尽管操作 2 的估算代价为 2,但是因为 FILTER 的存在,使得该操作不可能被实际执行到,因而最终估算代价为 0。
从 10053 事件的跟踪内容也可以看到这一过滤条件的产生过程: