聚焦Oracle数据库中统计信息收集的性能优化,详解并行与并发两种方式的差异及应用场景。














就是默认值变成了
DBMS_STATS.AUTO_DEGREE。什么意思呢?就是Oracle会根据对象的大小和并行参数的设置情况,自动决定用多少个并行进程。
当然可以。比如你可以设置
DEGREE=4,就是强制用4个并行进程。不过要注意的是,Oracle并不能并行收集所有类型的索引。
主要是三类:
cluster indexes domain indexes bitmap join indexes
是的,并发收集是从11.2.0.2版本才开始支持的。它解决的问题是什么呢?就是说,并行收集只是解决了单个对象内部的问题,但如果我要收集100个表的统计信息,还是得一个接一个地处理。
所以并发收集就来了。它允许同时启动多个Job,真正实现了多个对象的同时处理。而且从12.1.0.1版本开始,连自动统计收集任务都能用上这个功能了。
主要有三个。
首先是CONCURRENT参数,需要通过 DBMS_STATS.SET_GLOBAL_PREFS
来设置。其次是JOB_QUEUE_PROCESSES参数,这是控制最大Job数量的。 最后还要启用Resource Manager。
不是的。在11.2.0.2到11.2.0.4的版本上,CONCURRENT参数只能设置成TRUE或FALSE。但从12c开始,可以设置更灵活的值了。
就是说,如果某个表或者分区特别小,Oracle为了节省资源,会把多个小对象合并到一个Job里执行。这样在外部监控的时候,就看不到明显的并发效果了。
分区表的处理比较特殊。Oracle会为每个分区分配一个Job,但为了避免死锁,分区表的处理是排队的——一次只能处理一个分区表,其他要等前面的处理完了才能开始。
可以通过查看作业队列来监视。比如说,你会看到针对每个对象都有一个单独的Job在执行。如果是分区表,还会有一个协调Job加上各个分区的Job。
这是个好问题。虽然Resource Manager这个功能是Enterprise Edition专有的,但因为Standard Edition内部也会用到Resource Manager的一些能力,所以实际上是可以并发执行的。
对,就是这个意思。不过要注意,11.2.0.3到11.2.0.4版本上,CONCURRENT参数默认是OFF的,需要手动开启。
有,一个很重要的点是并行和并发的组合使用。如果两个都用,效率会更高,特别是在处理非常大的表或者分区的时候。
就是同时设置DEGREE和CONCURRENT两个参数。不过有个技巧,就是要把
parallel_adaptive_multi_user参数设为False。
因为在并发模式下,Oracle已经有自己的调度机制了。如果两个自适应机制同时工作,反而会互相干扰,可能导致并行度不如预期的效果。
嗯,在11.2.0.3的版本上,有一个batching threshold的概念。就是当对象太小的时候,Oracle会把它们合并到一个Job里处理,而不是真的并发。
很遗憾,这个阈值是Oracle内部决定的,用户不能直接修改。它受环境、资源利用率等多种因素影响。
其实可以通过设置PARALLEL参数来间接实现。因为大对象会自动获得更多的并行度,即使JOB数量不多,单个Job的效率也很高。
这个可以通过obj_filter_list参数来实现。你可以构造一个OBJECTTAB,里面包含你想要并发收集的表名,然后把这个列表传给DBMS_STATS。
大概是这样:先创建一个表或者视图,存放你要收集的表名,然后调用
DBMS_STATS.SET_TABLE_PREFS或者
SET_SCHEMA_PREFS,结合CONCURRENT参数使用。
当然有。比如作业队列进程数(JOB_QUEUE_PROCESSES)要设置够大,否则并发Job太多会导致排队。还有Resource Manager的计划要配置好,确保有足够的系统资源。
是的,特别是当你有成百上千个表需要定期收集统计信息的时候,并发模式能节省大量时间。当然,前提是要根据实际情况合理配置参数。
好,今天的分享就到这里。感谢大家的收听,我们下期再见!
文章转载自SQL和数据库技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




