
Oracle - MS Server / OracleМП / лекции оракл / lect5_m2_ipovs_ipovs_SUBDOracle_231000.62
.docЛекция 5. Архитектура экземпляра Oracle.
Схематично экземпляр Oracle представлен на рис.2.3 Функционирование экземпляра зависит от его настроек, связанных с компонентами SGA (или ГСО) и касающихся фоновых процессов [1].
Рис.2.3. Экземпляр Oracle
ГСО выделяется сразу же после создания экземпляра. Эта область разделяемая, т.е. к ней одновременно имеет доступ множество процессов, которые могут считывать из нее данные или модифицировать их. В ГСО хранятся структуры, необходимые для манипулирования данными, анализа предложений SQL и кэширования транзакций. Все операции в БД так или иначе используют информацию, находящуюся в ГСО. Освобождается эта область только после полного выключения экземпляра.
ГСО состоит из следующих компонентов [1]:
-
разделяемый пул (Shared Pool);
-
кэш-буфер данных (Database Buffer Cache);
-
буфер журнала транзакций (Redo Log Buffer);
-
структуры сервера многопоточной среды Multi-Threaded Server (MTS).
Разделяемый пул (см. рис.2.3) содержит кэш библиотеки, кэш словаря и управляющие структуры сервера (такие, как набор символов БД).
Кэш библиотеки хранит текст, форматы лексического анализатора и план выполнения предложений SQL, которые передаются СУБД. Кроме того, здесь содержатся заголовки пакетов PL/SQL и процедур, выполнявшихся ранее.
Сервер Oracle использует кэш библиотеки для повышения скорости выполнения операторов SQL. При поступлении очередного выражения языка SQL, сервер, в первую очередь, просматривает кэш в поисках такого же выражения, переданного ранее. Если оно найдено, то используется соответствующее ему дерево лексического анализа, что избавляет от необходимости формировать его повторно, тем самым повышая скорость выполнения операторов SQL. Необходимо заметить, что для использования преимуществ этой технологии, поступившее выражение SQL и выражение, находящееся в кэше, должны быть полностью идентичны, вплоть до регистров символов и переменных. Oracle сравнивает тексты выражений, используя алгоритм хеширования, который чувствителен к регистру символов текста.
Кэш библиотеки включает в себя разделяемые и локальные области SQL. Разделяемая область содержит информацию, зависящую от текущего сеанса работы. Это могут быть присоединенные переменные, параметры окружения, стеки и буферы, необходимые для выполнения, и т.п. Локальная область формируется для каждой инициируемой транзакции и освобождается после того, как закрывается соответствующий курсор (запрос к базе данных, возвращающий данные по строкам, что позволяет применять к каждой из них операции модификации). Количество локальных областей, которые можно одновременно открыть во время сеанса работы, ограничивается параметром OPEN_CURSORS в файле inlt.ora. Посредством этих двух структур памяти Oracle может повторно использовать информацию, общую для всех выражений SQL, а информация, специфическая для данного сеанса, может быть выбрана из локальной области.
Локальная область SQL, в свою очередь, делится на постоянную (persistent) и область времени выполнения. Постоянная область содержит информацию, которая сохраняет свое значение и может быть использована несколькими выражениями SQL, а область времени выполнения - только информацию для выражения, выполняемого в текущий момент.
Кэш словаря хранит строки словаря данных, которые были использованы для лексического анализа предложений SQL. В этой области содержится информация, касающаяся сегментирования, привилегий доступа и размера свободной памяти.
Главным параметром разделяемого пула является параметр SHARED__POOL_SIZE в файле init.ora, который определяет его размер (в байтах). Необходимо заказывать объем пула, достаточный для загрузки и сохранения блоков PL/SQL и выражений SQL. По мере загрузки и выгрузки объектов данных область фрагментируется, и может наступить такой момент, когда для загрузки очередного объекта не найдется непрерывной области подходящего объема. Если такая ситуация возникает, то может помочь команда SQL
ALTER SYSTEM FLUSH SHARED_POOL
Если ситуация повторяется часто, нужно увеличить объем пула в файле параметров init.ora.
Кэш-буфер данных является одним из основных разделов ГСО, от функционирования которого во многом зависит производительность системы. Он состоит из блоков памяти того же размера, что и блоки Oracle. Все данные, с которыми работает СУБД, первым делом загружаются в кэш-буфер. В этих же блоках памяти выполняется и любое обновление данных, поэтому очень важно правильно установить размер буфера. Доступ к памяти выполняется в сотни раз быстрее, чем доступ к дискам, и при использовании системы оперативной обработки транзакций (OLTP-системы) крайне желательно, чтобы большинство операций с данными выполнялось в памяти кэш-буфера, куда данные уже предварительно загружены.
СУБД переносит данные на диск в соответствии с порядком их размещения в списке LRU (Least Recently Used - использованные наиболее давно). Этот список отслеживает обращение к блокам данных и учитывает частоту обращений. Когда выполняется обращение к блоку данных, хранящемуся в кэш-буфере, он помещается в тот конец списка, который носит название MRU (Most Recently Used - только что использован). Если серверу требуется место в кэш-буфере для загрузки нового блока с диска, он обращается к списку LRU и решает, какой из блоков перенести на диск, чтобы освободить место для нового. Блоки, наиболее отстоящие в списке от MRU, - наиболее вероятные кандидаты на перенос (удаление из кэш-буфера). Таким образом, дольше всего остаются в кэш-буфере те блоки, к которым наиболее часто выполняется обращение.
Если происходит обращение к блокам, доступ к которым требует полного просмотра некоторой таблицы, то такая ситуация является исключением из описанной методики использования списка LRU. Подобные блоки сразу помещаются в самый конец списка. Чтобы отменить соглашение, принятое по умолчанию, необходимо квалифицировать соответствующую таблицу как CACHE.
Блоки, в которых произошли изменения, называются грязными (dirty) и помещаются в соответствующий dirty-список. В этом списке отслеживаются все изменения блоков данных, выполненные за время их нахождения в кэш-буфере и не зафиксированные на диске. Когда Oracle получает запрос на изменение данных, соответствующие изменения реализуются в блоках кэш-буфера, а сведения о них заносятся в dirty-список. Одновременно данные о выполненных операциях вносятся и в журнал транзакций. В дальнейшем, при обращении к блокам данных, попавшим в dirty-список, будут считываться уже модифицированные значения, хотя сами данные могут еще и не быть переписаны на диск.
Сервер Oracle использует отложенную многоблочную процедуру записи на диск с тем, чтобы уменьшить влияние времени обращения к дисковой памяти на производительность системы. Термин «отложенная» - означает, что обновление данных, выполненное СУБД, не фиксируется немедленно в дисковой памяти. СУБД ждет, пока не произойдет одно из следующих событий: внесены изменения в некоторое, заранее установленное число блоков данных; потребуется освободить место в кэш-буфере для загрузки новых блоков данных; обнаружена контрольная точка; истекло время, заданное процессом DBWR. В любом из этих случаев группа модифицированных блоков данных переписывается из кэш-буфера в файлы.
Размер кэш-буфера определяется двумя параметрами файла init.ora - DB_BLOCK_SIZE и DB_BLOCK_BUFFERS. Параметр DB_BLOCK_SIZE используется при создании БД для определения размера блока Oracle. В свою очередь, параметр DB_BLOCK_BUFFERS определяет количество блоков, выделяемых для кэш-буфера данных. Общий объем кэш-буфера данных (в байтах) является произведением значений этих двух параметров - DB_BLOCK_SI-ZE*DB_BLOCK_BUFFERS, и .рациональный выбор этого значения является основным в настройке кэш-буфера. Для кэш-буфера данных нет необходимости выделять весь доступный объем памяти компьютера, главное - определить самое рациональное значение объема кэш-буфера, при котором память используется наиболее оптимально. Найти такое значение можно методом последовательных проб, увеличивая заказанный размер буфера и фиксируя, насколько заданное увеличение сказывается на производительности системы. Проанализировав полученные значения, можно заметить, что в начале этого процесса увеличение размера кэш-буфера довольно значительно повышает производительность системы, но затем его влияние постепенно снижается. Здесь потребуется определенный опыт, чтобы вовремя остановиться и использовать оставшийся свободным ресурс памяти для других управляющих структур СУБД.
Все данные о завершившихся транзакциях хранятся в буфере журнала транзакций до тех пор, пока не будут переписаны в файл оперативного журнала транзакций. Это типичный циклический буфер, т.е. он заполняется от начала до конца, а затем новая информация снова записывается в начало буфера. После заполнения буфера его содержимое переносится в файл журнала транзакций.
Размер буфера журнала транзакций задается параметром LOG_BUFFER в файле init.ora. Значение параметра указывает размер буфера в байтах. Если это значение не велико, то процесс LGWR очень часто будет переписывать информацию из буфера в файл и тем самым замедлять работу системы. Однако это будет проявляться только в случае большой интенсивности обращения к БД.
Процесс записи в журнал можно оперативно контролировать при помощи представления v$sysstat. Если запросить v$sysstat для поля value с полем name, равным «redo log space wait time», в результате получим время, в течение которого пользовательские процессы находились в состоянии ожидания при обращении к буферу журнала транзакций.
Для того чтобы гарантировать последовательный характер записи в буфер журнала, сервер Oracle управляет доступом к нему при помощи защелок (latch). Такая защелка представляет собой блокировку процессом Oracle некоторой структуры в памяти - аналогично блокировке файла или строки таблицы. Процесс блокирует посторонние обращения к памяти, выделенной для буфера журнала транзакций. Таким образом, если один процесс «наложил» защелку на буфер, другие не могут обратиться к нему до тех пор, пока защелка не будет снята.
Количество транзакций, данные о которых заносятся в журнал одновременно, сервер Oracle ограничивает параметром TRANSACTIONS. Значение, принимаемое системой по умолчанию, может меняться в зависимости от используемой операционной системы и аппаратных средств. Для многопроцессорных серверов допускается выделение пространства, большего, чем задано параметром TRANSACTIONS. При этом вместо защелки на выделение памяти процессы могут использовать защелки копий журнала транзакций (redo copy latch). Параметр _LOG_SIMULTANEOUS_COPIES задает количество таких защелок. По умолчанию значение _LOG_SIMULTANEOUS_COPIES равно количеству процессоров в системе. Используя защелки копий журнала транзакций, несколько процессов могут одновременно записывать информацию в буфер журнала транзакций.
Чтобы проанализировать работу буфера журнала транзакций, можно запросить содержимое динамического представления v$latch, в котором содержится информация о каждом типе защелки.
Список литературы
-
Илюшечкин В.М. - Учебно-методические разработки для самостоятельной работы студентов, изучающих дисциплину «СУБД Oracle»
-
All-Oracle [Электронный ресурс]. – URL:http://all-oracle.ru/content/view/?part=1&id=68
-
Oracle для профессионалов [Электронный ресурс]. – URL: http://citforum.ru/database/oracle/kyte