暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于代价查询转换

原创 由迪 2020-09-02
1656

在进行基于代价的查询转换时,转换器先确认查询是否满足转换条件。一旦满足,则会对各种可行的转换方式进行枚举,并对它们进行代价估算,找到代价最低的方式。由此可见,相对启发式 转换,基于代价的查询转换是一个相当消耗资源(CPU 和内存)的过程。

提示:Oracle 中有一个优化器参数,_OPTIMIZER_COST_BASED_TRANSFORMATION,来控制是否进行基于代价的查询转换,以及如何进行基于代价的查询转换,从而限制其对资源的消耗。

复杂视图合并(Complex View Merging,CVM)
查询转换器对含有 DISTINCT、GROUP BY 的视图进行的合并称为复杂视图合并。
提示:要进行复杂视图合并,需要确保视图合并(参数_complex_view_merging 控制)功能和复杂视图合并功能(由优化器参数_complex_view_merging 控制,默认为 TRUE)都打开。
image.png
image.png
在上例中,V_OBJECTS_SUM 是含有 GROUP BY 子句的视图,与主查询合并后,视图中的对象与主查询中的对象直接关联。

关联谓词推入(Join Predicate Push-Down,JPPD)
新关联谓词推入转换属于基于代价的转换,如果没有特别说明,我们所说的关联谓词推入都指新的关联谓词推入。

外关联的谓词推入
语句存在外关联匹配时,转换器可以关联谓词条件推入视图的查询语句中,从而使之成为其子计划的访问谓词条件。
image.png
image.png
image.png
上述查询中,关联条件"OWNER"=“T”.“OWNER” AND “OBJECT_NAME”=“T”.“TABLE_NAME"被推入
了视图的查询语句中,从而成为了其子计划的访问条件。
联合查询视图连接查询的谓词推入
转换器将关联条件被推入含有联合操作(UNION 或者 UNION ALL)查询的视图的中,并使之成为联合查询视图中两个子查询的谓词。
image.png
image.png
image.png
谓词提取(Predicate Pull Up)
所谓谓词提取,是指将视图(子查询)谓词中的复杂的、代价高昂的过滤条件提取出来,放到 主查询中进行过滤。
提示:谓词提取可以通过优化器参数_optimizer_filter_pred_pullup 及提示 pull_pred/no_pull_pred 控制。
image.png
image.png
image.png
从上述内容可见,操作 3 的过滤谓词是由视图中提取出来的。
4.2.4 Group By 配置(Group By Placement)
Group By 配置是一项用一个 Group By 视图来替换复杂查询中的一个或多个表的优化技术。要进行 Group By 配置的查询转换,需要满足以下条件:
1、外部主查询的 FROM 子句中最少有 2 张表;
2、外部主查询包含了 Group By 的操作;
3、外部主查询中包含了一个对某张表的一个字段的聚集函数的查询。
提示:Group By 配置可以通过优化器参数”_optimizer_group_by_placement"或提示
PLACE_GROUP_BY/NO_PLACE_GROUP_BY 控制。
(以下示例在 11.2.0.1 中运行):
image.png
image.png
在上例中,由于进行了 Group By 配置转换,执行计划先对表 T_TABLES 进行了 Group BY 操作, 然后再与表 T_DATAFILES 关联。
表扩张(Table Expansion,TE)
在对分区表进行查询时,如果发生这样的情形:查询条件能够命中分区表上的本地分区索引, 但此时本地分区索引的某个分区的索引发生异常,导致该分区上的索引无法被使用。在 11gR2 之前, 这种情况下,该分区索引将彻底无法使用;而在 11gR2 之后,引入了表扩张的查询转换技术,使得优化器可以针对索引状态对不同分区评估是否使用索引。
提示:表扩张可以通过优化器参数"_optimizer_table_expansion"或提示
EXPAND_TABLE/NO_EXPAND_TABLE 控制。
(以下示例在 11.2.0.1 中运行):
image.png
image.png
上述例子中,表 T_OBJECTS_LIST 是一张列举分区表,其中,PART4 的列举值是’SYSTEM’:
image.png
查询转换器将语句按照本地索引 t_objects_list_idx3 在不同分区上的状态将语句重写为一个UNION-ALL 查询。其中,第一个子查询是访问所有分区,并过滤掉索引状态为 UNUSABLE 的分区(“O”.“OWNER” IS NULL OR “O”.“OWNER”<>‘SYSTEM’)上的数据;第二个子查询是对单个分区(PARTITION LIST SINGLE)的访问,由查询计划中 Pstart & Pstop 可以知道是访问 PART4。
关联因式分解(Join factorization,JF)
关联因式分解是 11gR2 中引入的新的查询重写技术。它可以将 UNION/UNION-ALL 查询中的子查询合并为一个内联视图。
提示:关联因式分解可以通过优化器参数"_optimizer_join_factorization"或提示
FACTORIZE_JOIN/NO_FACTORIZE_JOIN 控制。
image.png
image.png
image.png
上述例子中,两个子查询被合并为一个对 T_USERS 查询的 UNION-ALL 内联视图,系统自动命名为 VW_JF_SET$A6672D85,然后再与表 T_OBJECTS 做关联。
4.2.7 DISTINCT 配置(Distinct Placement,DP)
对关联(JOIN)查询结果取 DISTINCT 值时,DISTINCT 配置能用一个含有 DISTINCT 的内联视图对查询进行重写。这项查询重写技术在 11gR2 引入。
提示:DISTINCT 配置可以由优化器参数"_optimizer_distinct_placement"或提示
PLACE_DISTINCT/NO_PLACE_DISTINCT 控制。
(以下示例在 11.2.0.1 中运行):
image.png
image.png
上述例子中,语句被转换为以下查询:
image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论