Итак, SGA. В SGA (System Global Area) - хранятся структуры памяти, необходимые для манипулирования данными, а так же анализа предложений SQL и кэширования транзакций. Сама по себе System Global Area - разделяемая, то есть к ней одновременно имеют доступ множество процессов, которые в свою очередь могут считывать или модифицировать, содержащиеся в ней данные. Все операции БД, так или иначе, используют информацию, находящуюся в System Global Area. SGA - выделяется сразу же после создания экземпляра, еще на предустановочной стадии. Освобождается эта область только после того как экземпляр будет закрыт. SGA - в свою очередь состоит из следующих компонентов:
По порядку - Shared Pool.
Разделяемый пул (Shared Pool) содержит кэш библиотек, кэш словаря и управляющие структуры сервера (такие как набор символов БД). Кэш библиотеки хранит текст, форматы лексического анализатора и план выполнения предложений SQL, которые адресуются БД. Кроме того, здесь находятся заголовки PL/SQL пакетов и процедур, выполнявшихся ранее. Так же кэш словаря хранит строки словаря данных, которые были использованы для анализа предложений SQL. Сам сервер Oracle использует для повышения производительности и скорости выполнения операций и операторов SQL, кэш библиотеки. Таким образом, когда передается очередное SQL - выражение, сервер, в первую очередь, просматривает кэш в поисках подобного выражения, которое уже передавалось ранее. Если оно найдено, то используется соответствующее дерево лексического анализа, что приводит к повышению скорости выполнения операторов SQL. Но, есть одно существенное замечание - выражения SQL, должны быть полностью идентичны, вплоть до регистра символов операторов и переменных. Так как Oracle сравнивает тексты выражений, применяя алгоритм хеширования, который чувствителен к регистру символов текста. Так же кэш библиотек содержит разделяемые и локальные области SQL. Разделяемая область включает в себя дерево лексического анализа и план выполнения SQL - оператора, а локальная область информацию, зависящую от текущего сеанса работы. Локальная область формируется для каждой инициируемой транзакции и освобождается после того, как закрывается соответствующий курсор. Этот процесс определяет параметр open_cursor в файле init.ora. В соответствии с этим, Oracle может повторно использовать информацию, общую для всех выражений SQL, а информация, специфическая для данного сеанса, может быть выбрана из локальной области Shared Pool. Локальная область SQL в свою очередь делится, на переходящую (persistent) и область времени выполнения (runtime). Переходящая область содержит информацию, которая сохраняет свое значение и может быть использована несколькими выражениями SQL. А область времени выполнения - только информацию, для выражения выполняемого в текущий момент. Кэш словаря содержит информацию из словаря данных, необходимую СУРБД для лексического анализа SQL - выражения. В ней находятся данные, касающиеся сегментирования, привилегий доступа и размеров свободной памяти. Собственно сам размер выделяемого пула определяется параметром SHARED_POOL_SIZE в файле init.ora. Это кстати очень интересный параметр и когда мы, наконец, доберемся до раздела создания экземпляра, вы с ним познакомитесь более тесно. Если его размер не достаточен, то может наступить момент когда для загрузки очередного объекта не найдется непрерывной области памяти подходящего объема. Нужно просто определять его размер с "запасом"! :)