Память экземпляров oracle sga и pga имеет недостаточный размер

Обновлено: 07.07.2024

Я работаю с командой, которая разрабатывает приложение, работающее на SQL Server и Oracle.

SQL Server имеет концепцию экземпляра, который может содержать несколько баз данных. Oracle 10g требует одного экземпляра для каждой базы данных (и может допускать больше для избыточности), поэтому для каждой базы данных, которую мы запускаем, у нас есть полностью отдельный набор процессов и, следовательно, гораздо большее использование памяти.

Из-за этого мы начали больше переходить к одному экземпляру с отдельными схемами. Однако мы по-прежнему хотим хранить отдельные данные о клиентах (или машинах разработчиков) отдельно.

Большинство наших экземпляров создаются с использованием локально разработанных скриптов (например, oradim в Windows).

Что можно сделать, чтобы сократить требования к использованию памяти, занимаемой площади и т. Д. Экземпляров Oracle, чтобы несколько экземпляров могли безопасно работать на одной машине? Что лучше: Linux или Windows? Можем ли мы легко добиться успеха, отключив дополнительные функции (интеллектуальный анализ данных, Oracle Text и т. Д.), Которые нам не нужны?

MEMORY_TARGET - это параметр, который вы хотите установить, если вы используете Oracle 11g.

Когда вы добавляете больше экземпляров базы данных на тот же сервер, вам нужно будет уменьшить этот параметр на всех других экземплярах, чтобы вы не использовали слишком много памяти на сервере и не вызывали его подкачку. В Oracle 10g вы устанавливаете PGA_AGGREGATE_TARGET и SGA_TARGET.

К сожалению, чем больше экземпляров Oracle вы добавляете, тем сложнее его настраивать и тем медленнее становится система.

У меня действительно мало информации о Windows и Linux.

Память IMHO наиболее важна для производительности Oracle .

Запуск нескольких баз данных подразумевает хранение нескольких наборов кешированных SQL и PL/SQL , нескольких кешей данных для системных таблиц и т. Д.

Если вам просто нужно хранить данные отдельно, вы можете создать разные TABLESPACES для разных пользователей. Однако вам все равно придется поделиться LOGFILES .

Отключение дополнительных функций, таких как Data Mining , вам не очень поможет, поскольку они не потребляют память, когда не используются.

Вам, безусловно, нужно будет уменьшить любые значения памяти, но трудно сказать, какие из них следует оставить, а какие уменьшить, не видя дизайна базы данных.

Как очень неточное эмпирическое правило, если у вас есть база данных OLTP , то есть маленькие таблицы и высокий уровень параллелизма, вам, вероятно, следует пожертвовать sort_area_size и hash_area_size , но держите db_block_buffers как можно выше.

Если у вас есть большие таблицы с использованием HASH JOINS и MERGE JOINS , вам понадобятся sort_area_size и hash_area_size для эффективных объединений и упорядочения, но вы можете уменьшить db_block_buffers , поскольку вы все равно не сможете кэшировать эти таблицы.

Linux и Windows не сильно различаются по производительности Oracle . Linux , однако, милости LOCK_SGA . Windows тоже пытается это сделать, но может поменять местами в жестких условиях памяти.

Потребление памяти будет происходить из следующих областей:

  1. для каждого экземпляра SGA
  2. за сеанс UGA, PGA (сортировка и т. д.)
  3. разное другие требования к памяти для каждого процесса, не описанные выше (например, стек и куча, используемые каждым процессом оракула, память, используемая фактическими исполняемыми образами и т. д.)

Стоимость 1 стоит того, чтобы разработчики и клиенты не перегружали буферные кеши друг друга. Те экземпляры, которые не заботятся о таких вещах, должны быть объединены.

Вы можете предположить, что стоимость 2 оплачивается в той или иной форме всеми СУБД (и исключительно функцией конфигурации вашей СУБД), так что это не компромисс.

Я полагаю, что влияние 3 лучше всего снижено в Linux из-за форка и совместного использования страниц, поэтому вы платите только за то, чем пользуетесь. В современных системах * nix метод fork вместо многопоточности чрезвычайно эффективен как с точки зрения ЦП, так и с точки зрения памяти, но при этом предлагает множество других преимуществ (вам практически не нужно бояться утечек памяти).

