问题描述
查看 dba_optstat_operations 发现2026-02-09 为周一但是 gather_database_stats (auto) 在2026-02-09 (02时,06时,10时,14时) 白天执行了4次自动统计信息收集

查看Scheduler windows显示周一的执行窗口开始时间为22时,总时长为4h,与我们查出来的实际执行时间不相符

下面我们将针对两个疑点进行解答:
问题1:为何每隔4小时多次运行自动统计信息收集?
问题2:2/9 为周一,按照Scheduler windows结果,周一的执行时间应为22时,为何在白天时间段运行?
分析:为何每隔4小时多次运行自动统计信息收集?
参考19c官方手册:
官方手册里提到:如果维护窗口时长很长,则除Automatic SQL Tuning Advisor以外的所有自动维护任务都会每隔四小时重新开始运行。此功能可以确保维护任务定期运行,无论窗口的大小如何。
这里说明了为何会出现每4h执行一次统计信息收集
分析:2/9 为周一,按照Scheduler windows结果,周一的执行时间应为22时,为何在白天时间段运行?
参考官方文档:KB140350
官方文档中提到,由于在12c,18c,19c 中使用DBCA通用模板创建数据库时,CDB与PDB中Scheduler默认时区不同。
使用DBCA通用模板建库时无论CDB的Scheduler默认时区如何,在19c中PDB的Scheduler 默认时区为PST8PDT,这是Oracle预期行为。
查看环境中CDB$ROOT与PDB的Scheduler 默认时区果然不同

PRC时区与PST8PDT时区在非夏令时期间相差16h。
通过 dba_autotask_job_history 中的WINDOW_STATR_TIME 与 JOB_START_TIME的差异也可以看出 UTC 的2月11日14时对应的PST8PDT 2月10日 22时,两个时间确实相差16h

通过这个结论换算一下 UTC的2月9日2时、6时、10时、14时实际为PST8PDT的2月8日10时、14时、16时、20时,2月8日为周天,按照预期是在白天执行的自动统计信息收集,再结合前面得出的每4h跑一次scheduler的结论,换算后的执行时间完全符合预期

问题结论
问题1:为何每隔4小时多次运行自动统计信息收集?
解答:参考19c官方手册,如果维护窗口时长很长,则除Automatic SQL Tuning Advisor以外的所有自动维护任务都会每隔四小时重新开始运行。此为Oracle的预期行为。
问题2:2/9 为周一,按照Scheduler windows结果,周一的执行时间应为22时,为何在白天时间段运行?
解答:参考官方文档KB140350,2月9日周一白天运行自动统计信息收集任务的原因实际为CDB$ROOT Scheduler默认时区(PRC)比PDB Scheduler默认时区(PST8PDT)快16h导致的差异,PDB层面是按照PST8PDT的Scheduler时区执行的自动调度任务,也就是按照PST8PDT时区2月8日6时的周日调度任务,实际在北京时间2月8日22时开始执行,结合前一个结论间隔4小时运行一次,也会在2月9日2时、6时、10时、14时再调度一次。
解决方案
1.调整PDB的Scheduler默认时区与CDB$ROOT一致,若对生产无影响,不建议调整,以避免产生其他未知的问题
参考官方文档 KB139437
在PDB中执行
sql
--查看PDB当前scheduler时区与时间戳
select dbms_scheduler.stime from dual;
--在PDB中修改Scheduler默认时区与CDB$ROOT一致
exec DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone','PRC');
--再次PDB查看当前scheduler时区与时间戳
select dbms_scheduler.stime from dual;
select * from dba_scheduler_global_attribute where ATTRIBUTE_NAME like '%TIMEZONE%';
2.后续使用DBCA通用模板创建数据库,请设置PDB Scheduler 的默认时区
