Сбор статистики БД Oracle

Сбор статистики в БД Oracle осуществляется процедурами из пакета DBMS_STATS, подробно описанными в справочной документации Database PL/SQL Packages and Types Reference для базы данных, словаря, фиксированных системных таблиц, индексов, схем, системы и таблиц. В примере рассмотрен каскадный сбор статистики таблицы HR.EMPLOYEES с индексами.

При необходимости Oracle сохраняет существующую статистику перед ее сбором, для этого предварительно создается таблица хранения статистики:

EXEC DBMS_STATS.CREATE_STAT_TABLE (ownname => 'HR',stattab => 'STATTAB',tblspace => 'USERS',global_temporary => FALSE);

Далее Oracle скопирует существующую статистику и осуществит ее сбор для указанной таблицы и ее индексам в случае когда указан параметр cascade => TRUE одним из двух вариантов:

Вариант 1 Экспорт и сбор статистики таблицы одной командой:

EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname =>'HR', tabname =>'EMPLOYEES', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, degree =>DBMS_STATS.DEFAULT_DEGREE, cascade => TRUE, method_opt => 'FOR ALL COLUMNS SIZE 254',stattab => 'STATTAB', statown => 'HR');

Вариант 2 Экспорт и сбор статистики таблицы в двух отдельных командах:

EXEC DBMS_STATS.EXPORT_TABLE_STATS (ownname => 'HR', tabname => 'EMPLOYEES',stattab => 'STATTAB',statown =>'HR', cascade => TRUE);

EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname =>'HR', tabname =>'EMPLOYEES', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, degree =>DBMS_STATS.DEFAULT_DEGREE, cascade => TRUE, method_opt => 'FOR ALL COLUMNS SIZE 254');

При необходимости возможно вернуть сохранённую статистику:

EXEC DBMS_STATS.IMPORT_TABLE_STATS (ownname => 'HR', tabname => 'EMPLOYEES',stattab => 'STATTAB',statown =>'HR', cascade => TRUE);

Текущую статистику возможно просмотреть из словаря БД процедурами DBMS_STATS или следующими запросами к представлениям:

select * from DBA_TAB_STATISTICS where owner='HR' and table_name='EMPLOYEES';
select * from DBA_TAB_HISTOGRAMS where owner='HR' and table_name='EMPLOYEES';
select * from DBA_TAB_COL_STATISTICS where owner='HR' and table_name='EMPLOYEES';
select * from DBA_IND_STATISTICS where owner='HR' and table_name='EMPLOYEES';

В Oracle 12.1.0.2 может проявиться ошибка экспорта статистики:

ERROR at line 1:
ORA-20002: Version of statistics table "HR"."STATTAB" is too old. Please
try upgrading it with dbms_stats.upgrade_stat_table
ORA-06512: at "SYS.DBMS_STATS", line 18123
ORA-06512: at line 1

Подробнее:
Executing the DBMS_STATS Package Generates: “ORA-20002: Version of statistics table “USERNAME”.”STAT_TAB_NAME” is too old. Please try upgrading it with dbms_stats.upgrade_stat_table” (Doc ID 2004828.1)