聚集子查询消是一项除利用窗口函数移除子查询(Remove Subquery using Window functions,
RSW)的优化技术。
提示:聚集子查询消除可以由优化器参数"_remove_aggr_subquery"控制。
上述例子中,从执行计划中看到“WINDOW BUFFER”操作,子查询已经被转换为聚集函数。在 11g 中对上述优化器解析过程做 10053 事件跟踪,可以在跟踪记录中找到转换后的语句:
DISTINCT 聚集函数转换(Distinct Aggregate Transformation)
在 Oracle 10gR2 中,引入了哈希分组的方法来计算聚集函数,在数据量比较大时,这种方法比传统的排序分组方法效率更高。但是,对于那些对唯一值(含有 DISTINCT/UNIQUE)的聚集函数, 由于要消除重复值,因此还是要使用排序分组的方法。在 11gR2,引入了一项新的查询转换技术, 将含有 DISTINCT 的聚集函数转换为一个聚集内联视图,使得查询同样可以利用哈希分组的方法来计算聚集函数。
提示:DISTINCT 聚集函数转换可以由优化器参数"_optimizer_distinct_agg_transform"或提示
TRANSFORM_DISTINCT_AGG/NO_TRANSFORM_DISTINCT_AGG 控制。
(以下示例在 11.2.0.1 中运行):
在上例中,“distinct table_name”被转换成一个聚集内联视图(VW_DAG_0)。对上述语句做10053 事件跟踪,可以看到以下转换信息:
并且,我们还可以从跟踪信息中看到被转换后的语句。
选择字段裁剪(select list pruning,SLP)
选择字段裁剪可以将视图中不必要被选择的字段去除掉,从而避免查询采用效率低下的访问路径。这是一项启发式的查询转换技术。
上述例子中,优化器将内联视图中除 owner 和 table_name 以外的所有字段都移除了。对上述语句做 10053 事件跟踪(11g 中),可以看到以下的转换信息:
DISTINCT 消除(Distinct Elimination)
DISTINCT 消除技术可以将语句中不必要的 DISTINCT 去除掉,从而生成更加高效执行计划。该技术在 11g 中引入。
提示:DISTINCT 消除可以由优化器参数"_optimizer_distinct_elimination"控制。
(以下示例在 11.2.0.1 中运行):
上例中,由于索引 T_USERS_UK 是一个唯一索引,由其读到的数据必定是唯一的,因而
DISTINCT 可以从语句中消除掉。
DISTINCT 推入(Distinct Push Down)
DISTINCT 推入使得优化器在生成含 DISTINCT 的反关联(ANTI-JOIN)查询的执行计划时,优先执行 DISTINCT 的相关操作。
提示:DISTINCT 推入可以由优化器参数"_optimizer_push_down_distinct"控制,0 为禁止进行
DISTINCT 推入转换、100 为始终进行 DISTINCT 推入转换,默认为 0。
在上例,DISTINCT 推入转换使得 DISTINCT 相关的操作成为关联操作的子操作。
集合分组查询转换(Grouping Set To Union)
集合分组查询转换将集合分组查询转换为 UNION-ALL 查询。示例参见下例。
提示:集合分组查询转换可以由提示 EXPAND_GSET_TO_UNION/NO_EXPAND_GSET_TO_UNION 控制。
集合分组查询重写(Grouping Set Rewrite)
集合分组查询重写将集合分组查询转换为 UNION-ALL 查询,重写为兼容的物化视图。提示:集合分组查询重写可以由优化器参数"_union_rewrite_for_gs"或提示
在上例中,物化视图 MV_OBJECTS_GP 的定义语句为:
查询转换器首先将聚合分组查询(GROUP BY ROLLUP)展开,重写为 UNION ALL,然后将其中一个子查询重写为对物化视图 MV_OBJECTS_GP 的查询。
从 10053 事件的跟踪中,可以看到上述语句被重写为下面的语句: