Продолжаем немного сухую теоретическую часть. Что поделать, знать это нужно все равно. Итак, следующий пункт: Кэш-буфер данных (Database Buffer Cache).
Производительность всей системы в целом зависит от функционирования кэш-буфера данных. Самое интересное, что он состоит из блоков памяти того же размера, что и блоки Oracle. С ними мы познакомились в шаге 22. Все данные первым делом загружаются в кэш-буфер. В них же выполняется и любое обновление данных, по этому очень важно, правильно установить размер буфера. Сам Oracle переносит данные на диск (используя при этом подкачку swap - данных) в соответствии с порядком их размещения в списке LRU (Least Recently Used - дословно, наиболее давно использовавшиеся). Этот список отслеживает обращение к блокам данных и учитывает частоту обращений к ним. Про этот механизм мы уже с вами говорили. Когда выполняется обращение к блоку данных, хранящемуся в кэш-буфере, он помещается в тот конец списка, который называется MRU (Most Recently Used - только что использованные). При этом, если серверу требуется место в кэш-буфере для загрузки нового блока с диска, он обращается к списку LRU и решает какой из блоков перенести на диск, для того чтобы освободить место для нового блока. Блоки наиболее удаленные в списке от MRU, самые вероятные кандидаты на удаление из кэш-буфера. Таким образом, дольше всего остаются в кэш-буфере те блоки, обращение к которым производится наиболее часто.
Модифицированные блоки называются грязными (dirty) и помещаются в соответствующий dirty-список. В этом списке отслеживаются все модификации блоков данных, выполненные за время их нахождения в кэш-буфере и не зафиксированные. Когда Oracle получает запрос на изменение данных, соответствующие изменения выполняются в блоках кэш-буфера, а сведения об измененных блока заносятся в dirty-список. При этом одновременно данные о выполненных операциях заносятся в журнал транзакций. В дальнейшем при обращении к блокам данных, попавшим в dirty-список, будут, считывается уже модифицированные значения, хотя сами данные при этом могут быть еще не зафиксированы. Oracle использует "отложенную" многоблочную процедуру записи на диск. Отсюда следует, что "отложенная" означает - обновление данных выполненное сервером не фиксируется немедленно, а сервер ждет пока не возникнут следующие события:
В любом из этих случаев группа модифицированных блоков данных переписывается на диск из кэш-буфера в файлы. Для определения правильного размера кэш-буфера, требуется определенный опыт. Размер кэш-буфера определяется двумя параметрами настройки DB_BLOCK_SIZE и DB_BLOCK_BUFFERS в файле init.ora. Общий объем кэш-буфера(в байтах) определяется, как произведение этих двух параметров DB_BLOCK_SIZE*DB_BLOCK_BUFFERS. Вот так устроен и работает механизм под названием кэш-буфер данных.