看看最近是否收集失败
SET LINES 200 PAGES 0
SET LONG 100000 longc 100000
COLUMN REPORT FORMAT A200VARIABLE stat_report CLOB;
BEGIN:stat_report := DBMS_STATS.REPORT_STATS_OPERATIONS (since => SYSDATE-3
, until => SYSDATE
, detail_level => 'TYPICAL'
, format => 'TEXT'
);
END;
/
print stat_report;
通过operation可以看到收集过程还包括清理统计信息(purge_stats)、收集awr相关对象
展示明细
VARIABLE rpt_detail CLOB;
BEGIN:rpt_detail :=DBMS_STATS.REPORT_SINGLE_STATS_OPERATION (OPID => 36952
, FORMAT => 'TEXT'
);
END;
/
print rpt_detail;
可以直接看结果
看看真正的收集过程
可以看到某个对象(通常是变化超过10%的表或索引才被收集)开始收集时间和结束时间。
这里有个失败的Falied Tasks的,但是明细中没找到(可以通过表、索引、列的last_analyzed是否最新来排查?)
html格式的可能更好看些
VARIABLE rpt_detail CLOB;
BEGIN:rpt_detail :=DBMS_STATS.REPORT_SINGLE_STATS_OPERATION (OPID => 36951
, FORMAT => 'HTML'
);
END;
/SPO /tmp/rpt_detail.html
print rpt_detail;
SPO OFF
去/tmp下载到windows上,通过浏览器直接打开html文件,如下:
顺便赠送点信息
查看统计信息保留时长和最早的统计信息是哪天
DECLAREv_stats_retn NUMBER;v_stats_date DATE;
BEGINv_stats_retn := DBMS_STATS.GET_STATS_HISTORY_RETENTION;DBMS_OUTPUT.PUT_LINE('The retention setting is ' || v_stats_retn || '.');v_stats_date := DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY;DBMS_OUTPUT.PUT_LINE('Earliest restore date is ' ||v_stats_date || '.');
END;
/
示例如下:
--修改统计信息保留时间为1年
EXECUTE set_opt_stats_retention(366)--清理7天前的统计信息
EXEC DBMS_STATS.PURGE_STATS( SYSDATE-7 );
参考:
https://docs.oracle.com/en/database/oracle/oracle-database/23/tgsql/managing-historical-optimizer-statistics.html#GUID-48022C00-9B87-4470-BC23-AECFCDA0E434