Home  |  Administration  |  SQL  |  Tuning  |  Miscellaneous  |

The Search For Intelligent Life in the Cost-Based Optimizer
by Tim Gorman

Предыдущая Оглавление Следующая

Что может оказаться не так?

Теперь, по поводу CBO. Он вычисляет стоимость всех возможных вариантов исполнения SQL оператора и просто выбирает вариант с наименьшей стоимостью. Все очень логично. Что может оказаться не так?

По крайней мере два аспекта могут таить подвох для математического процессора:

  • он мог получить неверные данные на входе (старая проблема: "мусор на входе - мусор на выходе")
  • одна или несколько формул могут не учитывать важных факторов или же быть ошибочными

На протяжении жизненного цикла Oracle7 проблема состояла и в том и в другом. В Oracle7 реализация команды ANALYZE была полна программных ошибок, которые подавали плохую статистику на вход CBO. В Oracle8 многие ошибки в команде ANALYZE были исправлены, что решило проблему с неверными входными данными. В Oracle8i пакет DBMS_STATS предоставляет еще более точную статистику, что было подтверждено несколькими "ошибками", зарегистрированными в системе поддержки MetaLink (http://metalink.oracle.com/).

Применение DBMS_STATS в сочетании с новой в Oracle8i возможностью MONITORING позволяет просто и надежно собирать корректную, пригодную для использования CBO статистику. Таким образом, с этой проблемой покончено.

Остались тонкие исправления в формулах, которые CBO использует для вычисления стоимости.
Давайте рассмотрим их...

Что означает "стоимость"?

Стоимость (cost), вычисляемая CBO, состоит главным образом из оценки физических операций ввода/вывода. Фактическая формула описана в документации как

IO + CPU/1000 + NetIO*1.5

В данной формуле составляющая "IO" обозначает физические операции ввода/вывода, "CPU" представляет логические операции ввода/вывода, а "Net I/O" - логические операции ввода/вывода в/из удаленной базы данных с через связь баз данных (database link).

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

В чем различие между логическими операциями ввода/вывода и физическими операциями ввода/вывода? Первые представляют собой запросы к блокам базы данных, которые уже находятся в Буферном Кэше Oracle SGA. Последние - это запросы Oracle к нижележащей подсистеме ввода/вывода, к блокам, которые отсутствуют в Буферном Кэше. CBO будет пытаться подсчитать число физических операций ввода/вывода для всех возможных планов исполнения SQL оператора и отбросить все варианты кроме одного с наименьшим числом.

Чтобы понять, насколько сложным может быть этот процесс, давайте сначала сделаем краткий обзор операций ввода/вывода в Oracle...


Предыдущая Оглавление Следующая
Last Update: October 11, 2007 18:33:32