Home  |  Administration  |  SQL  |  Tuning  |  Miscellaneous  |

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

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

Ввод/вывод в Oracle7 версии 7.1 и выше

Пришел черед Oracle7 версии 7.1...

Вновь архитекторы Oracle7 показали свою проницательность. Во-первых, они сделали проблемный параметр SMALL_TABLE_THRESHOLD "недокументированным", переименовав его в "_SMALL_TABLE_THRESHOLD". Это дало эффект наложения знака "опасность" на данный параметр, предупреждая: "Изменяй меня на свой страх и риск". Хорошая мысль!

Тем не менее, они осознавали, что разработчикам нужно закреплять некоторые таблицы в Буферном Кэше. Поэтому они создали атрибуты CACHE и NOCACHE для команд CREATE TABLE и ALTER TABLE. По умолчанию использовался атрибут NOCACHE, но разработчик мог изменить его значение на CACHE. Это означало, что таблицы с атрибутом CACHE также могли быть размещены в MRU-конце связного LRU-списка (подобно случаю очень маленьких таблиц) даже при выполнении операции FTS. Блоки таблиц с атрибутом NOCACHE по-прежнему размещались в LRU-конце списка.

Однако, учитывая человеческую природу и помня популярное, но ложное представление о том, что закрепление таблиц в памяти заставит каждое приложение "летать", как Вы думаете, что могло бы произойти? Конечно! Каждый стал бы помечать все свои таблицы атрибутом CACHE!

Набив шишки c параметром SMALL_TABLE_THRESHOLD, архитекторы Oracle7 добавили ограничитель, чтобы предотвратить эту ситуацию. Они создали еще один параметр CACHE_SIZE_THRESHOLD, который определил максимальный размер для таблиц с установленным атрибутом CACHE. Если таблица была бы помечена как CACHE, но ее размер был бы больше числа блоков, заданных параметром CACHE_SIZE_THRESHOLD, Oracle трактовал бы такую таблицу как NOCACHE, игнорируя атрибут CACHE. Значение параметра по умолчанию было определено в 10% от размера Буферного Кэша, но оно могло быть при необходимости увеличено или уменьшено администраторами баз данных (или разработчиками, которые взломали пароли DBA).

Итак, вот все правила, которые остаются в силе на протяжении последних десяти лет, начиная с Oracle7 версии 7.1. Операции индексного сканирования (использующие одноблочные операции ввода/вывода) всегда помещают блоки в MRU-конец связного LRU списка Буферного Кэша. Такие блоки имеют тенденцию сохраняться в Буферном Кэше на значительное время. Природа доступа к древообразной структуре B*-Tree индексов склонна повышать вероятность повторного использования буферов, которые будут постоянно перемещаться обратно в MRU-конец списка. Таким образом, индексы имеют тенденцию к очень хорошему кэшированию.

С другой стороны, операции FTS будут читать данные с диска в буферы кэша, которые будут сразу размещены в LRU-конце связного LRU-списка. Если же таблицы принадлежат к классу маленьких таблиц, то их данные будут считаны в буферы, размещенные в MRU-конце списка. Еще одним исключением является случай, когда таблицы помечены как CACHE и их размер меньше ограничения, накладываемого параметром CACHE_SIZE_THRESHOLD. В этом случае, считываемые блоки будут также размещены в MRU-конце списка.

Резюме характеристик ввода/вывода в Oracle

В целом, для операции FTS характерно, что почти каждая операция логического чтения приводит к операции физического чтения. Это совершенно нормально. Операции FTS обычно имеют 20% или меньший (часто до 1% или 5%) коэффициент попадания в Буферный Кэш, который означает, что практически все (за исключением небольшого числа) операции логического чтения приводят к соответствующим операциям физического чтения. Напротив, для индексного доступа обычно характерны высокие (95% или выше) значения коэффициента попадания в Буферный Кэш.


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