在Oracle数据库的早期版本中,统计信息收集(如通过DBMS_STATS包)是串行执行的,即一次仅处理一个表或分区。对于大规模数据库或数据仓库环境,这种串行模式可能导致统计信息收集耗时过长,影响维护窗口效率。Oracle 12c R1引入了并发统计信息收集(Concurrent Statistics Collection)功能,允许同时处理多个表、分区或子分区的统计信息,显著缩短收集时间。
启用并发统计信息收集需进行以下配置:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'default_plan';
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 4;
注:过高的并发可能影响性能,需结合Resource Manager限制。
通过DBMS_STATS.SET_GLOBAL_PREFS设置全局参数:
EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT', 'ALL');
参数可选值:
以并发模式收集模式(Schema)级别的统计信息:
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');
SELECT JOB_NAME, STATE, COMMENTS
FROM DBA_SCHEDULER_JOBS
WHERE JOB_CLASS LIKE 'CONC%';
示例如下:
CONN test/test@pdb1
DROP TABLE tab1 PURGE;
CREATE TABLE tab1 AS
SELECT level AS id,
'Description for ' || level AS description
FROM dual
CONNECT BY level <= 10000;
EXEC DBMS_STATS.delete_table_stats(USER, 'TAB1');
EXEC DBMS_STATS.gather_table_stats(USER, 'TAB1');
*
ERROR at line 1:
ORA-20000: Unable to gather statistics concurrently: insufficient privileges
ORA-06512: at "SYS.DBMS_STATS", line 34634
ORA-06512: at line 1
SQL>
必须授予用户DBA角色,或者更明智地授予CREATE JOB、MANAGE SCHEDULER和MANAGE ANY QUEUE权限。
CONN sys@pdb1 AS SYSDBA
GRANT CREATE JOB, MANAGE SCHEDULER, MANAGE ANY QUEUE TO test;
PL/SQL procedure successfully completed.
示例如下:
conn test/test@pdb1
EXEC DBMS_STATS.gather_table_stats(USER, 'TAB1');
*
ERROR at line 1:
ORA-20000: Unable to gather statistics concurrently: Resource Manager is not
enabled.
ORA-06512: at "SYS.DBMS_STATS", line 34634
ORA-06512: at line 1
SQL>
解决方案:
CONN sys@pdb1 AS SYSDBA
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = default_plan;
conn test/test@pdb1
EXEC DBMS_STATS.gather_table_stats(USER, 'TAB1');
PL/SQL procedure successfully completed.
SQL>
Oracle 12c的并发统计信息收集功能通过多Job并行处理机制,显著提升了大规模数据库的统计信息收集效率。合理配置资源管理策略、权限及并发参数是关键。用户需结合实际场景权衡并发度与系统负载,以实现性能与稳定性的平衡。