Oracle自动收集统计信息JOB失败解决
Oracle自动收集统计信息JOB总是失败,原因大都因为数据量较大,在预计的时间窗口内统计信息未收集完毕。
1、查看JOB运行状态
SQL> SELECT LOG_ID, JOB_NAME, STATUS, ADDITIONAL_INFO
2 FROM DBA_SCHEDULER_JOB_LOG
3 WHERE JOB_NAME = ‘GATHER_STATS_JOB’
4 AND STATUS <> ‘SUCCEEDED’
5 ORDER BY 1
6 /
LOG_ID JOB_NAME STATUS ADDITIONAL_INFO
———- —————- ———- —————————————————————–
6207 GATHER_STATS_JOB STOPPED REASON=”Stop job called because associated window was closed
”
6228 GATHER_STATS_JOB STOPPED REASON=”Stop job called because associated window was closed
”
6231 GATHER_STATS_JOB STOPPED REASON=”Stop job called because associated window was closed
”
6305 GATHER_STATS_JOB STOPPED REASON=”Stop job called because associated window was closed
”
SQL>
可见ADDITIONAL_INFO原因基本为:REASON=”Stop job called because associated window was closed”
2、查看下dbms_stats默认的参数设定
SQL> SELECT SNAME AS PARAMETER, NVL(SPARE4, SVAL1) AS DEFAULT_VALUE
2 FROM SYS.OPTSTAT_HIST_CONTROL$
3 /
PARAMETER DEFAULT_VALUE
—————————— ——————————
SKIP_TIME
STATS_RETENTION 31
TRACE 0
DEBUG 0
SYS_FLAGS 1
CASCADE DBMS_STATS.AUTO_CASCADE
ESTIMATE_PERCENT DBMS_STATS.AUTO_SAMPLE_SIZE
DEGREE NULL
METHOD_OPT FOR ALL COLUMNS SIZE AUTO
NO_INVALIDATE DBMS_STATS.AUTO_INVALIDATE
GRANULARITY AUTO
AUTOSTATS_TARGET AUTO
12 rows selected.
SQL>
3、用如下命令可以调整一下参数设定
SQL> execute dbms_stats.set_param(pname => ‘DEGREE’, pval =>2);
SQL> execute dbms_stats.set_param(pname => ‘ESTIMATE_PERCENT’, pval =>2);
调整后结果如下:
SQL> SELECT SNAME AS PARAMETER, NVL(SPARE4, SVAL1) AS DEFAULT_VALUE
2 FROM SYS.OPTSTAT_HIST_CONTROL$
3 /
PARAMETER DEFAULT_VALUE
—————————— ——————————
SKIP_TIME
STATS_RETENTION 31
TRACE 0
DEBUG 0
SYS_FLAGS 1
CASCADE DBMS_STATS.AUTO_CASCADE
ESTIMATE_PERCENT 1
DEGREE 2
METHOD_OPT FOR ALL COLUMNS SIZE AUTO
NO_INVALIDATE DBMS_STATS.AUTO_INVALIDATE
GRANULARITY AUTO
AUTOSTATS_TARGET AUTO
12 rows selected.
SQL>
4、其它说明
GATHER_STATS_JOB默认ESTIMATE_PERCENT是AUTO,由ORACLE自动选取大小,在实际中这个选取的基本是100%,如果数据量大,在规定的时间窗口自然收集不完。经过上面的参数调整实际观测可以很好解决问题。
近期评论