Сказав это, не забывайте, что показания памяти из диспетчера задач Windows или из top могут вводить в заблуждение относительно фактического потребления памяти процессом из-за "двойного счета": сегмент разделяемой памяти, а также размер фактических исполняемых файлов Oracle и динамически подключаемых библиотек может быть подсчитан для каждого процесса, хотя на самом деле эта память используется совместно (и используется только один раз) всеми задействованными процессами. В Unix используйте «pmem» или «cat / proc // maps», чтобы увидеть, сколько памяти фактически используется процессом и сколько совместно используется.

Если ваша основная цель - разделение клиентских данных, нет необходимости запускать несколько экземпляров. Вы можете достичь двух типов разделения. Вы уже достигли первого, логического разделения, поместив каждого клиента в отдельную схему. Чтобы физически разделить данные, создайте табличное пространство для каждого клиента. Табличное пространство - это группа фактических файлов базы данных. Используя их, вы контролируете, где физически хранятся ваши данные. Назначьте клиентское табличное пространство как «табличное пространство по умолчанию» при создании схемы для клиента.

Если вы не хотите делать что-то вроде запуска разных версий Oracle на одном сервере, редко есть причина запускать более одного экземпляра. Чтобы получить максимальную отдачу от вашего отдельного экземпляра, поместите как можно больше его в память и используйте такие инструменты, как TOAD или входящие в комплект инструменты Oracle, чтобы оптимизировать выделение памяти для различных процессов Oracle.

Если у вас есть отдельные схемы, у вас есть отдельные данные по отдельным клиентам. Зачем нужно больше экземпляров? Один экземпляр на машину лучше всего подходит для среды producton.

Для среды разработки вы можете сделать другой выбор. Но среду разработки и производственную среду следует разделить.

Согласитесь с концепцией «один экземпляр на сервер». Если вы хотите предоставить некоторым пользователям предпочтение по сравнению с другими или обеспечить, чтобы каждое приложение получило справедливую долю базы данных, изучите управление ресурсами и профили.

Хранение данных в отдельных схемах (и табличных пространствах на физическом уровне) должно обеспечивать соответствующее разделение данных о клиентах. Пока вы не разделяете табличные пространства между схемами, tt становится (относительно) тривиальным для использования экспортных и переносимых табличных пространств для извлечения и разделения отдельных схем, чтобы вы могли перемещать их между базами данных (и, следовательно, экземплярами), если впоследствии необходимо иметь их на собственном сервере.

Можете ли вы добавить памяти к серверу? Вы можете купить 32 ГБ памяти менее чем за 1000 долларов.

1. Объяснение терминов
(1) SGA: системная глобальная область является базовым компонентом экземпляра Oracle, который выделяется при запуске экземпляра, а системный глобальный домен SGA состоит в основном из трех частей: общего пула, буфера данных и буфера журнала.

(2) Общий пул: Общий пул используется для кэширования недавно выполненных операторов SQL и недавно использованных определений данных, в основном, включая: библиотечный кеш (область общего SQL) и кэш словаря данных (буфер словаря данных). Общая область SQL - это область, в которой хранятся пользовательские команды SQL, а в буфере словаря данных хранится динамическая информация об операциях базы данных.

(3) Буферный кеш: Буферный кеш базы данных используется для кэширования блоков данных, извлеченных из файлов данных, что может значительно повысить производительность запросов и обновления данных.

(4) Большой пул: Большой пул - это дополнительная область памяти в SGA, которая используется только в среде общего сервера.

(5) Пул Java: Пул Java предоставляет услуги для анализа синтаксиса команд Java.

(6) PGA: глобальная область процесса - это память, зарезервированная для каждого пользовательского процесса, подключенного к базе данных Oracle.

Во-вторых, анализ и корректировка
(1) Системный глобальный домен:
SGA относится к операционной системе, объему памяти, процессору и количеству пользователей, вошедших в систему одновременно. Он может занимать от 1/3 до 1/2 физической памяти системы ОС.
А. Общий пул:
Просмотрите уровень использования общей области SQL:

  1. select ( sum (pins-reloads))/ sum (pins) "Library cache" from v$librarycache; --Динамическая таблица производительности

