Будет ли DBMS_STATS анализировать таблицу? - PullRequest
3 голосов
/ 20 октября 2011

Я использую DBMS_STATS.GATHER_SCHEMA_STATS процедуру для сбора статистики в моем коде.

BEGIN
   DBMS_STATS.gather_schema_stats
                            (ownname          => '<SCHEMA NAME',
                             estimate_percent => DBMS_STATS.auto_sample_size,
                             options          => 'GATHER STALE',
                             DEGREE           => NULL,
                             CASCADE          => DBMS_STATS.auto_cascade,
                             granularity      => 'auto'
                            );
end;

Мой вопрос: После того, как я выполнил этот код, я проверил последнюю проанализированную дату таблиц, используя инструмент TOAD, и он показывает некоторую другую прошлую дату вместо текущей даты, когда я запускал DBMS_STATS.GATHER_SCHEMA_STATS процедура.

Значит ли это, что DBMS_STATS не будет анализировать таблицу?

1 Ответ

8 голосов
/ 20 октября 2011

Когда вы указываете опцию GATHER STALE, вы говорите Oracle, что хотите собирать статистику только по объектам, которые претерпели «существенные» изменения с момента последнего сбора статистики по этому объекту. Если Oracle определит, что таблица не претерпела существенных изменений с момента последнего сбора статистики, она не будет собирать статистику снова.

Oracle определяет, что таблицы значительно изменились, отслеживая DML для этих таблиц (Oracle по умолчанию отслеживает таблицы в 11g - вам пришлось включить мониторинг в более ранних версиях). Эти данные периодически записываются в DBA_TAB_MODIFICATIONS (примерно каждые несколько часов). Когда DBMS_STATS выполняется с опцией GATHER STALE, Oracle сравнивает приблизительное число изменений в DBA_TAB_MODIFICATIONS с предыдущей статистикой для таблицы, чтобы определить, изменилось ли достаточно строк, чтобы иметь смысл собирать статистику снова.

...