Соберите статистику по материализованным представлениям как часть - PullRequest
3 голосов
/ 17 сентября 2011

Мы используем следующее для обновления статистики для всех таблиц в данной схеме:

exec dbms_stats.gather_schema_stats(ownname => 'some_schema', estimate_percent => dbms_stats.auto_sample_size, cascade => true, method_opt => 'FOR ALL COLUMNS SIZE AUTO', degree => 12);

Это, однако, устанавливает количество строк для наших материализованных представлений равным нулю и имеет нежелательный побочный эффект, который приводит к созданию неэффективных планов запросов для запросов к материализованным представлениям. Мы работаем над этим, собирая статистику таблицы по конкретным mviews после запуска статистики схемы.

Мой вопрос: могу ли я изменить параметры на collect_schema_stats любым способом, который приведет к тому, что счетчики строк mview не будут установлены на ноль?

1 Ответ

3 голосов
/ 17 сентября 2011

Вы не можете сказать GATHER_SCHEMA_STATS об исключении определенных объектов. Вы можете сделать GATHER STALE для сбора статистики только по объектам, где статистика устарела, но вполне возможно, что это будет включать ваши материализованные представления. Несколько способов обойти это

1) Используйте процедуру LOCK_TABLE_STATS для блокировки статистики ваших материализованных представлений. Это не позволит GATHER_SCHEMA_STATS собирать статистику по этим объектам, пока вы не вызовете процедуру UNLOCK_TABLE_STATS (предположительно, как часть процесса, который периодически обновляет статистику материализованного представления).

2) Используйте процедуру EXPORT_TABLE_STATS, чтобы сохранить статистику для материализованных представлений перед сбором статистики схемы, а затем вызвать RESTORE_TABLE_STATS после завершения вызова GATHER_SCHEMA_STATS, чтобы вернуть статистику материализованного представления.

3) Не используйте GATHER_SCHEMA_STATS. Вызовите GATHER_TABLE_STATS в цикле, где вы исключаете любые объекты, которые хотите. Что-то вроде

BEGIN
  FOR x IN (SELECT *
              FROM dba_tables
             WHERE owner = 'SOME_SCHEMA'
               AND table_name NOT IN (<<list of MVs>>))
  LOOP
     dbms_stats.gather_table_stats( x.owner, x.table_name, ... );
  END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...