Этот коэффициент использования должен быть выше 90%, в противном случае размер общего пула необходимо увеличить.

Посмотрите уровень использования буфера словаря данных:

  1. select ( sum (gets-getmisses-usage-fixed))/ sum (gets) "Data dictionary cache" from v$rowcache; --Динамическая таблица производительности

Этот коэффициент использования также должен быть выше 90%, в противном случае размер общего пула необходимо увеличить.

Измените размер общего пула:

б) буферный кеш:
Просмотр использования буфера данных базы данных:

  1. SELECT name ,value FROM v$sysstat order by name WHERE name IN ( '' DB BLOCK GETS '' , '' CONSISTENT GETS '' , '' PHYSICAL READS '' );

Рассчитанная частота попадания в буфер данных = 1- (физическое чтение / (блок дБ получает + постоянное получение)), этот коэффициент должен быть выше 90%, в противном случае необходимо увеличить размер буфера данных.

c) буфер журнала
Просмотрите использование буфера журнала:

  1. SELECT name , value FROM v$sysstat WHERE name IN ( '' redo entries '' , '' redo log space requests '' );

Результат запроса может вычислить частоту сбоев приложения буфера журнала:
Частота сбоев приложения = количество запросов / записей, частота сбоев приложения должна быть близка к 0, в противном случае буфер журнала слишком мал, а буфер журнала базы данных ORACLE необходимо увеличить.

г. Большой бассейн:
Это может снизить нагрузку на общий пул и может использоваться для резервного копирования, восстановления и других операций без использования алгоритма LRU для управления. Размер определяется базой данных «совместно используемый режим / режим БД». Если это общий режим, он будет больше.
Укажите размер Большого пула:

д. пул Java:
Используется, когда Java установлена ​​и используется.

(2) регулировка PGA
А. PGA_AGGREGATE_TARGET настройки инициализации

Значение PGA_AGGREGATE_TARGET должно быть установлено на основе общего объема доступной памяти экземпляра Oracle. Этот параметр может быть изменен динамически. Предположим, что экземпляр Oracle может выделить 4 ГБ физической памяти, а оставшаяся память - операционной системе и другим приложениям. Вы можете выделить 80% доступной памяти для экземпляра Oracle, что составляет 3,2 ГБ. Области SGA и PGA теперь должны быть разделены в памяти.

В системе OLTP (оперативная обработка транзакций) типичная настройка памяти PGA должна составлять небольшую часть общего объема памяти (например, 20%), а оставшиеся 80% выделяются для SGA.
OLTP:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20%

В системе DSS (набор данных) типичная память PGA выделяется до 70% памяти из-за большого количества запросов, которые будут выполняться.
DSS:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50%

В этом примере общий объем памяти составляет 4 ГБ. Для систем DSS вы можете установить для PGA_AGGREGATE_TARGET значение 1600 МБ, а для OLTP - 655 МБ.

б) настроить автоматическое управление PGA

Не нужно перезагружать БД, напрямую изменять онлайн.

SQL> alter system set workarea_size_policy=auto scope=both;

SQL> alter system set pga_aggregate_target=512m scope=both;

SQL> show parameter workarea

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy строка рабочей строки AUTO - для нее установлено значение AUTO
SQL> show parameter pga

c. Отслеживать производительность автоматического управления памятью PGA

V $ PGASTAT: это представление дает статистику на уровне экземпляра использования памяти PGA и автоматического распределения.

SQL> set lines 256
SQL> set pages 42
SQL> SELECT * FROM V$PGASTAT;

NAME VALUE UNIT
---------------------------------------------------------------- ---------- ------------
совокупный целевой параметр PGA: 536870912 текущее значение байта PGA_AGGREGATE_TARGET
агрегированная автоматическая цель PGA 477379584 байт-размер PGA, доступный в настоящее время для автоматического выделения, должен быть меньше, чем PGA_AGGREGATE_TARGET
привязка к глобальной памяти привязка к глобальной памяти 26843136 байт - максимальный размер рабочей области в автоматическом режиме, Oracle автоматически подстраивается в соответствии с рабочей нагрузкой.
total PGA inuse 6448128 bytes
всего выделено PGA
maximum PGA allocated 166175744 bytes
общая свободная память PGA, память PGA, 393 216 байт, максимальный свободный размер PGA
PGA memory freed back to OS 69074944 bytes
Всего PGA используется для авто рабочих площадей
maximum PGA used for auto workareas 1049600 bytes
total PGA used for manual workareas 0 bytes
maximum PGA used for manual workareas 530432 bytes
число перерасходов 1 количество перерасчетов 1118 - После запуска экземпляра количество распределений, которое происходит после запуска экземпляра, если это значение больше 0, следует рассмотреть возможность увеличения значения pga
bytes processed 114895872 bytes
extra bytes read/written 4608000 bytes
процент попаданий в кеш…

16 rows selected.

SQL> SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,
ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,
ESTD_OVERALLOC_COUNT
FROM v$pga_target_advice;

The output of this query might look like the following:

TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT
---------- -------------- --------------------
63 23 367
125 24 30
250 30 3
375 39 0
500 58 0
600 59 0
700 59 0
800 60 0
900 60 0
1000 61 0
1500 67 0
2000 76 0
3000 83 0
4000 85 0

Можно видеть, что когда TARGET_MB составляет 375M, ESTD_OVERALLOC_COUNT = 0, поэтому вы можете установить PGA_AGGREGATE_TARGET на 375M.


Приложение: Разница между оракулом SGA и PGA:
SGA: область памяти, используемая для хранения информации базы данных, которая используется процессами базы данных. Он содержит данные и управляющую информацию сервера Oracle, он распределяется в фактической памяти компьютера, на котором находится сервер Oracle. Если фактической памяти недостаточно, он записывается в виртуальную память.
PGA: содержит данные и управляющую информацию одного серверного процесса или одного фонового процесса. В отличие от SGA, совместно используемого несколькими процессами, PGA является областью, используемой только одним процессом. PGA выделяется, когда процесс создается и перерабатывается после его завершения.

Обзор управления памятью

Память сервера баз данных имеет определенный размер. Поэтому пространство, доступное экземпляру базы данных Oracle, ограничено. Необходимо уделять внимание тому, как распределяется память. Когда слишком много памяти под определенную область, а в этом нет необходимости, тогда существует вероятность того, что функционирование неоптимально, так как другим областям недостаточно места.

Использование автоматического выделения памяти значительно упрощает задачу. Но даже в таком случае в целях оптимизации необходим мониторинг и может потребоваться ручное конфигурирование размеров некоторых частей памяти.

В курсе Oracle Database 10g: Администрирование I было представлено введение в вопросы настройки памяти. В этом уроке описывается, как функционирует автоматическая настройка памяти, когда производить ручную настройку, что представляет из себя программная глобальная область (Program Global Area - PGA), а также предоставляются подробные сведения о каждой структуре памяти экземпляра Oracle.

Структуры памяти Oracle

С экземпляром Oracle связаны следующие основные структуры памяти:

системная глобальная область (System Global Area - SGA); эта область совместно используется всеми серверными и фоновыми процессами.
программная глобальная область (Program Global Area - PGA); такая приватная область выделяется для каждого серверного и фонового процесса (одна область PGA для каждого процесса).

SGA - разделяемая область, содержащая данные и управляющую информацию экземпляра.


SGA содержит следующие структуры данных:

кэш буферов базы данных (database buffer cache) - используется для кэширования блоков, выбираемых из файлов данных;
журнальный буфер (redo log buffer) - содержит журнальные данные перед их записью в журнальные файлы;
разделяемый пул (shared pool) - содержит различные структуры, которые могут совместно использоваться пользователями;
большой пул (large pool) - необязательная область памяти, используемая буферами ввода-вывода большого объема при выполнении параллельных запросов, разделяемым сервером, Oracle ХА, а также определенными типами операций резервирования;
java-пул - используется при выполнении Java-кода всех сеансов и обработки данных внутри виртуальной Java-машины (Java Virtual Machine - JVM);
streams пул - используется опцией Oracle Streams;
keep пул - необязательный дополнительный пул буферов для объектов, чьи блоки должны оставаться в памяти как можно дольше;
recycle пул - для блоков, которые не должны задерживаться в памяти;
кэши буферов для блоков размера иК; кэшируют блоки данных, размер которых отличается от стандартного размера блока базы данных; используются для поддержки перемещаемых табличных пространств (transportable lablespaces).


В динамической инфраструктуре SGA размеры кэша буферов базы данных, разделяемого пула, большого пула, Streams-пула и Java-пула изменяются без остановки экземпляра. Кроме того, размеры таких структур памяти, как удерживающий кэш буферов (keep buffer cache), рециклируюший кэш буферов (recycle buffer cache), а также кэши буферов для блоков размера «К, могут быть изменены без остановки экземпляра.


Преконфигурированная база данных предварительно настроена и для нее установлены соответствующие параметры использования памяти. Однако по мере расширения использования может возникнуть необходимость изменить установки таких параметров.

Программная глобальная область (Program Global Area - PGA) - область памяти, содержащая данные и управляющую информацию для каждого серверного процесса.

Серверный процесс (server process) - это такой процесс, который обслуживает запросы по выполнению команд, поступающие от клиента. Каждому серверному процессу принадлежит своя собственная приватная область PGA, которая создается, когда запускается серверный процесс. Доступ к этой области предоставляется исключительно этому серверному процессу и все действия по чтению и записи в эту область производятся только путем вызова соответствующего кода сервера Oracle.

Размер памяти, используемой PGA, и ее содержимое зависит от того, сконфигурирован ли экземпляр в режиме разделяемого сервера.

Обычно PGA содержит следующее:

Приватная область SQL (private SQL area). В этой области находятся такие данные, как информация привязки и структуры памяти, используемые при выполнении команды. Каждый сеанс, в котором вводится команда SQL, имеет приватную область SQL.
Память сеанса (session memory) . В памяти сеанса находятся переменные сеанса и другая информация, связанная с сеансом.

Кэш буферов

Для конфигурирование кэша буферов используется параметр DB_CACHE_SIZE. Кэш буферов содержит копии блоков данных из файлов данных. Размер этих блоков равен значению параметра DB_BLOCK_SIZE. Поскольку кэш буферов является частью SGA, эти блоки могут использоваться всеми пользователями. Серверные процессы читают блоки из файлов данных в кэш буферов. Для повышения производительности серверный процесс иногда читает несколько блоков за одну операцию чтения. Процесс DBWn записывает данные из кэша буферов в файлы данных. Для повышения производительности процесс DBWn записывает несколько блоков за одну операцию записи.

В произвольный момент времени кэш буферов может содержать несколько копий одного и того же блока базы данных. Только одна из них является текущей, остальные конструируются на основе информации сегментов отмены (construct read-consistent copies from past image information - CR block). Они обеспечивают целостные чтения данных.

Для мониторинга использования буферов используется список наиболее давно использовавшихся (least recently used -LRU) буферов. В этом списке буферы сортируются на основе учета того, как давно и как часто они использовались. Поэтому в одном конце этого списка находятся буферы, которые использовались совсем недавно (most recently used-MRU), а в другом - давно не использовавшиеся буферы, которые доступны в первую очередь для перезаписи блоками, поступающими в кэш. Поступающий блок копируются в буфер в конце списка, где располагаются давно не использовавшиеся блоки, а затем переносится в середину списка. После этого он будет перемещаться вверх или вниз по списку в зависимости от использования.

Буферы в кэше буферов могут быть в одном из четырех состояний:

Pinned ("закрепленный") - означает, что несколько сеансов не могут в один и тот же момент времени писать в один блок и вынуждены ждать доступа к блоку, находящемуся в буфере.
Clean ("чистый") - означает, что буфер в настоящее время не закреплен (unpinned) и является кандидатом на удаление из кэша, если на его содержимое не будет опять ссылок. Содержимое буфера либо синхронизировано с блоком на диске, либо буфер использовался для генерации и обработки старого моментального снимка блока в режиме целостного чтения (consistent read - CR блок).
Free/unused (свободный/неиспользуемый) - означает, что буфер пустой, т.к. экземпляр только что был запушен. Состояние очень похоже на состояние clean, за исключением того, что буфер еще не использовался.
Dirty ("грязный") - буфер больше не является закрепленным, но его содержимое было изменено и должно быть записано на диск процессом DBWn перед удалением из кэша.

