Отправляет email-рассылки с помощью сервиса Sendsay

Открыто о СУБД Oracle на русском

  Все выпуски  

Открыто о СУБД Oracle на русском : ANALYZE и DBMS_STATS


Информационный Канал Subscribe.Ru

Выпуск 5

ANALYZE и DBMS_STATS

Уважаемые подписчики! В этом выпуске я немного подробнее расскажу о том, чему еще, кроме ответов дяди Тома на вопросы любопытных ораклоидов, будет посвящена рассылка. Кроме того, - очередной ответ Тома Кайта на сайте asktom.oracle.com на вопрос о сравнении возможностей оператора ANALYZE и пакета DBMS_STAT.

Официальную презентацию "программы" рассылки я собирался отложить до того момента, пока рассылка будет проанонсирована службой Subscribe.Ru, но поскольку подписчиков и так уже более 700, можно потихоньку начинать...

Регулярно почитывая материалы на сайте asktom.oracle.com, я сразу обратил внимание на анонс книги Тома Кайта "Expert One on One: Oracle". Прочитав содержание и первую главу на сайте издательства Wrox, я понял - такой книги об Oracle еще не было! Ее нужно переводить и издавать. Проведя определенную работу с давними знакомыми, киевским издательством "ДиаСофт", я уговорил из заняться этой книгой и купить лицензию. В результате, я (в свободное от основной работы время) - единственный переводчик и научный редактор этого фундаментального труда, объемом 1200 страниц. Книга скоро выйдет...

Это я все к тому, что часть материалов, накопившихся по ходу работы над этой книгой, будет представлена в данной рассылке. В частности, речь идет о терминологии Oracle - что и как переведено, и почему, обсуждении примеров и о другом, если об этом другом удастся договориться с издательством.

Когда-то мне повезло учиться на кафедре "Языков программирования" факультета ВМиК МГУ. С тех пор осталась, в частности, любовь к описаниям формального синтаксиса языков программирования. Я стараюсь получить или создать такие описания в виде расширенных формул Бэкуса-Наура для всех языков, с которыми приходится сталкиваться. В рассылке будут регулярно публиковаться результаты изучения формального синтаксиса Oracle SQL, PL/SQL и языков различных утилит (например, SQL*Loader). Чтобы стало понятнее, о чем речь, вот вам синтаксис оператора ANALYZE в Oracle 8.1.7, раз уж о нем идет речь в сегодняшнем выпуске:

<оператор ANALYZE> ::=
ANALYZE <объект анализа> <действие анализа>;
<объект анализа> ::=
TABLE [<схема>.]<имя> [<фрагмент или подфрагмент>]
| INDEX [<схема>.]<имя индекса> [<фрагмент или подфрагмент>]
| CLUSTER [<схема>.]<имя кластера>
<фрагмент или подфрагмент> ::=
PARTITION (<фрагмент>)
| SUBPARTITION (<подфрагмент>)
<действие анализа> ::=
COMPUTE STATISTICS [<конструкция for>]
| ESTIMATE STATISTICS [<конструкция for>]
  [SAMPLE <целое число> <строки или проценты>]
| DELETE STATISTICS
| VALIDATE REF UPDATE [SET DANGLING TO NULL]
| VALIDATE STRUCTURE [CASCADE] [INTO [<схема>.]<имя таблицы>]
| LIST CHAINED ROWS [INTO [<схема>.]<имя таблицы>]
<строки или проценты> ::=
ROWS | PERCENT
<конструкция for> ::=
{FOR <объект исследования>}
<объект исследования> ::=
TABLE
| ALL [INDEXED] COLUMNS [SIZE <целое число>]
| COLUMNS [SIZE <целое число>] <атрибуты или столбцы>
| ALL [LOCAL] INDEXES
<атрибуты или столбцы> ::=
<атрибут или столбец> [SIZE <целое число>]
{<атрибут или столбец> [SIZE <целое число>]}

Именно в таком, текстовом виде, я и буду публиковать синтаксис в рассылке. На нынешнем и/или будущем сайте проекта он будет представлен в виде системы страниц, связанных гиперссылками так, что при нажатии на любой нетерминал можно будет увидеть его определение. Чтобы стало понятнее,о чем идет речь, можете взглянуть на аналогичный проект по синтаксису SQL в СУБД Informix (да, я буду упоминать СУБД Informix в рассылке, посвященной СУБД Oracle - вот такой я гнусный тип).

Еще мне хотелось бы самому поработать дядей Томом :), если смогу, поэтому я буду пытаться отвечать на вопросы подписчиков по СУБД Oracle. Не каждый день, конечно, но, скажем, в каждом десятом выпуске рассылки. Свои вопросы шлите по адресу hightown@ukr.net. Если хотите, чтобы я опубликовал информацию об авторе вопроса, напишите об этом явно. По умолчанию все вопросы будут считаться анонимными.

На сегодня анонсов, пожалуй, хватит. Хотя это еще не все... От моих измышлений вернемся к бессмертным творениям Тома Кайта.


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

Том,

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

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

Спасибо,

  Суреш (Suresh)

и он ответил

С помощью 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.

Оригинал этого обсуждения можно найти здесь.


В следующем выпуске

Следующий выпуск будет посвящен продолжению обзора и классификации материалов, которые будут размещаться в рассылке, и новым ответам дяди Тома. Он выйдет в конце недели.

С наилучшими пожеланиями,

  В.К.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное