快速地收集统计信息小技巧

通常情况下,可以通过调整采样比例,增加并行度得方式来加速收集统计信息。
总结一些小技巧:

1. 方法1- AUTO_DEGREE

为指定表定义一个特定的并行度

exec dbms_stats.set_table_prefs(user, 'BIG_TABLE', 'DEGREE', 8)

让Oracle为你来决定并行度:

exec dbms_stats.set_table_prefs(user, 'BIG_TABLE', 'DEGREE', DBMS_STATS.AUTO_DEGREE)

一个清晰且简单的方法是在全局级别设置该属性:

exec dbms_stats.set_global_prefs('DEGREE', DBMS_STATS.AUTO_DEGREE)

2. 方法2 - CONCURRENT

首先,关闭并行执行:

exec dbms_stats.set_global_prefs('DEGREE', 1)

CONCURRENT偏好参数允许DBMS_SCHEDULER一次启动多个统计信息收集任务,因此,数据库会并发的在多个表和表分区上收集统计信息。我们可以仅为自动统计信息收集启用该行为:

exec dbms_stats.set_global_prefs('CONCURRENT','AUTOMATIC')

如果你启用了数据库资源管理计划,你可以为手动统计信息收集使用并发,或者手动统计信息和自动统计均使用:

exec dbms_stats.set_global_prefs('CONCURRENT','MANUAL')
exec dbms_stats.set_global_prefs('CONCURRENT','ALL')

3. 方法3 - CONCURRENT and AUTO_DEGREE

同时启用CONCURRENT and AUTO_DEGREE,即多个任务将启动,且每一个任务潜在会启动多个并行查询服务,这会产生非常高的系统负载,酌情使用。你可以通过以下的方法,缓解启动过多并行执行服务的风险:
file

允许自动统计信息收集任务使用并发:

exec dbms_stats.set_global_prefs('CONCURRENT','AUTOMATIC')

设置全局性的AUTO_DEGREE:

exec dbms_stats.set_global_prefs('DEGREE', DBMS_STATS.AUTO_DEGREE)

或者,针对特定的大表:

exec dbms_stats.set_table_prefs(user, 'BIG_TABLE', 'DEGREE', DBMS_STATS.AUTO_DEGREE)

总结:

一般来说,如果你有很多的大表,方法1最有可能让你快速收集。如果你有大量空闲的机器资源和大量的小表,推荐方法2。
方法3需要更加小心,避免启动过多的并行执行服务。

file

原文有方法对应资源使用情况的测试,可以参考
原文链接:https://blogs.oracle.com/optimizer/post/how-to-gather-optimizer-statistics-fast

Related Posts