Oracle. Нужно ли вычислять статистику после создания индекса или добавления столбцов?

Мы используем базу данных Oracle 10.2.0.5 в разделе "Производство".

Оптимизатор находится в режиме "затраты".

Нужно ли вычислять статистику (пакет DBMS_STATS) после:

  • создание нового индекса
  • добавление столбца
  • создание новой таблицы

?

Спасибо

Ответ 1

Нет короткого ответа. Это полностью зависит от ваших данных и того, как вы его используете. Вот несколько вещей, которые следует учитывать:

Как указано в @NullUserException, статистика автоматически собирается, как правило, каждую ночь. Это обычно достаточно хорошо; в большинстве (OLTP) средах, если вы просто добавили новые объекты, они не будут содержать много данных до того, как статистика будет автоматически собрана. Планы не будут такими уж плохими, и если объекты будут новыми, они, вероятно, не будут использоваться сразу.

  • создание нового индекса - № "Oracle Database теперь автоматически собирает статистику при создании и восстановлении индекса" .
  • добавление столбца - возможно. Если столбец будет использоваться в соединениях и предикатах, вы, вероятно, хотите получить статистику. Если он просто используется для хранения и отображения данных, это не повлияет на какие-либо планы. Но, если новый столбец занимает много места, он может значительно изменить среднюю длину строки, количество блоков, цепочку строк и т.д., И оптимизатор должен знать об этом.
  • создание новой таблицы - возможно. Oracle может компенсировать недостающую статистику с помощью динамической выборки, хотя это часто бывает недостаточно. Особенно, если в новой таблице много данных; плохая статистика почти всегда приводит к недооценке мощности, которая приведет к вложенным циклам, когда вы хотите, чтобы хэш-соединения. Кроме того, даже если данные таблицы не изменились, вам может потребоваться собрать статистику еще раз, чтобы включить гистограммы. По умолчанию Oracle создает гистограммы для искаженных данных, но не будет включать эти гистограммы, если эти столбцы не использовались в качестве предиката. (Так что это относится и к добавлению нового столбца). Если вы снимете и заново создаете таблицу, даже с тем же именем, Oracle не будет поддерживать ни одну из данных использования столбцов и не будет знать, что вам нужны гистограммы в определенных столбцах.

Сбор статистики оптимизатора намного сложнее, чем большинство людей понимают. На моей нынешней работе большинство наших проблем с производительностью в конечном итоге объясняются плохой статистикой. Если вы пытаетесь разработать план своей системы, вы должны прочитать главу "Руководство по оптимизации" .


Update:

Нет необходимости собирать статистику для пустых объектов; динамическая выборка будет работать так же быстро, как чтение статистики из словаря данных. (Исходя из быстрого теста, сильного разбора большого количества запросов с и без статистики.) Если вы отключите динамическую выборку, тогда могут быть некоторые странные случаи, когда значения по умолчанию Oracle приводят к неточным планам, и вам будет лучше со статистикой по пустой стол.

Я думаю, что причина, по которой Oracle автоматически собирает статистику для индексов во время создания, объясняется тем, что она не стоит намного больше. Когда вы создаете индекс, вы должны прочитать все блоки в таблице, поэтому Oracle может также вычислить количество уровней, блоков, ключей и т.д. Одновременно.

Статистика таблиц может быть более сложной и может потребовать нескольких проходов данных. Создание индекса относительно просто по сравнению с произвольным SQL, который может использоваться как часть create-table-as-select. Возможно, невозможно или эффективно взять эти произвольные операторы SQL и преобразовать их в запрос, который также возвращает информацию, необходимую для сбора статистики.

Конечно, ничего не стоило бы собирать статистику за пустой стол. Но это ничего не принесет вам, и это просто вводит в заблуждение любого, кто смотрит на USER_TABLES.LAST_ANALYZED - таблица, по-видимому, анализируется, но не содержит каких-либо значимых данных.