The Search For Intelligent Life in the Cost-Based Optimizer
by Tim Gorman
Корректировка для различных типов ввода/вывода
Но постойте! Это еще не все!
CBO также необходимо знать относительную стоимость индексного доступа по сравнению с FTS.
Параметр OPTIMIZER_INDEX_COST_ADJ отражает это соотношение. Значение по умолчание 100 говорит CBO,
что на индексный доступ затрачивается примерно столько же времени, что и на операции доступа при FTS.
CBO использует значение данного параметра для учета еще одного усовершенствования в расчете стоимости
индексного сканирования:
PREVIOUS-COST * (OPTIMIZER_INDEX_COST_ADJ / 100) = FINAL-COST
Как видно, значение по умолчанию приводит данную формулу к тривиальному виду также как и в случае
со значением по умолчанию для параметра OPTIMIZER_INDEX_CACHING.
К счастью, адекватное значение для параметра OPTIMIZER_INDEX_COST_ADJ может быть легко получено из
самой базы данных Oracle. Ответ находится в столбце AVERAGE_WAIT представления V$SYSTEM_EVENT. Это
еще один пример бесценной установки параметра TIMED_STATISTICS в значение TRUE, что позволяет наполнять
'Session Wait' представления (одним из которых является V$SYSTEM_EVENT) хронометрической информацией.
После того как база была запущена и проработала достаточное время (пару часов или больше), выполните следующий запрос:
SELECT EVENT,
AVERAGE_WAIT
FROM V$SYSTEM_EVENT
WHERE EVENT LIKE 'db file s%';
Запрос вернет информацию о двух событиях ожидания ввода/вывода: db file scattered reads (операции FTS)
и db file sequential reads (операции индексного сканирования). Столбец AVERAGE_WAIT содержит среднее
время ожидания в сотых долях секунды этих событий:
EVENT AVERAGE_WAITS
========================= ==============
db file sequential reads .33178629
db file scattered reads 2.190087
В данном примере запросы ввода/вывода при индексном сканировании занимают в среднем только 15% среднего времени
запросов ввода/вывода при операциях FTS. Поэтому параметр OPTIMIZER_INDEX_COST_ADJ должен быть установлен в значение 15.