Oracle - вам нужно рассчитать статистику после создания индекса или добавления столбцов? - PullRequest
10 голосов
/ 03 сентября 2011

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

Оптимизатор работает в режиме «на основе затрат».

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

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

?

Спасибо

1 Ответ

8 голосов
/ 03 сентября 2011

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

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

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

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


Обновление:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...