Глобальная область системы
состоит из следующих компонентов:
1) разделяемый пул (shared pool);
2) кэш-буфер базы данных (database buffer cache);
3) буфер журнала транзакций (redo log buffer).
Кратко опишем назначение каждого из этих разделов глобальной об-
ласти системы.
Разделяемый пул кэширует информацию, используемую при разборе и
выполнении операторов SQL. Разделяемый пул содержит два основных
раздела: кэш библиотек и кэш словаря данных.
Кэш библиотек хранит текст SQL-выражений, форматы лексического
анализатора и план выполнения предложений SQL. Кроме того, здесь же
содержатся заголовки пакетов PL/SQL и процедур, которые могут совме-
стно использоваться пользовательскими процессами. Сервер Oracle ис-
пользует кэш библиотек для повышения скорости выполнения операто-
ров SQL. Когда передается очередное SQL-выражение, сервер в первую
очередь просматривает кэш в поисках такого же выражения, переданного
ранее. Если оно найдено, то используется соответствующее ему дерево
лексического анализа и план выполнения запроса, что избавляет от необ-
ходимости формировать их повторно. Кэш библиотек содержит и разде-
ляемые области SQL, и локальные области SQL. Разделяемая область
SQL включает дерево лексического анализа и план выполнения
SQL-выражения, а локальная область – информацию, зависящую от те-
кущего сеанса работы. Это могут быть присоединенные переменные, па-
раметры окружения, стеки и буферы, необходимые при выполнении. Ло-
кальная область формируется для каждой инициируемой транзакции и
освобождается после того, как закрывается соответствующий курсор.
Используя эти структуры памяти, сервер Oracle может повторно исполь-
зовать информацию, общую для всех выражений SQL, а информация,
специфичная для данного сеанса, может быть выбрана из локальной об-
ласти. Локальная область SQL делится в свою очередь на переходящую
(persistent) область и область времени выполнения (runtime). При этом
переходящая область содержит информацию, которая сохраняет свое
значение и может быть использована несколькими выражениями SQL, а
114
область времени выполнения – только информацию для выражения, вы-
полняемого в текущий момент.
Кэш словаря – хранит строки словаря данных, которые были исполь-
зованы для лексического анализа SQL-выражений. В этой области нахо-
дятся данные, касающиеся сегментирования, привилегий доступа и раз-
меров свободной памяти. При запуске экземпляра он загружается неко-
торым начальным набором элементов и в процессе работы пополняется
необходимыми данными из словаря.
Кэш-буфер данных состоит из буферов БД и хранит информацию, за-
гружаемую из БД серверными процессами. Все модификации над дан-
ными реализуются в кэш-буфере. Имеется список, отслеживающий час-
тоту обращений к хранящимся в кэш-буфере блокам данных. Сервер пе-
реносит данные на диск в соответствии с порядком их размещения в спи-
ске LRU (Least Recently Used, дословно – «наиболее давно использовав-
шиеся»). Этот список отслеживает обращение к блокам данных и учиты-
вает частоту обращений. Когда выполняется очередное обращение к
блоку данных, хранящемуся в кэш-буфере, он помещается в тот конец
списка, который называется MRU (Most Recently Used – «только что ис-
пользованные»). Если серверу требуется место в кэш-буфере для загруз-
ки нового блока с диска, он обращается к списку LRU и решает, какой из
блоков перенести на диск, чтобы освободить место для нового блока.
Блоки, наиболее удаленные в списке от MRU, самые вероятные кандида-
ты на удаление из кэш-буфера. Таким образом, дольше всего остаются в
кэш-буфере те блоки, к которым обращение выполняется чаще всего.
Модифицированные блоки называются «грязными» (dirty) и помещаются
в соответствующий dirty-список. В этом списке отслеживаются все мо-
дификации блоков данных, выполненные за время их нахождения в кэш-
буфере и не зафиксированные на диске. Когда Oracle получает запрос на
изменение данных, соответствующие изменения выполняются в области
кэш-буфера, а сведения об изменениях в блоках заносятся в dirty-список;
одновременно данные о выполненных операциях вносятся в журнал
транзакций. В дальнейшем при обращении к блокам данных, попавшим в
dirty-список, будут считываться уже модифицированные значения, хотя
сами данные могут к этому времени еще не быть записаны на диск. Сер-
вер использует отложенную многоблочную процедуру записи на диск с
целью повышения производительности. Отложенная процедура означает,
что обновление данных, выполненное Oracle, не фиксируется немедлен-
но в дисковой памяти. Перенос этих dirty-блоков назад в БД осуществля-
ется процессом DBWR при наступлении одного из определенных собы-
тий, таких как «контрольная точка», «выгрузка файла» и др.
115
Буфер журнала транзакций хранит данные о транзакциях до тех пор,
пока они не будут переписаны в оперативный файл журнала транзакций.
Это типичный циклический буфер – он заполняется от начала до конца, и
затем новая информация снова записывается в начало буфера. После за-
полнения содержимое буфера процессом LGWR переносится в опера-
тивный файл журнала транзакций. Для того чтобы гарантировать после-
довательный характер записи в буфер журнала, сервер Oracle управляет
доступом к нему при помощи защелок (latch). Такая защелка представля-
ет собой не что иное, как блокировку процессом Oracle некоторой струк-
туры в памяти – аналогично блокировке файла или строки таблицы.
Процесс блокирует посторонние обращения к памяти, выделенной для
буфера журнала транзакций. Таким образом, если один процесс наложил
защелку на буфер, другие не могут обратиться к нему до тех пор, пока
защелка не будет снята. Сервер Oracle ограничивает количество транзак-
ций, данные о которых заносятся в журнал одновременно.
Достарыңызбен бөлісу: |