Дядю Тома спросили о различиях 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.
Том,
Не мог бы ты объяснить, есть ли еще существенные отличия или преимущества пакета 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.