How Parsing Works

En otra entrada del blog describimos cual era el ciclo de vida de un cursor, ahora nos vamos a centrar en ver la fase del parse, como muestra la siguiente figura:

  • Include VPD predicates: Si está activo Virtual Private Database (VPD, formalmente conocido como seguridad a nivel de fila) para una de las tablas referenciadas en el parse de la sentencia, los predicados generados por las políticas de seguridad son incluidas en su cláusula WHERE.
  • Check syntax, semantics, and access rights: En este paso se asegura que la sentencia SQL está correctamente escrita y también que todos los objetos referenciados por la SQL existen y el usuario tiene los privilegios necesarios para el acceso a ellos.
  • Store parent cursor in library cache: Cada vez que un cursor padre no está disponible para poder ser compartido, una cantidad de memoria es asignada desde la library cache, y un nuevo cursor padre is almacenado. La información clave asociada con el cursor padre es el texto de la SQL.
  • Logical optimization: Durante este fase, se producen nuevas y equivalentes semánticas de la SQL para aplicar diferentes técnicas de transformación. El propósito es explorar distintos planes de ejecución.
  • Physical optimization: En esta fase se ejecutan distintas operaciones. En primer lugar se generan los planes de ejecución relativos a cada sentencia SQL resultante desde la logical optimization.
  • Store child cursor in library cache: Se asigna mucha memoria, y el cursor hijo compartido es almacenado dentro de ella y asociado con su cursor padre. Los elementos claves asociados con el cursor hijo son el plan de ejecución y el entorno de ejecución.
Una vez almacenados en la library cache, los cursores padres e hijos son externalizados a través de las vistas v$sqlarea y v$sql, respectivamente. Los cursores son identificados en tres columnas: address, hash_value, y child_number. Con address y hash_value son identificados los cursores padre; con los tres valores son identificados los cursores hijo. En Oracle 10g podemos utilizar la columna sql_id para identificar el cursor padre, en vez de la dupla address, hash_value.

Hay dos tipos de parse, soft parse y hard parse. Cuando los cursores padre e hijo están disponibles para ser compartidos, llevándose a cabo solamente las dos primeras operaciones (Include VPD predicates y Check syntax, semantics, and access rights) el parse es llamado soft parse. Cuando se deben realizar todas las operaciones, realizará un hard parse.

Desde el punto de vista de performance, se deberían evitar los hard parse tanto como sea posible. Esta es la principal razón por la que el motor de base de datos almacena cursores en la library cache. Hay dos razones que conducen a un alto coste de hard parse. La primera es la logical y physical optimization que son operaciones con un alto coste de CPU. La segunda es la memoria necesaria para almacenar los cursores padre e hijo en la library cache.

Referncias: Troubleshooting Oracle Performance (Christian Antognini)

One Comments

  • Doradztwo budowlane

    26/04/2012

    I conceive other website owners should take this website as an model, very clean and good user genial layout.

    Reply

Deja un comentario