Oracle 19c自动统计信息收集默认开启,但仅在MAINTENANCE_WINDOW_GROUP维护窗口内、针对满足行数变化超10%或超15天未更新等条件的对象执行,受STATISTICS_LEVEL、对象锁定及窗口状态多重限制。
Oracle 19c 自动统计信息收集默认开没开?
默认是开的,但只在预设的维护窗口(maintenance_window_group)内运行,且仅针对满足条件的对象(比如表行数变化超10%、上一次统计信息超15天未更新等)。很多人以为“开了就天天跑”,其实它非常保守——不满足阈值、不在窗口期、对象被锁住或禁用,都会跳过。
-
DBMS_STATS.LOCK_TABLE_STATS或NO_INVALIDATE => TRUE后的表不会被自动收集 - 维护窗口默认只在工作日夜间和周末全天开放,具体看
DBA_SCHEDULER_WINDOWS - 如果数据库刚升级或新建,
STATISTICS_LEVEL参数为BASIC会直接禁用自动任务
怎么查当前维护窗口和实际运行时间?
别猜,直接查调度视图。自动收集由 ORA$AT_OS_OPT_SY_<n></n> 这类作业驱动,背后绑定的是 MAINTENANCE_WINDOW_GROUP 窗口组,而窗口本身定义了真正的时间段。
- 查窗口启用状态:
SELECT WINDOW_NAME, ENABLED, ACTIVE FROM DBA_SCHEDULER_WINDOWS WHERE WINDOW_NAME LIKE 'WEEKNIGHT%' OR WINDOW_NAME LIKE 'WEEKEND%'; - 查最近一次执行记录:
SELECT LOG_DATE, JOB_NAME, STATUS, ACTUAL_START_DATE FROM DBA_SCHEDULER_JOB_LOG WHERE JOB_NAME LIKE 'ORA$AT_OS_OPT_SY%' ORDER BY LOG_DATE DESC FETCH FIRST 5 ROWS ONLY; - 查窗口具体时间段:
SELECT WINDOW_NAME, REPEAT_INTERVAL, DURATION FROM DBA_SCHEDULER_WINDOWS WHERE WINDOW_NAME IN (SELECT WINDOW_NAME FROM DBA_SCHEDULER_WINGROUP_MEMBERS WHERE WINDOW_GROUP_NAME = 'MAINTENANCE_WINDOW_GROUP');
想改时间间隔或延长窗口,该动哪个参数?
不能直接“调间隔”,因为 Oracle 不提供类似 every 6 hours 的配置;它是靠窗口的 REPEAT_INTERVAL(基于 Scheduler 表达式)和窗口时长 DURATION 共同决定的。改窗口比改任务更安全,也更符合设计逻辑。
- 延长某窗口时长(比如把
WEEKNIGHT_WINDOW从 4 小时拉到 6 小时):EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('WEEKNIGHT_WINDOW', 'DURATION', NUMTODSINTERVAL(6, 'HOUR')); - 调整重复周期(比如让周末窗口从周六早8点开始):
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('WEEKEND_WINDOW', 'REPEAT_INTERVAL', 'FREQ=DAILY;BYDAY=SAT,SUN;BYHOUR=8;BYMINUTE=0'); - ⚠️注意:
REPEAT_INTERVAL是 Scheduler 表达式,不是 cron;写错会导致窗口失效,且不会报错,只会静默不触发
手动触发或临时禁用自动收集,有哪些干净做法?
运维中常需要“立刻收一次”或“上线前先停掉”,但别用 DBMS_STATS.LOCK_SCHEMA_STATS 这种重操作——它会阻塞后续所有统计信息更新,包括手动调用。优先走调度层控制。
- 临时禁用(不影响其他维护任务):
EXEC DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);→ 改成'auto optimizer stats collection' - 立即手动触发一次(等价于自动任务逻辑):
EXEC DBMS_AUTO_TASK_IMMEDIATE.PROCESS_CLIENT('auto optimizer stats collection'); - 检查是否真禁用了:
SELECT CLIENT_NAME, STATUS FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME = 'auto optimizer stats collection';
复杂点在于:窗口修改后不会立即生效,要等下次窗口开启才应用;而禁用/启用操作是即时的,但只影响下一轮调度周期。容易被忽略的是——如果正在运行的收集卡住了(比如某张大表 ANALYZE hang 住),整个窗口会等到超时(默认 8 小时)才退出,期间其他窗口任务也被阻塞。











