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...