Серверные процессы используют блоки в кэше буферов, но доступными блоки делает процесс DBWn, записывая их в файлы данных. Очередь контрольной точки (checkpoint queue) представляет собой список буферов (блоков), которые должны быть записаны на диск.

Oracle поддерживает использование несколько размеров блоков в одной и той же базе данных. Стандартный размер блока используется в табличном пространстве SYSTEM и задается параметром инициализации DB_BLOCK_SIZE. Нестандарные размеры блока могут иметь значение 2" в диапазоне от 2 Кб до 32 Кб и задаются следующими параметрами инициализации:

DB_2K_CACHE_SIZE DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE DB_32K_CACHE_SIZE


Параметры DB_nKCACHE_SIZE не могут использоваться для задания размера кэша с буферами, равными стандартному размеру блока. Если значение параметра DB_BLOCK_SIZE равно лК, тогда нельзя задать параметр DB_nK_CACHE_SIZE. Размер кэша с буферами стандартного размера всегда определяется параметром
DB_CACHE_SIZE.

Любой кэш буферов ограничен по размеру. Поэтому не все данные, хранимые на диске, могут разместиться в кэше. Когда кэш заполнен полностью, последующие непопадания в кэш (cache misses) заставляют Oracle производить запись "грязных" (измененных) данных из кэша на диск для того, чтобы освободить место для новых данных. Если буфер "негрязный", то не требуется писать его содержимое на диск перед чтением нового блока в буфер. Последующее обращение в данным, которые уже были записаны на диск, вызовет дополнительное неудачное чтение из кэша (cache misses).

Размер кэша влияет на вероятность того, что запрос данных обнаружит их в кэше (попадание в кеш - cache hit). Когда кэш большой, больше вероятность того, что в нем содержатся запрашиваемые для обработки данные. С увеличением размера кэша возрастает процент удачных обращений к кэшу (cache hits).

Использование нескольких пулов буферов

Использование нескольких пулов буферов

АБД может повысить производительность кэша буферов базы данных, создавая несколько буферных пулов. Объекты назначаются буферному пулу в зависимости от того, как осуществляется доступ к этим объектам. Существует три буферных пула:

KEEP (удерживающий); используется для удержания в памяти объектов, вероятность повторного использования которых велика - это позволяет уменьшить количество операций ввода-вывода. Удержание буферов в этом пуле обеспечивается за счет задания такого размера пула, который больше чем общий размер сегментов, размещаемых в этом пуле. В результате не возникнет необходимость выгрузки буферов из оперативной памяти на диск. Удерживающий пул конфигурируется путем задания значения параметра DB_KEEP_CACHE_SIZE.

RECYCLE (повторно используемый); используется для удаления из памяти блоков, если вероятность их повторного использования мала. Размер повторно используемого пула меньше, чем общий размер размещаемых в нем сегментов. Поэтому блоки, читаемые в этот пул, часто выгружаются на диск. Данный пул конфигурируется путем задания значения параметра DB_RECYCLE_CACHE_S IZE.

DEFAULТ (стандартный пул по умолчанию); этот пул существует всегда - он эквивалентен единственному кэшу буферов для экземпляра без удерживающего и рециклирующего пулов и конфигурируется с помощью параметра DB_CACHE_SIZE.


Примечание: память пулов keep и recycle не выделяется из пространства пула default.

Использование нескольких пулов буферов (продолжение)

Использование нескольких пулов буферов (продолжение)

Фраза BUFFER_POOL определяет буферный пул, который используется объектом по умолчанию. Она является частью предложения STORAGE и допустима в командах CREATE и ALTER для таблиц, кластеров и индексов. Блоки объекта, для которого явно не задан буферный пул, будут помещаться в пул DEFAULT.

Если в команде ALTER для объекта изменяется пул буферов по умолчанию, то все блоки, которые уже кэшированы в текущем пуле, остаются в нем до тех пор, пока они не будут выгружены обычным образом. Блоки, читаемые с диска, будут размешаться в новом буферном пуле, заданном для данного сегмента.

Пулы буферов назначаются сегменту, поэтому объекты с несколькими сегментами могут иметь блоки в нескольких буферных пулах. Например, индекс-таблица может иметь разные буферные пулы, определенные для индексного сегмента и сегмента переполнения.

