Статистика. Что использовать DBMS_STATS или ANALYZE?

Стас Белков

Стас Белков

Автор статьи. Известный специалист в мире IT. Консультант по продуктам и решениям Oracle. Практикующий программист и администратор баз данных. Подробнее.

C каждой новой версией ORACLE стоимостной оптимизатор становится все более сложным. Поэтому для принятия правильных решений ему нужны достоверные статистические данные. Администратор должен об этом побеспокоиться, так как сбор статистики непосредственно влияет на мощность всей системы. Соответственно устаревшие статистические данные являются причиной выбора неоптимального плана выполнения запросов.

Для сбора статистики используется пакет dbms_stats и оператор analyze. Однако Oracle "настоятельно" рекомендует использовать именно пакет dbms_stats. Да и Том Кайт придерживается того же мнения. Его авторитетные утверждения:

  • dbms_stats - это рекомендованный, предпочтительный метод сбора статистики
  • DBMS_STATS позволяет выполнять сбор статистики параллельно
  • С помощью DBMS_STATS можно выполнять мониторинг статистики и получать устаревшую статистику для измененных строк
  • С помощью dbms_stats можно непосредственно импортировать/экспортировать/задавать статистику
  • Пакет dbms_stats упрощает автоматизацию обновления статистики
  • Пакет dbms_stats (в 9i) позволяет собирать статистику системы
  • Пакет dbms_stats позволяет анализировать внешние таблицы
  • с помощью dbms_stats можно собирать статистику в удаленной базе данных

Так как только dbms_stats собирает глобальную статистику (столбец global_stats в dba_tables, dba_indexes, dba_tab_cols, dba_tab_columns, dba_tab_col_statistics), значит, по значению столбца global_stats можно определить каким образом собиралась статистика - DBMS_STATS или ANALYZE.

DBMS_STATS собирает статистику только для стоимостного оптимизатора. То есть этот пакет не собирает никакую иную информацию. Например, не собирает такие данные: количество chained rows, средний объем свободного места в блоке, количество неиспользованных блоков данных. Такую статистику собирает оператор analyze.

Обратите внимание, что даже та статистика, которая собирается и DBMS_STATS, и ANALYZE несколько отличается. Это в первую очередь относится к avg_row_len и avg_col_len.

К тому же ожидается, что в будущем оператор ANALYZE не будет собирать статистику, необходимую стоимостному оптимизатору. Эта функция будет возложена исключительно на DBMS_STATS!

Вас заинтересует / Intresting for you:

Как устроен поиск блоков данны...
Как устроен поиск блоков данны... 4492 просмотров Дэн Wed, 03 Jan 2018, 17:39:13
Язык SQL в Oracle
Язык SQL в Oracle 4282 просмотров Ирина Светлова Tue, 21 Nov 2017, 13:26:01
Использование памяти PGA и UGA...
Использование памяти PGA и UGA... 6351 просмотров Денис Tue, 21 Nov 2017, 13:31:33
Процесс записи в журнал и на д...
Процесс записи в журнал и на д... 5154 просмотров Antoniy Sat, 20 Jan 2018, 06:16:54
Войдите чтобы комментировать