首页 运维杂谈Oracle 12C优化器的巨大变化,上生产必读(下)

Oracle 12C优化器的巨大变化,上生产必读(下)

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

在Oracle 12c数据库中,随着新的查询优化自适应方法的引入,还有对可用的统计信息的强化,优化器实现了一个巨大的飞跃。在《Oracle 12C优化器的巨大变化,上生产必读(上)》一文中,已经为大家介绍了优化器和其统计信息的一些新的特性,今天就让我们继续这个话题,一起来揭晓Oracle 12C其他的强大功能吧。

16、全局临时表上的会话级统计信息

全局临时表通常用于存储应用程序上下文中的中间结果。一个全局临时表的定义,是全系统中拥有适当权限的所有用户所共享的,但其数据永远是会话私有的。在全局临时表(必须是会话级临时表,PRESERVE ROWS ON COMMIT,提交时保留数据)上收集统计信息是行得通的;然而,在前一个版本中,收集到的统计信息会被所有访问这张表的会话所使用。如果不同会话之间在临时表中存储的数据量或者数据的性质有巨大差异,这样就不太理想了。

现在,每个使用临时表的会话都可以有一份单独的统计信息。临时表上共享的统计信息可以通过一个新的DBMS_STATS选项GLOBAL_TEMP_TABLE_STATS来进行控制。在缺省情况下,这个选项被设置为SESSION,意思是每个访问临时表的回航都会有自己的一套统计信息。优化器会试图先使用会话的统计信息,但是如果会话统计信息不存在,那么优化器会使用共享统计信息。如果你想回到以前的表现,即仅有一份统计信息被所有会话所使用,可以将GLOBAL_TEMP_TABLE_STATS选项设为SHARED。

Oracle 12C优化器

 (图25. 将全局临时表不共享统计信息的缺省表现修改为强制共享统计信息)

当通过直接路径操作往一张全局临时表中填充数据(提交时保留数据的那种),会话级的统计信息会被自动创建,这是由于统计信息在线收集的作用,它免除了额外运行统计信息收集指令的必要性,并且不会影响其他会话使用的统计信息。

Oracle12C优化器

(图26. 使用直接路径加载对全局临时表填充数据会导致会话级别的统计数据被自动收集)

17、DBMS_STATS包中的新的报告子程序

对于任何一个系统,为了维持一个可接受的性能水平,知道何时收集、如何收集及时的统计信息是至关重要的。想要确定一个环境中正在执行的是什么样的统计信息收集操作,对统计方法的变动将会如何影响系统,这可能是一项困难且耗时的任务。在Oracle 12c数据库中, 新的报告子程序被加入到DBMS_STATS包中,使得我们更易于监控何种统计收集活动正在进行,以及对这些操作的参数进行修改会有什么影响。

REPORT_STATS_OPERATIONS

这个新函数生成一个报表,显示的是关于在特定的时间窗口内发生了何种统计收集活动的详细信息。报表给出的细节包括每种操作何时发生,状态如何,覆盖了多少个对象。报表可以输出为文本或者HTML格式。

Oracle12C优化器

(图27. 生成一个新的 DBMS_STATS.REPORT_STATS_OPERATIONS 报表)

REPORT_SINGLE_STATS_OPERATION

这个新函数生成一个关于指定的统计信息收集操作的详细报表。

REPORT_GATHER_*_STATS

这组新的函数实际上并不会收集统计信息,但是会报告一个对象的列表:假如对应的GATHER_*_STATS过程被以相同的参数设定所调用,哪些对象将会被处理。REPORT_GATHER_*_STATS接受的输入参数和对应的GATHER_*_STATS过程相同,多了两个额外参数:详细级别(detail_level)以及格式(format)。

Oracle12C优化器

(图28. 生成新的DBMS_STATS.REPORT_GATHER_SCHEMA_STATS 报表)

18、新的优化技术

在查询优化的过程中,Oracle会使用一系列复杂的技术对SQL语句进行变换。查询优化的这个阶段的目标是为了将原来的SQL语句变换为一个语义上等价、但是处理起来更加高效的SQL语句。Oracle 12c数据库引入了几种新的查询优化方法。

19、部分连接取值

部分连接取值是这样一种优化技术,它是在连接顺序的生成过程中被使用的。这种技术的目标是为了避免产生重复的行,如果不用这种技术,这些重复只能在计划中随后用一个DISTINCT操作符来去除。通过早些用一个内连接(INNER JOIN)或者半连接(SEMI-JOIN)来取代DISTINCT操作符,这一步骤产生的行数将会减少。这应该会使得计划的总体性能得到改善,因为随后的步骤只需在缩小的行的集合上进行操作。

这种优化可以应用在如下类型的查询块:MAX(),MIN(), SUM(distinct), AVG (distinct), COUNT (distinct), 以及UNION, MINUS, INTERSECT 操作符的分支, [NOT] EXISTS 子查询等等。

考虑如下的DISTINCT查询:

Oracle12C优化器

 

 

本文链接:https://www.yunweipai.com/6809.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部