Открыть сервис

Private SQL Area

Private SQL Area — это область памяти в операционной среде Oracle Database, предназначенная для хранения данных, связанных с выполнением конкретного SQL-запроса или PL/SQL-блока в рамках отдельной сессии пользователя. Она является частью Program Global Area (PGA) и обеспечивает изоляцию данных и управляющих структур, необходимых для разбора, выполнения и оптимизации запросов, выполняемых от имени данной сессии.

Структура и назначение

Private SQL Area (PGA) — это временная область памяти, выделяемая для каждого активного курсора (SQL-оператора) в сессии. В отличие от Shared SQL Area (расположенной в System Global Area — SGA), которая хранит разобранные и оптимизированные планы выполнения для всех сессий, Private SQL Area содержит данные, специфичные для конкретного экземпляра выполнения запроса: значения переменных привязки, промежуточные результаты сортировки, хэш-таблицы для соединений и информацию о состоянии выполнения.

Основные компоненты

Private SQL Area включает несколько ключевых структур:

  • Раздел для разбора (parse area) — хранит результаты лексического и синтаксического анализа SQL-оператора, включая ссылки на соответствующий курсор в библиотечном кэше SGA.
  • Раздел для выполнения (execute area) — содержит данные, необходимые для выполнения запроса: буферы для операций сортировки, временные таблицы для хэш-соединений, а также значения переменных привязки, переданные при выполнении.
  • Раздел для выборки (fetch area) — используется для хранения строк, извлекаемых из набора результатов, если они не помещаются в буферы SGA.

Отличие от Shared SQL Area

Главное различие между этими двумя областями заключается в уровне доступа и времени жизни:

  • Shared SQL Area (в SGA) — общая для всех сессий. Содержит разобранные и оптимизированные планы выполнения, текст SQL-операторов и метаданные. Доступна для повторного использования другими сессиями, что снижает накладные расходы на повторный разбор.
  • Private SQL Area (в PGA) — индивидуальная для каждой сессии и каждого курсора. Содержит данные, уникальные для данного выполнения: значения переменных, промежуточные результаты, информацию о состоянии курсора. Освобождается при закрытии курсора или завершении сессии.

Управление памятью

Oracle Database автоматически управляет выделением и освобождением памяти в Private SQL Area. Размер PGA может регулироваться в зависимости от нагрузки и конфигурации базы данных. Основные параметры, влияющие на управление:

  • PGA_AGGREGATE_TARGET — задаёт общий целевой объём памяти PGA для всех сессий в экземпляре. При превышении этого лимита Oracle может автоматически уменьшать объём памяти, выделяемый для отдельных операций, например, для сортировки или хэш-соединений.
  • PGA_AGGREGATE_LIMIT — жёсткий лимит на суммарный размер PGA. При его превышении база данных может принудительно завершать сессии, потребляющие наибольшее количество памяти.
  • WORKAREA_SIZE_POLICY — определяет, управляется ли размер рабочих областей (например, для сортировки) автоматически (AUTO) или вручную (MANUAL). В режиме AUTO Oracle динамически распределяет память между сессиями.

Влияние на производительность

Эффективное использование Private SQL Area критически важно для производительности базы данных. Основные аспекты:

  • Чрезмерное потребление PGA — может привести к нехватке оперативной памяти, что вызовет замедление работы из-за свопинга на диск или принудительное завершение сессий.
  • Недостаточный размер PGA — приводит к тому, что операции сортировки и хэш-соединения выполняются на диске (временных табличных пространствах), что значительно снижает скорость выполнения запросов.
  • Утечки памяти — в редких случаях, при неправильном закрытии курсоров в приложениях, память PGA может не освобождаться, что ведёт к её накоплению. Это особенно актуально для приложений, использующих множество курсоров в рамках одной сессии.

Особенности в различных режимах работы

Деддикейтед (Dedicated Server) vs. Shared Server

В режиме Dedicated Server (выделенный сервер) для каждой сессии создаётся отдельный серверный процесс, и Private SQL Area располагается в памяти этого процесса. Это обеспечивает максимальную изоляцию, но может потреблять больше ресурсов при большом числе сессий.

В режиме Shared Server (разделяемый сервер) несколько сессий используют общий пул серверных процессов. В этом случае Private SQL Area может располагаться в SGA (в области Large Pool), а не в PGA, чтобы обеспечить доступ к ней из любого серверного процесса. Это снижает потребление памяти, но может увеличить накладные расходы на синхронизацию.

Oracle Real Application Clusters (RAC)

В кластерной среде RAC каждая сессия работает на одном из узлов кластера, и Private SQL Area создаётся на том узле, где выполняется запрос. При переключении сессии на другой узел (например, при сбое) Private SQL Area теряется, и запрос должен быть выполнен заново.

Мониторинг и диагностика

Для анализа использования Private SQL Area администраторы баз данных используют следующие инструменты:

  • V$SESSTAT — содержит статистику по каждой сессии, включая размер PGA, количество разборов, объём сортировок в памяти и на диске.
  • V$SQL_WORKAREA — показывает информацию о рабочих областях, используемых для выполнения запросов.
  • V$PGASTAT — предоставляет агрегированную статистику по PGA для всего экземпляра.
  • V$SQL_MONITOR — позволяет отслеживать выполнение длительных запросов и их потребление PGA.

История и развитие

В ранних версиях Oracle (до 9i) управление памятью PGA было полностью ручным — администратор задавал фиксированные размеры для сортировки, хэш-областей и других операций. С выходом Oracle 9i (2001 год) была введена автоматическая настройка PGA (Automatic PGA Management), которая позволила динамически распределять память между сессиями на основе текущей нагрузки. В Oracle 12c (2013 год) появилась возможность автоматического управления памятью PGA на уровне контейнера (PDB) в многопользовательской архитектуре (Multitenant).

Примеры использования

  • Приложение для интернет-магазина — при выполнении сложного запроса на поиск товаров с фильтрацией и сортировкой Private SQL Area хранит временные данные для сортировки по цене и рейтингу, а также значения переменных привязки (например, категория товара).
  • Банковская система — при обработке транзакций Private SQL Area используется для хранения промежуточных результатов при расчёте комиссий и проверке лимитов, что обеспечивает изоляцию данных между разными сессиями.

Источники

  • Oracle Database Concepts Guide (11g Release 2, 12c, 19c)
  • Oracle Database Performance Tuning Guide
  • Oracle Database Reference (V$ views)
  • Документация Oracle по автоматическому управлению PGA

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →