У нас есть одна из нашей системы, которая выполняет довольно немного активности базы данных в терминах операторов INSERT/UPDATE/DELETE для разных таблиц. Из-за этого статистика стала устаревшей, и это отразилось на общей производительности.Как работает Oracle GATHER_SCHEMA_STATS
Мы хотим создать запланированное задание, которое периодически вызывало DBMS_STATS.GATHER_SCHEMA_STATS
. Потому что мы не хотим фактическую статистики сбора себя воздействовать обработки информации системы еще больше мы думаем, собирать статистические данные довольно часто и использовать GATHER STALE
вариант:
DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => 'MY_SCHEMA', OPTIONS =>'GATHER STALE')
Это выполняется почти мгновенно, но работает это утверждение ниже перед тем и после сбора статистика, видимо, возвращает те же записи с одинаковыми значениями:
SELECT * FROM user_tab_modifications WHERE inserts + updates + deletes > 0;
очень короткое время, принимая выполнить и тот факт, что user_tab_modifications содержание остается тем же заставляет меня задаться вопросом, действительно ли OPTIONS =>'GATHER STALE'
делает то, что мы ожидаем от этого. С другой стороны, если я запускаю этот раз перед тем и после сбора статистики можно увидеть таблицы по сообщениям, затхлый, прежде чем вновь больше не сообщается как несвежий после:
DECLARE
stale dbms_stats.objecttab;
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'MY_SCHEMA', OPTIONS =>'LIST STALE', objlist => stale);
FOR i in 1 .. stale.count
LOOP
dbms_output.put_line(stale(i).objName);
END LOOP;
END;
С другой стороны, если позволяет говорить my_table
является одна из моих таблиц указана как часть таблиц, которые находятся в разделе user_tab_modifications
с inserts + updates + deletes > 0
, и я запускаю. Я вижу, что my_table
больше не сообщается как имеющий изменения.
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(ownname => 'MY_SCHEMA', tabname => 'MY_TABLE');
Так что мои вопросы:
- Является ли мой подход правильный. Могу ли я доверять, что получаю свежую статистику, просто запустив
options => 'GATHER STALE'
или мне нужно вручную собрать статистику для всех таблиц, которые возвращаются с разумным количеством вставок, обновлений, удалений? - Если user_tab_modifications действительно будет сброшен; Очевидно
GATHER STALE
вариант не кажется, сделать это
Мы используем Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64-разрядные производства
Не уверен, почему мой вопрос отмечен не о программировании. DBMS_STATS - это пакет оракулов, и я хочу знать, что это лучший способ его использования. – Julian