martes, 14 de abril de 2009

ÁREAS GLOBALES DE PROGRAMAS (PGA)

Áreas Globales de Programas PGA (Program Global Areas)

Un área global de programa (PGA) es una región de memoria que contiene datos e información de control para los procesos de servidores. Es una memoria no compartida creada por Oracle cuando un proceso de un servidor es iniciado. Solo el servidor del proceso puede acceder a él y se lee y escribe solamente por un código de Oracle que actúa en nombre del proceso.

Contenido de un PGA

El contenido de la memoria de un PGA varía dependiendo de donde se está ejecutando la instancia y de si el tipo de servidor es compartido. Pero generalmente la memoria del PGA puede ser clasificada de la siguiente forma:

-Memoria de sesión: La memoria de sesión (Session Memory) se asigna para mantener las variables de una sesión (logon information) y otra información relativa a la sesión. Para un servidor compartido, la memoria de sesión es compartida y no privada.

-Área SQL privada: Un área SQL privada contiene datos como por ejemplo consultas de información de ejecuciones y consultas de ejecuciones en áreas de trabajo. Cada sesión que establece una sentencia tiene un área privada de SQL. Cada usuario que emite la misma sentencia tiene su propia área SQL privada que usa un área SQL compartida. Aunque, muchas áreas SQL privadas pueden ser asociadas con la misma área SQL compartida.

La ubicación de un área privada SQL depende del tipo de conexión establecida para una sesión. Si una sesión se conecta a través de un servidor dedicado, las áreas privadas SQL esta localizadas en el servidor del proceso del PGA. De cualquier forma, si una sesión se conecta a través de un servidor compartido, parte del área privada SQL se mantiene en el SGA.

Cursores y áreas SQL

La aplicación de desarrollo de un programa precompilador Oracle o un programa OCI puede explícitamente abrir cursores, o manejar algún área privada SQL específica, y usarla como un recurso nombrado a través de la ejecución de un programa. Los cursores recursivos de Oracle que emiten implícitamente algunas sentencias SQL también usan áreas SQL.

La administración de las áreas SQL privadas son responsabilidad de los procesos del usuario. La asignación y liberación de las áreas SQL privadas dependen de en que herramienta de la aplicación se usan, aunque el numero de áreas SQL privadas que un proceso de usuario puede asignar está siempre limitada el parámetro OPEN_CURSORS. El valor por defecto de este parámetro es 50.

Un área SQL privada continua existiendo hasta que el correspondiente cursor es cerrado o la sentencia es liberada. Aunque Oracle libera el área de ejecución después de que la sentencia se complete, el área persistente se mantiene en espera. Las aplicaciones de desarrollo cierran todos los cursores abiertos que no van a ser usados otra vez para liberar el área persistente y minimizar la cantidad de memoria requerida por el usuario de la aplicación.

Componentes del área SQL privada

El área SQL privada de un cursor se divide en 2 áreas cuya duración son diferentes:

  • El área persistente (Persistent Area), que contiene, por ejemplo, información envuelta. Es liberada solamente cuando el cursor es cerrado.

  • El área de ejecución (Run-time Area), que es liberada cuando la ejecución, valga la redundancia, es terminada.

Oracle crea el área de ejecución en el primer paso que una ejecución es pedida. Para una sentencia INSERT, UPDATE y DELETE Oracle libera el área de ejecución después de que la sentencia ha sido ejecutada. Para las consultas, Oracle libera el área de ejecución solamente cuando todas las filas han sido recorridas, o la consulta ha sido cancelada.

Áreas de trabajo SQL

Para las consultas complejas, una gran porción del área de ejecución es dedicada a áreas de trabajo asignadas por operadores de memoria-intensiva como los siguientes:

  • Operadores de base de clasificación “Sort-based” (order by, group by, rollup)

  • Hash-join

  • Bitmap merge

  • Bitmap create

Por ejemplo, un operador de clasificación (sort operator) usa un área de trabajo (algunas veces llamado área de clasificación “sort area”) para la forma de distribución de la memoria interna (in-memory) de una serie de filas. Similarmente, un operador hash-join usa un área de trabajo (también llamada área hash) para construir una tabla hash desde su entrada izquierda. Si la cantidad de datos que deben ser procesados por estos dos operadores no entran en el área de trabajo, entonces los datos de entrada son divididos en piezas más pequeñas. Esto permite que alguna de las piezas se procesen en la memoria mientras el resto son distribuidos en un disco temporal para ser procesado luego. Aunque los operadores de bitmap no se distribuyen por el disco cuando su área de trabajo es muy pequeña, su complejidad es inversamente proporcional al tamaño de su área de trabajo. Estos operadores se ejecutan más rápido en áreas de trabajo más grandes.

El tamaño del área de trabajo puede ser controlado y modificado. Generalmente, áreas de bases de datos grandes pueden mejorar significativamente el rendimiento de un operador respecto al coste de consumo de memoria. Opcionalmente, el tamaño de un área de trabajo puede ser lo bastante grande como para almacenar los datos de entradas y las estructuras auxiliares de memoria asignadas por el operador SQL asociado. De lo contrario, el tiempo de respuesta aumenta, porque parte de los datos de entrada deben ser distribuidos por un disco de almacenamiento temporal. En caso extremo, si el tamaño del área de trabajo es muy pequeño comparado con el tamaño del dato de entrada, múltiples procesos se ejecutan sobre la parte de los datos. Esto puede aumentar el tiempo de respuesta de un operador considerablemente.

Administración de la memoria del PGA para un modo dedicado

Se puede administrar el tamaño de las áreas de trabajo SQL globalmente y automáticamente. El administrador de la base de datos simplemente necesita que sea especificado el tamaño total dedicado a la memoria del PGA para las instancias de configurando el parámetro PGA_AGGREGATE_TARGET. El número especificado (por ejemplo 2G) es un objetivo global para la instancia, y se trata de asegurar que la cantidad total de memoria del PGA asignada por toda la base de datos de los procesos del servidor nunca exceda esa meta.

Con PGA_AGGREGATE_TARGET, modificar el tamaño de las áreas de trabajo para todas las sesiones dedicadas es automático, y todos los parámetros *_AREA_SIZE se ignoran en estas sesiones.

No hay comentarios:

Publicar un comentario