Нужно ли мне запускать collect_table_stats каждый раз, когда я создаю индекс, чтобы оптимизатор Oracle мог его использовать? - PullRequest
4 голосов
/ 11 ноября 2010

Я видел несколько примеров, когда создавались индексы.После этого было выполнено следующее:

exec dbms_stats.gather_table_stats(...)

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

Ответы [ 2 ]

9 голосов
/ 11 ноября 2010

Зависит от версии Oracle.

В версиях, предшествующих 9i, вам приходилось собирать статистику после создания индекса в явном виде, прежде чем оптимизатор, основанный на затратах, сможет его реально использовать.

В 9i Oracle добавил предложение COMPUTE STATISTICS в инструкцию CREATE INDEX. Это позволило вам собирать статистику по индексу как часть процесса создания индекса. Если вы не указали COMPUTE STATISTICS, вам все равно придется вручную собирать статистику, прежде чем CBO сможет ее рассмотреть.

В 10g изменилось поведение по умолчанию, и Oracle автоматически вычислял статистику по индексу, когда вы его создали, не требуя указания COMPUTE STATISTICS. Из-за привычки или из-за того, что они просто обновляют старый пример кода, люди часто по-прежнему будут включать вызов GATHER_INDEX_STATS в публикуемые ими примеры.

В 10g и более поздних версиях по умолчанию создается фоновое задание, которое собирает статистику по объектам, для которых отсутствует статистика, и объектам, статистика которых устарела ночью. Объяснение DCookie о работе с 10 г Oracle изменил способ задания в 11g, но по сути он делает то же самое.

4 голосов
/ 11 ноября 2010

Существует готовое запланированное задание по умолчанию, которое называется GATHER_STATS_JOB. Он работает в MAINTENANCE_WINDOW_GROUP. Ваша таблица может анализироваться или не анализироваться, в зависимости от того, достаточно ли времени в окне, чтобы добраться до нее, или если окно было изменено администраторами баз данных и т. Д. Лучший способ обеспечить его анализ в этом случае - вручную запустите задание collect_table_stats для этой таблицы после создания индекса.

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