Oracle для профессионалов

         

Область SGA


Каждый экземпляр Oracle имеет одну большую область памяти, которая называется SGA, System Global Area — глобальная область системы. Это большая разделяемая структура, к которой обращаются все процессы Oracle. Ее размер варьируется от нескольких мегабайт в небольших тестовых системах до сотен мегабайт в системах среднего размера и множества гигабайт в больших системах.

В ОС UNIX область SGA — это физический объект, которую можно "увидеть" с помощью утилит командной строки. Физически область SGA реализована как сегмент разделяемой памяти — отдельный фрагмент памяти, к которому могут подключаться процессы. При отсутствии процессов Oracle вполне допустимо иметь в системе область SGA; память существует отдельно от них. Однако наличие области SGA при отсутствии процессов Oracle означает, что произошел тот или иной сбой экземпляра. Эта ситуация — нештатная, но она бывает. Вот как "выглядит" область SGA в ОС UNIX:

$ ipcs -mb IPC status from <running system> as of Mon Feb 19 14:48:26 EST 2001 T ID KEY MODE OWNER GROUP SEGSZ Shared Memory: m 105 0xf223dfc8 --rw-r----- ora816 dba 186802176

В ОС Windows увидеть область SGA, как в ОС UNIX, нельзя. Поскольку на этой платформе экземпляр Oracle работает как единый процесс с одним адресным пространством, область SGA выделяется как приватная память процесса ORACLE.EXE. С помощью диспетчера задач Windows (Task Manager) или другого средства контроля производительности можно узнать, сколько памяти выделено процессу ORACLE.EXE, но нельзя определить, какую часть по отношению к другим выделенным структурам памяти занимает область SGA.

В самой СУБД Oracle можно определить размер области SGA независимо от платформы. Есть еще одно "магическое" представление V$, именуемое V$SGASTAT. Вот как его можно использовать:

tkyte@TKYTE816> compute sum of bytes on pool tkyte@TKYTE816> break on pool skip 1 tkyte@TKYTE816> select pool, name, bytes 2 from v$sgastat 3 order by pool, name;

POOL NAME BYTES ----------- ------------------------------ ---------- java pool free memory 18366464 memory in use 2605056 *********** ---------- sum 20971520


large pool free memory 6079520 session heap 64480 *********** ---------- sum 6144000

shared pool Checkpoint queue 73764 KGFF heap 5900 KGK heap 17556 KQLS heap 554560 PL/SQL DIANA 364292 PL/SQL MPCODE 138396 PLS non-lib hp 2096 SYSTEM PARAMETERS 61856 State objects 125464 VIRTUAL CIRCUITS 97752 character set object 58936 db_block_buffers 408000

db_block_hash_buckets 179128 db_files 370988 dictionary cache 319604 distributed_transactions- 180152 dlo fib struct 40980 enqueue_resources 94176 event statistics per sess 201600 file # translation table 65572 fixed allocation callback 320 free memory 9973964 joxlod: in ehe 52556 joxlod: in phe 4144 joxs heap init 356 library cache 1403012 message pool freequeue 231152 miscellaneous 562744 processes 40000 sessions 127920 sql area 2115092 table columns 19812 transaction_branches 368000 transactions 58872 trigger defini 2792 trigger inform 520 *********** ---------- sum 18322028

db_block_buffers 24576000 fixed_sga 70924 log_buffer 66560 *********** ---------- sum 24713484

43 rows selected.

Область SGA разбита на несколько пулов.

  • Java-пул. Java-пул представляет собой фиксированный пул памяти, выделенный виртуальной машине JVM, которая работает в составе сервера.


  • Большой пул. Большой пул (large pool) используется сервером в режиме MTS для размещения памяти сеанса, средствами распараллеливания Parallel Execution для буферов сообщений и при резервном копировании с помощью RMAN для буферов дискового ввода-вывода.


  • Разделяемый пул. Разделяемый пул (shared pool) содержит разделяемые курсоры, хранимые процедуры, объекты состояния, кеш словаря данных и десятки других компонентов данных.


  • "Неопределенный" ("Null") пул. Этот пул не имеет имени. Это память, выделенная под буферы блоков (кеш блоков базы данных, буферный кеш), буфер журнала повторного выполнения и "фиксированную область SGA".


  • Поэтому графически область SGA можно представить следующим образом:

    +----------------------------------------------------------------------+ | SGA | | +-----------------+ +----------+ +---------------+ +---------------+ | | | | | Java-пул | | Фиксированная | | Буфер журнала | | | | Разделяемый пул | | | | область SGA | | повторного | | | | | +----------+ +---------------+ | выполнения | | | +-----------------+ +---------------+ | | +-----------------------------------------+ +----------------------+ | | | Буферный кеш | | Большой пул | | | +-----------------------------------------+ +----------------------+ | +----------------------------------------------------------------------+



    На общий размер SGA наиболее существенно влияют следующие параметры init.ora.

  • JAVA_POOL_SIZE. Управляет размером Java-пула.


  • SHARED_POOL_SIZE. Управляет (до некоторой степени) размером разделяемого пула.


  • LARGE_POOL_SIZE. Управляет размером большого пула.


  • DB_BLOCK_BUFFERS. Управляет размером буферного кеша.


  • LOG_BUFFER. Управляет (отчасти) размером буфера журнала повторного выполнения.


  • За исключением параметров SHARED_POOL_SIZE и LOG_BUFFER, имеется однозначное соответствие между значением параметров в файле init.ora

    и объемом памяти, выделяемой соответствующей структуре в области SGA. Например, если умножить DB_BLOCK_BUFFERS на размер буфера, получится значение, совпадающее с размером в строке DB_BLOCK_BUFFERS для пула NULL в представлении V$SGASTAT (добавляется определенный объем памяти на поддержку защелок). Суммарное количество байтов, вычисленное из строк представления V$SGASTAT для большого пула, совпадет со значением параметра инициализации LARGE_POOL_SIZE.


    Содержание раздела