Как улучшить производительность dbms_stats.gather_schema_stats - PullRequest
0 голосов
/ 12 января 2019

Сбор статистики схемы занял 16.30 часов с использованием следующих блоков. Есть ли способ улучшить производительность?

begin
   dbms_stats.gather_schema_stats(
      ownname          => 'SCHEMA_NAME',
      estimate_percent => dbms_stats.auto_sample_size,
      method_opt       => 'for all columns size AUTO',
      cascade          => true, 
      degree           => 16
   );
end;

Это действие выполняется один раз в неделю, но ожидание 16 часов не подходит для пользователей.

Моя база данных Oracle имеет версию 11.2.0, и в схеме есть несколько больших таблиц разделов, в которых часто происходит вставка / удаление данных.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вам нужно всегда пересчитывать статистику для всей схемы? Вы можете выполнить сбор статистики также для отдельных таблиц или просто разделов и даже для отдельных столбцов. Ограничить сбор статистики для объектов, где данные были изменены значительно .

Нет смысла собирать статистику по таблицам / разделам, когда в данных не было изменений.

0 голосов
/ 12 января 2019

Рассмотрим дополнительный параметр options со значением GATHER AUTO в диапазоне от ownname до estimate_percent для сбора статистики только для таблиц без статистики или с более чем 10% изменениями строки для сокращения периода времени, кстати, оставьте параметр estimate_percent равным dbms_stats.auto_sample_size, поскольку база данных автоматически оценивает значение для вас:

begin
   dbms_stats.gather_schema_stats(
      ownname          => 'SCHEMA_NAME',
      options          => 'GATHER AUTO',
      estimate_percent => dbms_stats.auto_sample_size,
      method_opt       => 'for all columns size AUTO',
      cascade          => true, 
      degree           => 16
   );
end;
/
...