Как Oracle использует статистические данные

В предыдущем вопросе я получил комментарий о статистике Oracle:

Oracle не знает, что 50M больше, чем количество строк. Конечно, у него есть статистика, но она может быть старой и неправильной — и Oracle никогда не позволит себе выдать неверный результат только потому, что статистика неверна.

Я был почти уверен, что Oracle полагается на статистику при подготовке плана выполнения запроса. До версии 10 рекомендовалось время от времени обновлять статистику, а начиная с версии 10g Oracle собирает статистику автоматически.

Может ли кто-нибудь объяснить, насколько анализатор запросов Oracle полагается на данные статистики?


person zendar    schedule 02.12.2009    source источник


Ответы (3)


Oracle часто использует статистику для создания планов выполнения запросов. Чего он не делает (и не должен) использовать, так это использует эту статистику таким образом, чтобы повлиять на результаты запроса, что вы и пытались сделать с "ROWNUM ‹ 50000000". Статистика может быть устаревшей или отсутствовать. Однако это будет означать только то, что Oracle может медленно генерировать правильный результат, но не означает, что Oracle вернет неправильный результат.

Если бы Oracle работал так, как вы надеялись, то он мог бы решить, что «ROWNUM ‹ 50000000» означает «получить все строки», даже несмотря на то, что таблица теперь содержала 60 000 000 строк (но имелась устаревшая статистика, говорящая, что она содержит только 49 000 000). К счастью, это не так.

person Tony Andrews    schedule 02.12.2009
comment
Именно это я имел в виду, когда делал комментарий, процитированный в вопросе. - person Erich Kitzmueller; 02.12.2009

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

При выполнении запроса Oracle создаст пул доступных планов выполнения, чтобы удовлетворить ваш запрос. Эти планы выполнения одинаковы с точки зрения того, что они вернут вам один и тот же точный результат, просто путь к нему может быть гораздо более эффективным для одного плана по сравнению с другим. Чтобы определить эту эффективность, Oracle использует статистику, сгенерированную для объектов, используемых в каждом из планов выполнения, для определения их индивидуальных затрат. Если эти статистические данные отсутствуют или устарели, стоимость, связанная с каждым планом, будет менее точной, и поэтому оптимальный план не может быть выбран.

Вот некоторые ключевые статистические данные, которые Oracle использует для определения этой стоимости:

Статистика таблицы

 * Number of rows
 * Number of blocks
 * Average row length    

Статистика столбца

 * Number of distinct values (NDV) in column
 * Number of nulls in column
 * Data distribution (histogram)
 * Extended statistics

Статистика индекса

* Number of leaf blocks
* Levels
* Clustering factor

Системная статистика

* I/O performance and utilization
* CPU performance and utilization
person RC.    schedule 02.12.2009

Статистика используется оптимизатором на основе стоимости оракула (CBO) для расчета относительной стоимости различных способов выполнения запроса, чтобы можно было выбрать наиболее подходящий.

В целом это работает очень хорошо и постоянно совершенствуется. Например, в 11g вы можете собирать многостолбцовые гистограммы, которые очень помогают с запросами, имеющими предикаты в коррелированных столбцах (например, сильно коррелированные, как месяц рождения и знак зодиака, или более слабо коррелированные, как пол и рост).

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

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

Поищите книгу Джонатана Льюиса — в ней очень подробно рассматривается предмет.

person David Aldridge    schedule 02.12.2009
comment
Обратите внимание, что в версии 11g появилось управление планами SQL, позволяющее лучше контролировать изменения плана выполнения на основе новой статистики. Теперь вы можете эффективно заблокировать план выполнения, чтобы он использовался, даже если будет найден лучший план с учетом затрат. Администратор базы данных может просмотреть и затем разрешить использование этих планов выполнения через Enterprise Manager. Это позволяет вести непрерывный сбор статистики, одновременно контролируя связанные с ней изменения в критических таблицах базы данных. - person RC.; 02.12.2009