21 апреля 2011 г.

oracle: различиях Analyze и DBMS_STATS

Дядю Тома спросили о различиях Analyze и DBMS_STATS:

Том,

Не мог бы ты объяснить, есть ли еще существенные отличия или преимущества пакета DBMS_STATS над оператором ANALYZE, кроме следующих:

    - DBMS_STATS позволяет выполнять сбор статистики параллельно
    - С помощью DBMS_STATS можно выполнять мониторинг статистики и получать устаревшую статистику для измененных строк.

и он ответил

С помощью dbms_stats можно непосредственно импортировать/экспортировать/задавать статистику

Пакет dbms_stats упрощает автоматизацию обновления статистики (это пакет процедур и функций, а analyze - просто оператор)

dbms_stats - это рекомендованный, предпочтительный метод сбора статистики.

Пакет dbms_stats позволяет анализировать внешние таблицы, а оператор analyze - нет.

DBMS_STATS собирает статистику только для стоимостного оптимизатора; он не собирает другую информацию. Например, статистическая информация по таблице, собираемая пакетом DBMS_STATS, включает количество строк, количество блоков, содержащих данные, среднюю длину строки, но не включает количество перенесенных строк (chained rows), средний объем свободного места в блоке или количество неиспользованных блоков данных.

Пакет dbms_stats (в 9i) позволяет собирать статистику системы (новая возможность)

Оператор ANALYZE вычисляет глобальную статистику для фрагментированных таблиц и индексов, а не собирает ее непосредственно. Это может приводить к неточности некоторых показателей, например, количества различных значений. Пакет DBMS_Stats так не делает.

И самое важное - в будущем оператор ANALYZE не будет собирать статистическую информацию, необходимую стоимостному оптимизатору.


Обсуждение
Неполная статистика? Комментарий читателя (Ашок из Индии) 23 июня 2002 года

Привет, Том

Ты ответил, что dbms_stats не собирает информацию о перенесенных строках, не использованных блоках данных и среднем объеме свободного места в блоках. Значит ли это, что для получения этой информации надо будеть выполнять оператор analyze? Также ты упомянул, что пакет dbms_stats собирает статистику, необходиму стоимостному оптимизатору. Есть ли еще какие-то специфические показатели, кроме количества строк и количества занимаемых блоков? Если учитываются только эти два, мне кажется, что оператор analyze их отлично собирает. Единственной полезной возможностью пакета dbms_stats отстается процедура set_stats, позволяющая настроить запросы перед их использованием в производственной среде.
Ответ дяди Тома

dbms_stats собирает только информацию, необходимую стоимостному оптимизатору.

В будущем оператор analyze не будет собирать информацию для стоимостного оптимизатора, - только информацию, которую стоимостной оптимизатор не использует. Пакет DBMS_STATS собирает и будет собирать только информацию для стоимостного оптимизатора.

Я думаю, вам необходимо перечитать ответ. dbms_stats собирает всю ту же информацию, что и оператор analyze, но... может это делать параллельно, для уставревших (stale) таблиц, может экспортировать/импортировать статистическую информацию, может анализировать то, что не анализирует analyze (например, систему) и т.д. Есть множество статистических показателей кроме количества строк и блоков в таблице - и оба средства ее собирают. Есть вещи, которые пакет dbms_stats делает, а оператор analyze - нет (особенно для фрагментированных таблиц).

Рекомендация: используйте пакет dbms_stats.