martes, 14 de abril de 2009

PORTADA e índice




Estructura de la memoria y

de los procesos








Administración de Base de Datos

Grupo: Arrayán


Índice


  1. Estructura de la memoria

      1. Introducción

      2. Área global del sistema

        1. Instancia de una Base de Datos

            1. La instancia y la Base de Datos

        2. Estructura de Datos del SGA

            1. Caché de los Buffers

            2. Buffer del registro del Rehacer

            3. El Pool compartido

            4. Large Pool

            5. Java Pool

            6. Streams Pool

            7. Caché de diccionario

        3. El parámetro SGA_MAX_SIZE

        4. Gestión automática de la memoria compartida

            1. El parámetro SGA_TARGET

            2. Limitando el tamaño de la SGA

      3. Áreas globales de programas PGA

        1. Contenido de un PGA

        2. Cursores y áreas SQL

        3. Componentes del área SQL privada

        4. Áreas de trabajo SQL

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

      4. Área de Ordenaciones

      5. Memoria Virtual en Oracle

        1. Paginación

        2. Swapping

      6. Área de Código de Software

  1. Estructura de los procesos

      1. Database Writer Process (DBWn)

      2. Log Writer Process (LGWR)

        1. Redo Log Files

      3. Checkpoint Process (CKPT)

      4. System Monitor Process (SMON)

      5. Process Monitor (PMON)

      6. Recoverer (RECO)

      7. Archiver Processes (ARCn)

      8. Lock (LCKn)

      9. Job Queue (SNPn)

      10. Queue Monitor (QMNn)

      11. Dispatcher (Dnnn)

      12. Shared Server (Snnn)

  2. Oracle 10 vs Oracle 11

  3. Oracle 10 vs SQL Server 2008

  4. Ejercicios




ESTRUCTURA DE LA MEMORIA

Estructura de la memoria

Introducción

Oracle utiliza la memoria para almacenar la siguiente información:

  • Código del programa

  • Información acerca de una sesión conectada, incluso si no se encuentra activa.

  • Información necesaria durante la ejecución del programa(por ejemplo, el estado de las consultas)

  • La información que comparten y con la cual se comunican los procesos Oracle (por ejemplo, la información de bloqueo)

  • La Caché de Datos

La memoria se puede estructurar en las siguientes partes:

  • Área Global del sistema (SGA), la cual se comparte entre todos los servidores y los procesos en segundo plano.

  • Áreas globales de programas (PGA), que es privada para cada servidor y proceso en segundo planos; a cada proceso se asigna un PGA.

  • Área de Ordenaciones (Sort Areas).

  • Memoria Virtual

  • Área de código de Software (SCA).


Figura 1. Estructura de la memoria en Oracle

Área Global del Sistema (System Global Area, SGA)

El Área Global del Sistema (SGA) es un grupo de estructuras de la memoria compartida que contiene datos e información de control de una instancia de una BD. Si varios usuarios se conectan de forma concurrente a la misma instancia, entonces los datos se comparten en el SGA, por lo que también se llama shared global area.

Una instancia en Oracle se compone de un SGA y de procesos. Cuando se crea una instancia, Oracle asigna memoria a un SGA automáticamente y esta se devuelve al sistema operativo cuando la instancia se cierra. Por tanto, cada instancia posee su propio SGA.

Además, es de lectura/escritura. Todos los usuarios conectados a una instancia multiproceso pueden leer la información contenida en el SGA de la instancia y varios procesos pueden escribir en él durante la ejecución.

Una parte del SGA contiene información general acerca del estado de la base de datos y de la instancia, a la que los procesos en segundo plano necesitan acceder (SGA fija), pero no se almacenan los datos de usuario. El SGA también incluye información de comunicación entre procesos, como la información de bloqueos. Además, si el sistema usa una arquitectura de servidor compartido, entonces las colas de petición y respuesta y algunos contenidos del PGA se encuentran en el SGA.

