Мы используем базу данных Oracle 10.2.0.5 в разделе "Производство".
Оптимизатор находится в режиме "затраты".
Нужно ли вычислять статистику (пакет DBMS_STATS) после:
- создание нового индекса
- добавление столбца
- создание новой таблицы
?
Спасибо
Мы используем базу данных Oracle 10.2.0.5 в разделе "Производство".
Оптимизатор находится в режиме "затраты".
Нужно ли вычислять статистику (пакет DBMS_STATS) после:
?
Спасибо
Нет короткого ответа. Это полностью зависит от ваших данных и того, как вы его используете. Вот несколько вещей, которые следует учитывать:
Как указано в @NullUserException, статистика автоматически собирается, как правило, каждую ночь. Это обычно достаточно хорошо; в большинстве (OLTP) средах, если вы просто добавили новые объекты, они не будут содержать много данных до того, как статистика будет автоматически собрана. Планы не будут такими уж плохими, и если объекты будут новыми, они, вероятно, не будут использоваться сразу.
Сбор статистики оптимизатора намного сложнее, чем большинство людей понимают. На моей нынешней работе большинство наших проблем с производительностью в конечном итоге объясняются плохой статистикой. Если вы пытаетесь разработать план своей системы, вы должны прочитать главу "Руководство по оптимизации" .
Update:
Нет необходимости собирать статистику для пустых объектов; динамическая выборка будет работать так же быстро, как чтение статистики из словаря данных. (Исходя из быстрого теста, сильного разбора большого количества запросов с и без статистики.) Если вы отключите динамическую выборку, тогда могут быть некоторые странные случаи, когда значения по умолчанию Oracle приводят к неточным планам, и вам будет лучше со статистикой по пустой стол.
Я думаю, что причина, по которой Oracle автоматически собирает статистику для индексов во время создания, объясняется тем, что она не стоит намного больше. Когда вы создаете индекс, вы должны прочитать все блоки в таблице, поэтому Oracle может также вычислить количество уровней, блоков, ключей и т.д. Одновременно.
Статистика таблиц может быть более сложной и может потребовать нескольких проходов данных. Создание индекса относительно просто по сравнению с произвольным SQL, который может использоваться как часть create-table-as-select. Возможно, невозможно или эффективно взять эти произвольные операторы SQL и преобразовать их в запрос, который также возвращает информацию, необходимую для сбора статистики.
Конечно, ничего не стоило бы собирать статистику за пустой стол. Но это ничего не принесет вам, и это просто вводит в заблуждение любого, кто смотрит на USER_TABLES.LAST_ANALYZED - таблица, по-видимому, анализируется, но не содержит каких-либо значимых данных.