Для сбора статистики используем процедуру
dbms_stats.gather_table_stats('SCOTT','EMP');
Если в базе данных имеются таблицы, которые часто обновляются, то частый сбор статистики может негативно повлиять на производительность базы данных. Для того, чтоб исключить объекты из автоматического или любого другого сбора статистики можно «закрепить» ее статистику:
begin
dbms_stats.gather_table_stats('SCOTT','EMP');
dbms_stats.lock_table_stats('SCOTT','EMP');
end;
Теперь, по этой таблице невозможно будет собрать статистику ни автоматически, ни вручную:
SQL>exec dbms_stats.gather_table_stats('SCOTT','EMP'); begin dbms_stats.gather_table_stats('SCOTT','EMP'); end; ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 13182 ORA-06512: at "SYS.DBMS_STATS", line 13202 ORA-06512: at line 2
Снять блокировку статистики:
dbms_stats.unlock_table_stats('SCOTT','EMP');
Посмотреть данные о сборе статистики можно в таблице DBA_TAB_STATISTICS
select * from DBA_TAB_STATISTICS t where t.table_name = :name_table
Собрать статистику для индекса
begin dbms_stats.gather_index_stats('OWNER', 'INDEX_NAME'); end;
Статистика на секцию
begin dbms_stats.gather_table_stats(ownname => p_owner, tabname => p_table_name, partname => p_partition_name, degree=> 4, no_invalidate=>true ); end;
Данное утверждение — «Если в базе данных имеются таблицы, которые часто обновляются, то частый сбор статистики может негативно повлиять на производительность базы данных.» — вообще говоря, неверно. Именно для таких таблиц важно поддерживать статистику в актуальном состоянии. Если, разумеется, запросы не используют RBO — что в современных версиях невозможно ввиду отсутствия RBO (вместо него начиная с 10g стоит заглушка).
Блокировку сбора статистики целесообразно выполнять в приложениях типа OEBS — с большим (реально большим) количеством неизменных справочников. И при этом не стоит забывать про существующие в БД по умолчанию задания автоматического обновления статистики.