Oracle可以通过DBMS_STATS.GET_TABLE_STATS 收集表的统计信息,一般的收集方法如下:
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => '',
TABNAME => '',
ESTIMATE_PERCENT => 80,
DEGREE => 4,
METHOD_OPT => '',
CASCADE => TRUE,
GRANULARITY => 'ALL',
NO_INVALIDATE => FALSE);
如果表的数据量比较稳定, 比如员工表,部门表,这种不经常变化的数据,并不需要每天收集统计信息。
那么可以通过导出导入的方式对统计信息进行备份。
1. 创建一张表来保存统计信息
BEGIN
DBMS_STATS.CREATE_STAT_TABLE(OWNNAME => 'SCOTT',
STATTAB => 'T_BI_STATS',
TBLSPACE => 'USERS');
END;
/
2. 导出scott.emp 的统计信息,存放到t_bi_stats表中,指定的statid字段名称是 EMP20190705
BEGIN
DBMS_STATS.EXPORT_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'EMP',
STATTAB => 'T_BI_STATS',
STATID => 'EMP20190705');
END;
/
3. 删除scott.emp 的统计信息
BEGIN
dbms_stats.delete_table_stats(ownname => 'SCOTT',tabname => 'EMP');
END;
/
4. 导入统计信息到 emp表中
BEGIN
DBMS_STATS.IMPORT_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'EMP',
STATTAB => 'T_BI_STATS',
STATID => 'EMP20190705');
END;
/
5. 如果感觉统计信息存放太多,可以指定某些统计信息进行删除
BEGIN
DBMS_STATS.DELETE_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'EMP',
STATTAB => 'T_BI_STATS',
STATID => 'EMP20190705');
END;
/