SQL调优之七:12C新特性

1,IN-MEMORY AGGREGATION 内存聚合

  这个要涉及到vector transformation的概念,内存聚合用来优化多个小表和一个大表之间的连接结果的聚合过程的CPU使用,多为数据仓库,连接的表,连接的列,group by的列很多的情况。

详细的解释可以看下这个链接:

http://raajeshwaran.blogspot.com/2015/12/vector-transformation-in-oracle-12c-aka.html

2, 对自适应查询计划的SQL监控

  • 显示一个查询计划是不是自适应的,并且显示它的当前状态:resolving以及resolved
  • 提供一个列表,允许查询当前,全部以及最终的查询计划

3,自适应SQL计划管理(SPM)

  SPM演进建议器能够允许你演进一个任务,重跑一个演进任务,以及生成报告。新的自动演进任务,SYS_AUTO_SPM_VOLVE_TASK,会在默认的维护窗口运行。

  这个维护任务会归类所有未被接受的执行计划,然后运行演进任务。如果这个任务发现了一个更优的执行计划,这个任务会自动接受这个计划。我们也可以手动运行DBMS_SPM包来调用演进任务。

4,自适应查询优化

  自适应查询优化是一系列新特性的集合。它能够让优化器在执行计划的运行过程中做调整,以及发现额外的信息来获得更优得统计信息:

  • 自适应查询计划

  自适应查询计划有一个内置的选项,允许一条语句的最终计划和默认计划不同。在第一次执行期间,在某一个子计划生效前,优化器会最终决定使用哪个选项。
  优化器基于在执行计划运行到这一步之前所观察到的来做这个最终决定。优化器这个功能可以调整执行计划来获得更好的性能。

  • 自动重优化

  当使用自动重优化的功能的时候,优化器会监控初始的执行计划。如果实际的执行计划和初始的执行计划有很大的不同,优化器就会记录下执行时的统计信息,然后在下一次运行的时候使用这些统计信息来获得更好的执行计划。数据库会使用在自动重优化期间获得的信息来自动生成SQL Plan directives.

  • SQL Plan Directive 执行计划指令

  在oracle 12c以前的版本,数据库会在share SQL area区域存放编译和执行的统计信息,这种存放不是永久性的。从这个版本开始,数据库可以使用SQL Plan directive,它是一些额外的信息和指令。优化器可以使用这些信息来生成一个更优的执行计划。数据库会在SYSAUX里面永久化的存储SQL Plan Directives。当生成一个执行计划的时候,优化器可以使用它来获得更多关于执行计划中对象的信息。

  • 动态统计信息提升

  在Oracle12C之前的版本,Oracle只在一个查询里面的一个或多个表没有统计信息的时候才会采用动态统计信息,以前的版本叫做动态采样(Dynamic sampling)。从这个版本开始,优化器自动决定动态统计信息是否有用,以及使用哪一个级别的动态统计信息。动态统计信息收集是永久化的,可以被其他查询使用。

5,新的柱状图类型

  12c多了最高频率以及混合型柱状图。如果一个列包含了超过254个唯一值,并且出现频率最高的254个值占据了所有数据的99%,那么数据库就会使用最高频率柱状图(top frequency histogram)。通过忽略这些非常不显眼的数据,数据库可以为那些占比很高的,出现频率很高的数据生成一个更高质量的柱状图。
混合型柱状图则是基于高度的柱状图的提升,是用来存储样本中每个端点的固定频率值,并且保证一个值不会同时被存储在多个bucket里面。

  同样的,普通的频率柱状图也有所提升。数据库在生成普通频率柱状图的时候,在NDV计算过程中,AUTO_SAMPLING是基于一次数据的全扫描,而不是一个小样本。这样子能够保证出现频率再小的数据也能够被放到正确的bucket里面。

6,监控数据库操作(monitor database operations)

  实时的数据库操作监控能够让你查看到运行时间太久的任务,比如说batch jobs,计划任务,以及ETL的抓捕,转化,载入任务。这个功能能够用来追踪业务相关的SQL,PL/SQL的运行进度。Oracle或者开发可以通过显示定义一个操作的开始和结束来监控业务操作,或者通过tag标签来定义一个操作进行隐式监控。

7,并发统计信息收集

  你可以同时在多个表,表分区,表子分区上收集统计信息。在多进程的环境,数据库可以减少收集统计信息的总时间。Oracle使用调度器和高级队列来创建和管理这些job。调度器决定基于系统资源来决定并发执行多少个任务,以及根据JOB_QUEUE_PROCESSES参数来决定有多少个队列。

8,DBMS_STATS包多了一个报告功能

  你可以以报告模式来运行DBMS_STATS包,在这个模式下,数据库不会真正去收集统计信息。而只是报告有哪些对象会被收集。

9,报告过去的统计信息收集操作

  你可以使用DBMS_STATS包来获取某一次指定的统计信息收集操作的报告,或者某个指定的时间段发生的统计信息操作的报告。

10,自动创建列组(Automatic Column Group Creation)

  对于一个Column Group的统计信息,数据库会把它们当成一个单元来收集。从Oracle12C开始,数据库自动判断在一次负载或者SQL Tuning Set里面哪些列应该被创建成一个组,然后自动创建它们。因此,对于任何工作情况,你不再需要知道哪些列必须创建成一个组了。

11,全局临时表的会话私有统计信息(session-private statistics for global temporary tables)

  从12C开始,对于每一个会话,全局临时表都会有不同的优化器统计信息。用户不再需要为每一个会话设置统计信息或者不用依赖于动态统计信息。
对于全局临时表的基数估算出错的可能性也就变得更小了。

12,SQL Test Case Builder的提升

  SQL Test Case Builder可以捕获以及重现SQL操作以及等待事件,能够让你基于相关的确定的动态易变的因素来诊断事故。这个功能对于并行查询和自动内存管理很有用。

13,对于批量加载的在线统计信息收集

  批量加载指的是一次create table as select或者insert into ... select操作。才12C以前的版本,你需要在批量加载后手动收集统计信息来避免因为过旧的统计信息导致的性能问题。从12C开始,数据库在这类型的操作后会自动收集统计信息。

14,在分区维护操作之后,自动重用synopses

  Alter table exchange是很常见的分区维护操作。在一次分区交换后,表分区的统计信息也会被交换。当分区表上INCREMENTAL的值设置为True的时候,会收集附加的统计信息,也就是synopsis。在12C以前的版本,你不能收集表级别的synopses。因此,在你做完交换分区后,你必须以incremetal的模式手动收集统计信息来创建丢失的synopses。从这个版本开始,你可以收集表级别的synopses,因此,当你和一个incremental模式的分区表做交换的时候,统计信息也能够被交换。

15,对于表分区统计信息过旧的,或者被锁定了的表,自动更新全局的统计信息

对于分区表来说,即便分区或者子分区的统计信息是过旧的以及锁定了的,增量的收集信息也可以计算出全局的统计信息。

16,Cube查询性能提升

减小了CPU和内存的消耗,并且减少了I/O。

废弃的特性:

  • Store outlines
  • CURSOR_SHARING的值是SIMILAR
posted @ 2019-09-22 18:03  Ryan_Wo  阅读(169)  评论(0编辑  收藏  举报