2016-08-15 2 views
1

У нас есть одна из нашей системы, которая выполняет довольно немного активности базы данных в терминах операторов 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'); 

Так что мои вопросы:

  1. Является ли мой подход правильный. Могу ли я доверять, что получаю свежую статистику, просто запустив options => 'GATHER STALE' или мне нужно вручную собрать статистику для всех таблиц, которые возвращаются с разумным количеством вставок, обновлений, удалений?
  2. Если user_tab_modifications действительно будет сброшен; Очевидно GATHER STALE вариант не кажется, сделать это

Мы используем Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64-разрядные производства

+0

Не уверен, почему мой вопрос отмечен не о программировании. DBMS_STATS - это пакет оракулов, и я хочу знать, что это лучший способ его использования. – Julian

ответ

0

Получил следующую информацию от Oracle docs.

Вы должны включить мониторинг, если вы используете GATHER_DATABASE_STATS или GATHER_SCHEMA_STATS с параметрами GATHER AUTO или GATHER STALE.

Этот вид USER_TAB_MODIFICATIONS заполняется только для таблиц с атрибутом MONITORING. Он предназначен для сбора статистики в течение длительного периода времени. По соображениям производительности база данных Oracle не заполняет это представление сразу же, когда происходят фактические изменения. Запустите процедуру FLUSH_DATABASE_MONITORING_INFO в пакете PL/SQL DBMS_STATS, чтобы заполнить это представление с помощью последней информации. Для выполнения этой процедуры требуется системная привилегия ANALYZE_ANY.

Надеюсь, это поможет вам определить, какие из ваших допущений неверны и понять правильное использование «СБЫВАНИЯ СБОР».

Смежные вопросы