El SGA contiene la siguiente estructura de datos:

  • Caché de los Buffers de la BD (Database Buffer Cache).

  • Buffer del Dietario o del Registro del Rehacer (Redo Log Buffer).

  • El ‘Pool’ Compartido (Shared Pool).

    • Caché de Biblioteca.

    • Caché del Diccionario de Datos.

    • Estructuras de Control.

  • Información diversa

Instancia de una Base de Datos

Cada instancia Oracle está asociada a una base de datos. Cuando se inicia una base de datos en un servidor (independientemente del tipo de ordenador), se le asigna un área de memoria (SGA) y lanza uno o más procesos. A la combinación del SGA y de los procesos es lo que se llama instancia. La memoria y los procesos de una instancia gestionan los datos de la base de datos asociada de forma eficiente y sirven a uno o varios usuarios.

Figura 2. Estructura de una instancia de Oracle

La instancia y la base de datos

Cuando se inicia una instancia Oracle monta la base de datos, es decir, asocia dicha instancia a su base de datos correspondiente. En un mismo ordenador pueden ejecutarse varias instancias simultáneamente, accediendo cada una a su propia base de datos física.

Únicamente el administrador de la base de datos puede iniciar una instancia y abrir una base de datos. Si una base de datos está abierta, entonces el administrador puede cerrarla y, cuando esto ocurre, los usuarios no pueden acceder a la información que contiene.

Estructura de Datos del SGA

Caché de los Buffers (Database Buffer Cache)

La caché de los buffers de la base de datos es una parte de la SGA que contiene copias de los bloques de datos de lectura de las páginas. Todos los procesos de los usuarios conectados concurrentemente a la instancia comparten el acceso a ella. Esta caché junto con la caché compartida de SQL están lógicamente segmentadas en varios conjuntos, lo que reduce la contención en sistemas multiprocesador.

Organización de la Caché de los Buffers

Los buffers en la caché están organizados en dos listas: la lista en espera y la lista LRU. La lista en espera contiene los buffers en espera (dirty buffers), los cuales contienen datos que han sido modificados pero que aún no se han escrito en disco. La lista LRU contiene los buffers libres, buffers que están siendo accedidos actualmente (pinned buffers) y los buffers en espera, que aún no están almacenados en la lista en espera. Cuando un proceso Oracle accede a un buffer, este lo sitúa al final de la lista LRU.

La primera vez que un proceso de usuario necesita un dato concreto, este los busca en los datos almacenados en la caché de los buffers. Si el proceso encuentra el dato en uno de estos buffers, se lee directamente de la memoria (cache hit). Si no lo encuentra, entonces debe copiar la página en disco a un buffer de la caché antes de leerlo (cache miss). Acceder a los datos a través de un ‘cache hit’ es más rápido que hacerlo mediante un ‘cache miss’.

Antes de leer un bloque de datos dentro de la caché, el proceso debe encontrar primero un buffer libre, empezando desde el menos usado recientemente de la lista LRU. El proceso sigue buscando hasta que encuentra un buffer libre o hasta que llega al final de la lista.

EL algoritmo LRU y la lectura completa de tablas

Cuando un proceso de usuario realiza una exploración completa de la tabla, lee cada bloque de la tabla en los buffers y los pone al final de la lista LRU. Se hace así porque normalmente la exploración completa se necesita brevemente, por lo que los bloques deben sacarse rápidamente para dejar espacio en la caché a los bloques que se usan con mayor frecuencia.

Tamaño de la cache del los buffer

Oracle soporta múltiples tamaños de bloque en una base de datos. El tamaño estándar de bloque se especifica mediante la configuración del parámetro DB_BLOCK_SIZE. Se admiten valores desde 2K hasta 32K.

Opcionalmente, también se puede seleccionar el tamaño de dos pool de buffer adicionales, KEEP y RECYCLE, configurando DB_KEEP_CACHE_SIZE y DB_RECYCLE_CACHE_SIZE. Estos tres parámetros son independientes entre sí.

Múltiple Pools de Buffer

Se puede configurar la cache del buffer con “buffer pools” distintos, en los que cualquiera contiene datos, o están disponibles para nuevos datos tras usar los bloques de datos. Objetos particulares del esquema (tablas, clusters, índices y particiones) se asignan al buffer pool apropiado para controlar la forma en que los bloques de datos “envejecen” en la cache.

  • El buffer pool KEEP conserva los bloques de datos de los objetos del esquema en memoria.

  • El buffer pool RECYCLE elimina bloques de datos de la memoria tan pronto como dejan de ser necesitados.

  • El buffer pool DEFAULT contiene bloques de datos de los objetos del esquema que no son asignados a ningún buffer pool, así como los objetos del esquema que son explícitamente asignados al pool DEFAULT.

Los parámetros que configuran los buffer pools KEEP y RECYCLE son DB_KEEP_CACHE_SIZE y DB_RECYCLE_CACHE_SIZE.

Buffer del registro del Rehacer (Redo Log Buffer)

El redo log buffer es un buffer circular en el SGA que contiene información sobre cambios hechos a la base de datos, la cual se almacena en las ‘entradas redo’. Estas entradas contienen la información necesaria para reconstruir, o rehacer cambios hechos en la base de datos mediante las operaciones INSERT, UPDATE, DELETE, CREATE, ALTER o DROP y se usan para la recuperación de la base de datos, si fuera necesario.

Las entradas se copian por los procesos desde el espacio de memoria del usuario al redo log buffer en el SGA, ocupando continuamente espacio secuencial. El proceso en segundo plano LGWR escribe el redo log buffer en el fichero redo log activo (o grupo de ficheros) en disco.

El parámetro LOG_BUFFER determina el tamaño (en bytes) del redo log buffer.

El Pool Compartido

Es la parte del SGA que contiene la cache de biblioteca, la cache de diccionario, los buffers para los mensajes de ejecución paralela y las estructuras de control.

El tamaño total del Pool Compartido se determina por el parámetro SHARED_POOL_SIZE. El valor por defecto es de 8MB en plataformas de 32-bit, y de 64MB para plataformas de 64-bit. Incrementando su valor se incrementa la cantidad de memoria reservada para el pool compartido.

Cache de Biblioteca (Library Cache)

La cache de biblioteca incluye áreas de SQL compartidas, áreas SQL privadas (en caso de una configuración de servidor compartido), procedimientos y paquetes PL/SQL, y estructuras de control tales como bloqueos y el manejo de la cache de biblioteca.

Ya que las áreas de SQL compartidas son accesibles para todos los usuarios, la caché de biblioteca está contenida en el Pool compartido dentro del SGA.

Áreas SQL compartidas y áreas SQL privadas

Oracle representa cada declaración de SQL con un área SQL compartida y un área SQL privada. Oracle reconoce cuando dos usuarios están ejecutando la misma instrucción SQL y reutiliza el área SQL compartida para esos usuarios. Sin embargo, cada usuario debe tener una copia separada de la declaración del área SQL privada.

Áreas SQL compartidas

Un área SQL Compartida contiene el árbol de análisis y el plan de ejecución para una instrucción SQL dada. Se ahorra memoria usando un solo área SQL compartida para instrucciones SQL ejecutándose varias veces, lo cual ocurre con frecuencia cuando varios usuarios ejecutan la misma aplicación.

Programas PL/SQL y el Pool compartido

Oracle procesa programas PL/SQL (procedimientos, funciones, paquetes, bloques anónimos, triggers) tanto como procesa instrucciones SQL individuales. Oracle asigna un área compartida que contiene la forma analizada y compilada del programa. Asigna un área privada para mantener los valores específicos de la sesión que ejecuta el programa, incluyendo variables locales, globales y de paquete y buffers para ejecución SQL. Si más de un usuario ejecuta el mismo programa, entonces una simple área compartida es usada por todos los usuarios siempre que tenga una copia de su área SQL privada, manteniendo valores específicos de su sesión.

Las instrucciones SQL individuales están contenidas en programas PL/SQL.

Large Pool

El administrador de la base de datos puede configurar un área de memoria opcional llamado large pool que proporciona grandes cantidades de memoria para asignar:

  • Memoria de la sesión para el servidor compartido y el Oracle XA interface (usado donde las transacciones interactúan con más de una base de datos)

  • Procesamiento de E/S

  • Copias de seguridad y operaciones de recuperación

El large pool satisface mejor las peticiones de gran cantidad de memoria que el pool compartido. Sin embargo, no posee una lista LRU.

Java Pool

La memoria java pool se usa en la memoria del servidor para almacenar todo el código y datos del JVM en las sesiones. Se usa de diferentes formas, dependiendo del modo en que se ejecute el servidor Oracle.

El asesor de estadísticas de java pool proporciona información sobre la memoria de la cache de biblioteca usada para java y predice como pueden afectar cambios en el tamaño del java pool en la tasa de análisis. El asesor de java pool se activa internamente cuando el statistics_level está configurado en TYPICAL o mayor. Estas estadísticas se reinician cuando el asesor es desactivado.

Streams Pool

En una única base de datos, se puede especificar que los flujos de memoria se asignen desde un pool en el SGA llamado Streams pool. Para configurarlo se especifica el tamaño del pool en bytes usando el parámetro STREAMS_POOL_SIZE. Si un streams pool no está definido, entonces se crea automáticamente cuando los flujos se usan por primera vez.

Si SGA_TARGET está activo, entonces la memoria del SGA para los Streams pool viene del pool global del SGA. Si no está activo, entonces se transfiere desde la cache del buffer, aunque solo tiene lugar después del primer uso de los flujos. La cantidad transferida es del 10% del tamaño del pool compartido.

Cache de diccionario (Dictionary Cache)

El diccionario de datos es una colección de tablas y vistas de la base de datos que contienen información sobre la base de datos (sus estructuras y sus usuarios.

Oracle accede con frecuencia al diccionario de datos, por lo que tiene dos localizaciones especiales en memoria designadas a mantenerlo. Una de ellas es la caché del diccionario de datos, también conocida como la cache de fila por que contiene datos sobre las filas en vez de los buffers (los cuales contienen bloques de datos), y la otra es el cache de biblioteca.


El parámetro SGA_MAX_SIZE

El SGA comprende un número de componentes de memoria, denominados pools de memoria, que se usan para satisfacer una clase particular de asignación de memoria. Todos los componentes del SGA asignan y liberan espacio en unidades (módulos). El tamaño del módulo queda determinado por el tamaño total del SGA. En la mayoría de las plataformas el tamaño del módulo es 4MB si el tamaño total del SGA es menor de 1GB, y de 16MB para SGA mayores.

La base de datos puede configurar límites sobre cuanta memoria virtual se usa para el SGA. Puede crear instancias con un mínimo de memoria y permitir que la instancia use más, expandiendo la memoria asignada a los componentes del SGA, hasta un máximo determinado por el SGA_MAX_SIZE. Si el valor es menor que la suma de memoria asignada para todos los componentes, la base de datos ignora la configuración de SGA_MAX_SIZE.

Para un rendimiento óptimo, en la mayoría de los sistemas, todo el SGA debería ajustarse a la memoria real. Si no es así, y la memoria virtual es usada para almacenar partes del SGA, entonces el rendimiento total del sistema puede decrementarse en gran medida. La cantidad de memoria dedicada para todas las áreas compartidas en el SGA también influye en el rendimiento.

El tamaño del SGA queda determinado por muchos parámetros, aunque son los siguientes los que tienen un gran efecto sobre el tamaño del SGA:

Parámetro

Descripción

DB_CACHE_SIZE

Tamaño de la cache de los bloques estándar.

LOG_BUFFER

Número de bytes asignados al redo log buffer.

SHARED_POOL_SIZE

Tamaño en bytes para el área dedicada al SQL compartido e instrucciones PL/SQL.

LARGE_POOL_SIZE

Tamaño del large pool, por defecto es 0.

JAVA_POOL_SIZE

Tamaño del java pool.

GESTIÓN AUTOMÁTICA DE LA MEMORIA COMPARTIDA

Gestión automática de memoria compartida

En versiones anteriores el administrador de la base de datos tenía que especificar manualmente los tamaños de los diferentes componentes del SGA configurando un número de parámetros de inicialización, que incluían el SHARED_POOL_SIZE, DB_CACHE_SIZE, JAVA_POOL_SIZE, y LARGE_POOL_SIZE. En la versión 10g se incluye la gestión automática de la memoria compartida que simplifica la gestión de la memoria del SGA. El administrador de la BD puede simplemente especificar la cantidad total de memoria del SGA disponible para una instancia usando SGA_TARGET y la base de datos automáticamente distribuirá esta memoria entre varios subcomponentes para asegurar el mayor uso de memoria efectiva.

Cuando la gestión automática de memoria del SGA esta activada, el tamaño de los diferentes componentes del SGA es flexible y pueden adaptarse a las necesidades del trabajo sin requerir ninguna configuración adicional. La base de datos automáticamente distribuye la memoria disponible entre varios componentes como se requiera, permitiendo al sistema maximizar el uso de toda la memoria del SGA disponible.

Configurando un único parámetro se simplifica mucho la tarea de administración ya que puedes especificar solo la cantidad de memoria del SGA que una instancia tiene disponible y olvidarte de los tamaños de los componentes individuales. No se generan errores de “out of memory” a menos que el sistema se haya quedado sin memoria.

La gestión automática del SGA puede mejorar el rendimiento sin necesidad de recursos adicionales ni ajustes manuales. Con la configuración manual del SGA es posible que instrucciones SQL compiladas se saquen del pool compartido debido a su insuficiente tamaño lo que incrementa la frecuencia de análisis difíciles, que reducen el rendimiento. Cuando la gestión automática del SGA esta activa, el algoritmo de ajuste interno supervisa el rendimiento del trabajo, incrementando el tamaño del pool compartido si reduce el número de análisis requeridos.

El parámetro SGA_TARGET

El parámetro SGA_TARGET refleja el tamaño total del SGA e incluye la memoria para los siguientes componentes:

  • SGA Fija y otras asignaciones internas necesarias para la instancia.

  • El log buffer

  • El pool compartido

  • El Java pool

  • La caché del buffer

  • Las cachés de los buffers keep y recycle (si son especificados)

  • El tamaño de los bloques no estándar de las cachés de los buffer (si son especificados)

  • El Streams pool

Este incluye toda la memoria del SGA, en diferencia con las versiones anteriores en las que la memoria para la SGA interna y fija se configuraba a través de otros parámetros. En consecuencia, el SGA_TARGET da un control preciso sobre el tamaño de la región de memoria compartida asignada por la base de datos. Si está configurado con un valor mayor que SGA_MAX_SIZE al inicio, entonces este último se usa como respaldo para el SGA_TARGET.

Nota:

No configurar dinámicamente el SGA_TARGET. Debería ser configurado solo al inicio.

Limitando el tamaño de la SGA

El parámetro SGA_MAX_SIZE especifica el tamaño máximo del SGA durante la duración de la instancia. Puedes modificar dinámicamente los parámetros que afectan al tamaño de las caches de los buffers, del pool compartido, large pool, java pool, y streams pool pero solo para controlar que la suma de estos tamaños y los tamaños de los otros componentes del SGA no exceden el valor especificado por SGA_MAX_SIZE.


Á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.

ÁREA DE ORDENACIONES (SORT AREAS)

AREA DE ORDENACIONES (SORT AREAS)

Las áreas de ordenaciones (Sort Areas) de Oracle son las zonas de memoria en las que se ordenan los datos, es decir el espacio en memoria que necesita la organización y ordenación de las filas.

El tamaño por defecto, expresado en bytes, es específico de cada SO. Sin embargo, hay muchas razones importantes por las que este tamaño influye en el rendimiento. En el manual de Oracle 10i encontramos cuatro de ellas:

  • Aumentar el SORT_AREA_SIZE mejora la eficiencia de ordenaciones grandes.

  • Cada ordenación en una consulta puede consumir la cantidad de memoria especificada en el SORT_AREA_SIZE, y pueden haber múltiples ordenaciones en una consulta. De esta forma, si otra consulta se ejecuta en paralelo, cada ordenación puede consumir la memoria especificada en este campo.

  • El SORT_AREA_SIZE también se utiliza para selecciones y actualizaciones en los índices de las tablas. Seleccionar un valor apropiado aquí, puede dar como resultado que la tabla se actualice una única vez en cada operación DML, pudiendo incluso haber cambiado varias filas a la vez.

  • Grandes valores en este campo nos permitirán realizar mayores búsquedas en memoria. Si se necesitase más espacio para la ordenación del que tenemos, los datos se dividirán en trozos y se utilizarán segmentos de disco temporales como apoyo en la ordenación.


En éste último caso, en el que los datos a ordenar no quepan en el área de ordenaciones, se dividen en trozos que sí quepan, se ordenan y se mezclan (merge). A esto hace referencia también el manual de Oracle9i, que si bien lo hace en trozos separados, a continuación se muestran las dos referencias juntas:

  • Para un mejor rendimiento del SGBD, la mayoría de las ordenaciones deberían tener lugar únicamente en memoria ya que en caso de tener que escribir a disco, obtendremos un claro efecto adverso sobre éste. Si las aplicaciones que acceden a la base de datos suelen realizar búsquedas que no caben en el área de ordenaciones, o incluso si las aplicaciones realizan demasiadas búsquedas innecesarias, entonces sería conveniente modificar el parámetro de SORT_AREA SIZE.

  • El SORT_AREA_SIZE es un parámetro que se puede inicializar y modificar dinámicamente y que especifica la cantidad de memoria que se tiene disponible al realizar las ordenaciones. Si una cantidad importante de ordenaciones requiere acceso a disco para almacenar segmentos temporales, entonces la aplicación se verá claramente beneficiada al ampliar el SORT_AREA_SIZE. De forma alternativa, en un entorno DSS, aumentar este parámetro no tiene por qué hacer que la ordenación se realice únicamente en memoria, pero sí es cierto que dependiendo del valor actual y del nuevo elegidos, se puede aumentar drásticamente la velocidad de la ordenación.

Por lo tanto, como conclusión, alterar este parámetro, se puede considerar como un paso importante para asegurarnos el rendimiento en ciertas circunstancias y situaciones. Sin embargo, determinar qué valor es el más apropiado, es por supuesto, la parte más complicada.


MEMORIA VIRTUAL EN ORACLE

MEMORIA VIRTUAL EN ORACLE

Oracle puede utilizar la memoria virtual proporcionada por el SO para simular memoria a base de algún dispositivo de almacenamiento como el disco duro.

La memoria virtual está mapeada en la RAM. Cuando no hay suficiente memoria con ésta para ejecutar los programas (en caso de Oracle las sentencias, búsquedas, etc) se necesita un espacio auxiliar que normalmente suele ser el disco duro. Para el traspaso de información se utilizan dos técnicas principales: el Paging o paginación y el Swapping.


Paginación

La paginación consiste en dividir los programas en pequeños bloques o páginas, de manera que sea más fácil moverlos de memoria a disco y viceversa. De la misma forma, la memoria se divide en marcos de página. De esta forma, la cantidad de memoria desperdiciada por un proceso es el final de su última página, minimizando así la fragmentación interna y evitando la externa.

En un momento cualquiera, la memoria se encuentra ocupada con páginas de diferentes procesos, mientras que algunos marcos están disponibles para su uso. El sistema operativo mantiene una lista de estos últimos marcos, y una tabla por cada proceso, donde consta en qué marco se encuentra cada página del proceso. De esta forma, las páginas de un proceso pueden no estar contiguamente ubicadas en memoria, y pueden intercalarse con las páginas de otros procesos.

En la tabla de páginas de un proceso, se encuentra la ubicación del marco que contiene a cada una de sus páginas. Las direcciones lógicas ahora se forman como un número de página y de un desplazamiento dentro de esa página (conocido comúnmente como offset). El número de página es usado como un índice dentro de la tabla de páginas, y una vez obtenida la dirección del marco de memoria, se utiliza el desplazamiento para componer la dirección real o dirección física. Este proceso se realiza en una parte del ordenador específicamente diseñada para esta tarea, es decir, es un proceso hardware y no software.

De esta forma, cuando un proceso es cargado en memoria, se cargan todas sus páginas en marcos libres y se completa su tabla de páginas.



Swapping

El Swapping es el procedimiento de mover los bloques de memoria en los que están algunos procesos que no se están utilizando, desde la memoria principal a un espacio Swap dejando así hueco libre para poder cargar en memoria otros procesos que sí se van a utilizar.

El espacio Swap o espacio de intercambio es una zona de disco (un fichero o una partición) que se usa para guardar las imágenes de los procesos que no han de mantenerse en memoria física.

Este procedimiento es muy similar a la paginación, con la diferencia principal de que el directorio Swap funciona exactamente igual que la memoria RAM, por lo que puede almacenar datos privados, contraseñas y todo lo que almacena ésta. Sin embargo, en la paginación, únicamente se sacan de memoria páginas pertenecientes a procesos que no se estén utilizando, además de que se pueden sacar solo algunas páginas de los procesos y no éstos enteros como se hace en el Swapping.

Con respecto al tamaño que debe tener el directorio Swap, hay muchas discusiones sobre ello como por ejemplo la antigua creencia de “El Swap debe tener el doble de tamaño que la RAM.” cosa que no es válida hoy día debido a la gran capacidad de la memoria RAM de la mayoría de ordenadores.

Como conclusión, hay que destacar que el uso de la memoria virtual por parte de Oracle, va a influir bastante en el rendimiento, disminuyéndolo drásticamente en comparación con el uso únicamente de la memoria RAM.


ÁREA DE CÓDIGO DE SOFTWARE (SCA)

ÁREA DE CÓDIGO DE SOFTWARE (SCA)

El área de código de software son zonas de memoria destinadas a almacenar el código de Oracle en ejecución o que puede ejecutarse. Este código de Oracle se almacena en una zona distinta, y más protegida, que las zonas dedicadas a almacenar los códigos de programas de usuarios.

La SCA suele ser de tamaño estático, cambiando únicamente cuando el software se reinstala o actualiza. El tamaño requerido para este área puede variar en función del SO. Son áreas de sólo lectura y pueden ser instalas de forma compartida o no compartida. Cuando es posible, el código de Oracle se comparte, por lo que todos los usuarios pueden acceder a él sin tener múltiples copias en memoria. El resultado es un ahorro considerable de memoria y una mejora del rendimiento general.

Por otra parte, los programas de usuario también pueden ser compartidos o no. Algunas utilidades y herramientas de Oracle (como ocurre con Oracle Forms y SQL*Plus) pueden ser instalados de forma compartida, pero otras no. Múltiples instancias de Oracle pueden usar la misma SCA con diferentes bases de datos si están corriendo en la misma máquina.

Hay que tener en cuenta que la opción de instalar software compartido puede no estar disponible en función del sistema operativo, como ocurre por ejemplo en máquinas con Windows.