Разделяемый пул

Размер разделяемого пула можно задать с помощью параметра инициализации SHARED_POOL__SIZE. Разделяемый пул (sharedpool) - это область памяти, в которой хранится информация, совместно используемая многими сеансами. Он содержит различные данные, которые отражены на слайде.

Библиотечный кэш
Библиотечный кэш содержит разделяемые области SQL и PL/SQL: полностью разобранные или откомпилированные представления блоков PL/SQL и команд SQL.

К блокам PL/SQL относятся:

процедуры и функции;
пакеты;
триггеры;
анонимные блоки PL/SQL.

Кэш словаря данных
Кэш словаря данных используется для хранения в памяти объектов словаря данных.

Users Global Area (UGA)
UGA содержит информацию о сеансах разделяемого сервера Oracle. При их использовании UGA размещается в разделяемом пуле, если не сконфигурирован большой пул.

Большой пул

Наличие большого пула
Размер большого пула должен быть явно указан. Память для большого пула выделяется непосредственно в SGA, но отдельно от разделяемого пула. Поэтому возрастает потребность в разделяемой памяти сервера Oracle, необходимой для запуска экземпляра.

Преимущества большого пула:

Большой пул используется для выделения памяти, необходимой сеансам:

серверных процессов ввода-вывода;
при выполнении операций резервирования и восстановления;
разделяемых серверных процессов Oracle и интерфейсу Oracle ХА (используется, когда в транзакции происходит взаимодействие с несколькими базами данных других производителей)


Выделяя память для сеансов разделяемых серверных процессов в большом пуле, сервер Oracle может использовать разделяемый пул непосредственно для кэширования разделяемых команд SQL. Это позволяет устранить дополнительную конкуренцию за доступ к разделяемому пулу, которая уменьшает доступное пространство для кэширования команд SQL и снижает производительность.

Память, используемая Java-приложениям

Java-пул (Java pool) - это структура внутри SGA, используемая для хранения Java-кода всех сеансов и данных внутри Java-машины.

Разделяемый пул
Разделяемый пул используется загрузчиком классов (class loader) внутри виртуальной Java-машины (Java Virtual Machine - JVM). Загрузчик классов расходует примерно 8 Кб на каждый загружаемый класс. Разделяемый пул также применяется, когда компилируется исходный Java-код и когда вызываются методы java-классов. Кроме того, память в разделяемом пуле занимается при создании спецификаций вызова и когда система динамически отслеживает загружаемые Java-классы в ходе выполнения.

Java пул
Менеджер памяти виртуальной машины Oracle (Oracle JVM memory manager) размещает все остальные Java-структуры в ходе выполнения в Java-пуле, в том числе совместно используемые, располагаемые в памяти представления Java-методов и определения классов, а также Java-объекты, которые мигрируют в пространство сеанса в конце выполнения вызова.

Память Java-пула используется различными путями в зависимости от того, использует ли база данных Oracle разделяемые серверные процессы или нет.

Дополнительные сведения об использовании памяти Java-пула см. в документе Oracle Database Java Developer's Guide.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot

  • Что такое триггер?
  • Что такое транзакция?
  • Какие категории файлов включает физический уровень БД Oracle?
  • В каком табличном пространстве хранится словарь данных?
  • Какая разница между сегментом, экстентом и блоком данных?

На эти вопросы очень просто ответить, внимательно прочитав предыдущий выпуск.

Экземпляр Oracle состоит из процессов и разделяемой памяти, необходимой для доступа к информации в БД. Если копнуть чуть глубже, то экземпляр составляют пользовательские процессы, фоновые процессы Oracle и разделяемая область памяти, которую используют все эти процессы.

Что же представляет собой разделяемая память (shared memory)? Oracle использует разделяемую память в разных целях: как кэширование данных и индексов, так и хранение программного кода. Разделяемая память делится на несколько частей (или структур памяти). Основными структурами памяти Oracle являются Системная Глобальная Область (System Global Area или SGA) и Программная Глобальная Область (Program Global Area или PGA). Рассмотрим SGA и PGA более подробно.

Системная Глобальная Область (SGA)

кэш буферов БД - здесь хранятся последние открытые блоки данных. Эти блоки могут содержать данные, которые изменились, но еще не были записаны на диск (грязные блоки); данные, которые не изменялись либо были записаны на диск после изменения (чистые блоки). Так как кэш буферов БД хранит блоки данных на основе алгоритма последних используемых блоков, то наиболее активно используемые блоки постоянно остаются в памяти (тем самым, снижая дисковый ввод/вывод и увеличивая производительность системы). буфер журнала изменений - хранит данные об изменениях БД. Буфер журнала изменений записывается в файл журнала изменений настолько быстро и эффективно, насколько это возможно. Помните, что журнал изменений используется для восстановления экземпляра СУБД Oracle в случае сбоя системы. разделяемый пул - Это область SGA, в которой хранятся такие структуры разделяемой памяти, как разделяемые SQL-области в библиотечном кэше и внутренняя информация словаря данных. Разделяемый пул важен, потому что недостаточный объем памяти, выделенный для него, может привести к деградации производительности всей системы. Разделяемый пул состоит из библиотечного кэша и кэша словаря данных.

Библиотечный кэш используется для хранения разделяемых SQL. Здесь для каждого уникального SQL-выражения строиться дерево разбора строк и план исполнения, которые кэшируются (т.е. сохраняются в библиотечном кэше). Если несколько приложений отправляют одинаковые SQL-выражения, то для ускорения работы используется разделяемая SQL-область (так как используются уже разобранные строки и готовый план исполнения, то происходит экономия времени).

пользовательская информация (например, пользовательские привилегии) ограничения целостности, определенные для таблиц БД информация об объеме памяти, определенном и используемом объектами схемы данных

Oracle часто обращается к словарю данных при разборе SQL-выражений. Эти обращения составляют сущность работы Oracle. Узкие места в словаре данных влияют работу всех пользователей системы Oracle. Поэтому Вы всегда должны быть уверены, что объем памяти, определенный для словаря данных, достаточно велик для кэширования данных. Если кэш словаря данных мал, то Вы заметите значительное снижение производительности. Когда под кэш словаря данных Вы определите достаточный объем памяти, существенных проблем с производительностью быть не должно.

Программная Глобальная Область (PGA)

пространство стека - это память, хранящая переменные сеансов, массивы сеансов и т.д. информация сеанса - если Oracle работает не в мультинитевом режиме, то информация сеанса хранится в PGA. В противном случае, информация сеанса хранится в SGA. приватная SQL-область - это часть PGA, где хранятся связанные переменные и буферы реального времени.

Процесс (или нить) - это механизм выполнения программного кода, который может выполняться незаметно для пользователя. Кроме того, несколько процессов могут работать одновременно. В разных операционных системах и на разных платформах они могут называться по-разному (процессы, нити, демоны и т.д.), но, в сущности, одинаковы. СУРБД Oracle работает с двумя видами процессов: пользовательские процессы и процессы Oracle (также известные как фоновые или теневые). В некоторых операционных системах (таких как Windows NT) процессы действительно являются нитями, но, чтобы не путаться в понятиях, будем называть их просто "процессами".

Пользовательские (клиентские) процессы - это пользовательские соединения с СУРБД. Пользовательский процесс управляет вводом и взаимодействует с серверными процессами Oracle через программный интерфейс Oracle. Пользовательский процесс используется также для выдачи информации пользователю, и, при необходимости, представляет ее в более удобной форме.

Процессы Oracle выполняют функции для пользовательских процессов. Могут быть разбиты на две группы: серверные процессы (выполняющие функции для активных процессов) и фоновые процессы (выполняют функции СУРБД в целом).

Серверные процессы (теневые) взаимодействуют между процессами пользовательскими и Oracle, исполняя пользовательские запросы. Например, если пользовательский процесс запрашивает часть данных, которых еще нет в SGA, то теневой процесс несет ответственность за чтение блоков данных из БД в SGA. Между пользовательским и теневым процессом возникает связь один-к-одному (конфигурация выделенного сервера), хотя один теневой процесс может одновременно взаимодействовать с несколькими пользовательскими (конфигурация мультинитевого сервера), экономя системные ресурсы.

Читайте также: