PL / SQL Mejoras de Oracle Database 11 g



RESUMEN
Oracle Database 11 g aporta PL / SQL mejoras en estas categorías:
• transparente y "mando-control" mejoras en el rendimiento;
• nuevas características del lenguaje que utiliza en sus programas para mejorar
el rendimiento;
• nuevas características del lenguaje que aportan una funcionalidad que antes no podía
lograr, o podría lograr solamente con soluciones muy lentos;
• nuevas características del lenguaje que mejoran la usabilidad de la programación en PL / SQL.
He hecho una selección sin vergüenza personal de algunas de estas características para describir en detalle justo en este documento. He utilizado dos criterios: mi instinto clasificación basada en de acuerdo a su importancia relativa para los clientes, y mi juicio de si los lectores pueden apreciar algunas de fondo que es poco probable encontrar en otras cuentas. Para completar, voy a terminar con sólo enumerar las características de otros y dar una explicación del esqueleto de cada uno.

MÁS INFORMACIÓN SOBRE EL SISTEMA DE CLASIFICACIÓN
Usted puede notar que este esquema de clasificación para la mayoría de las obras anteriores.
Versiones de Oracle Database.
Oracle Database 10 g introducido un nuevo compilador de optimización y un recién sintonizado entorno de ejecución. Sería difícil encontrar un mejor ejemplo de un total mejora de los resultados transparentes, todo lo que tienes que hacer es actualizar (que
proceso requiere la recompilación de los actuales objetos PL / SQL) y el tiempo la ejecución de su PL / SQL de código (sin contar el tiempo que pasan haciendo SQL) se reduce a la la mitad.
Oracle9 base de datos que presentó la compilación nativa. Se requirió un DBA set- pero desde el punto de vista del desarrollador, no cambios en el código se necesita.
Por el contrario, que acababa de volver a compilar unidades elegidas mencionar un nuevo PL / SQL compilador de parámetros (Plsql_Code_Type = nativo). Eso es lo que quiero decir con perilla-controlada.
Una versión de la base de datos que ya no es apoyado introducido una sintaxis especial para haciendo SQL seleccionar las operaciones y las operaciones de DML (insertar, borrar, etc) en a granel. Estas características del lenguaje de aumentar el rendimiento al reducir el número de cambios de contexto entre el entorno de ejecución de PL / SQL 's y de SQL entorno de ejecución. Sin embargo, los desarrolladores tuvieron que aprender la nueva sintaxis
y entender los casos de uso en estas características del lenguaje que ofrecer
beneficio, a continuación, (para las unidades ya existentes) que tuvieron que hacer un caso para la renovación de código los proyectos. Esto es lo que quiero decir con una característica del lenguaje de rendimiento: su beneficio es ciertamente no trajo transparente.
El ejemplo canónico de la funcionalidad de una característica del lenguaje (de nuevo, introducido para hace mucho tiempo que no tengo que decir que) es el paquete de DBMS_SQL. Los clientes simplemente no tienen mecanismos que les permitan ampliar PL / SQL (antes DBMS_SQL se presentó) para que pueda ejecutar sentencias SQL, cuyo texto No se conoce hasta tiempo de ejecución (o sentencias SQL cuyo texto se conoce al compilar tiempo, pero que no son compatibles con SQL estático). En sentido estricto, un Suministrados por Oracle paquete no es una característica del lenguaje PL / SQL. Sin embargo, cuando el paquete expone subprogramas que las implementaciones de abrigo que se programan directamente en el código del ejecutable de Oracle (y no podría ser implementado en PL / SQL sólo) la distinción es discutible.
Oracle9 base de datos que introdujo la expresión de casos (tanto en SQL y PL / SQL)
y el caso de declaración (en PL / SQL). Estas características del lenguaje no permiten los desarrolladores para programar cualquier cosa que no podía escribir sin la nueva sintaxis.
Pero las construcciones permitirá a los desarrolladores a pensar más claramente sobre el código que está a punto de escribir - y, más tarde, para comprender con mayor facilidad sus propios o ajenos código de los desarrolladores que utiliza estas construcciones. Esto, por supuesto, aumenta el probabilidad de que el código sea correcto. Estos son ejemplos de características de usabilidad.
Por cierto, las nuevas características no siempre ranura perfectamente en este esquema. Nativo SQL dinámico (en comparación con el DBMS_SQL pre-existentes) aporta un rendimiento beneficio, un beneficio de la funcionalidad (que le permite devolver un cursor ref al cliente de base de datos),
y una facilidad de uso de beneficios (que es muchísimo más compacto que el equivalente DBMS_SQL código)

La mejora del rendimiento TRANSPARENTE:
La compilación nativa REALES
Oracle9 base de datos que introdujo PL / SQL compilación como nativo, Oracle Database 10 g trajo el almacenamiento de los archivos DLL nativos en el catálogo, y Oracle Database 11 g trae completa fuera de la caja de la transparencia de la función. Más sobre esto anon.
Pero en primer lugar, creo que ayudará a recordar lo que PL / SQL compilación como nativo es (y no), y cómo el régimen anterior (que informalmente llamado C-nativo) trabajado.
PL / SQL es un lenguaje interpretado famoso. Eso no quiere decir que la fuente texto es procesado sentencia a sentencia en tiempo de ejecución (como en los viejos tiempos con
BASIC), sino que, PL / SQL se compila de manera ordinaria en código de máquina - llamado M-Code. Sin embargo, el equipo de destino es virtual: el PVM llamada – para PL / SQL de la máquina virtual. (De esta manera, es como Java, con su JVM). El PVM se implementa como un conjunto de subrutinas en el ejecutable de Oracle y en tiempo de ejecución la M-código es escaneado por otra subrutina tales. La exploración detecta cada código de operación y sus sucesivas operandos y después llama a la subrutina que implementa este código de operación con los argumentos reales apropiado. Por supuesto, esto escaneo en tiempo de ejecución de la M-Code tiene algunos recursos y que es exactamente, y sólo, esto que PL / SQL compilación nativa mejora. Cuando usted elige Plsql_Code_Type = nativa, la compilación de la unidad sigue exactamente el mismo camino como cuando se elige interpreta el derecho a la etapa en la que un precursor de el código de la máquina de destino está disponible. , La rama de caminos: en el modo de interpretar, la M-Code se produce, y en modo nativo, es una DLL específica de la plataforma producido que en tiempo de ejecución llama a las subrutinas PVM exactamente lo mismo con el mismos argumentos que se habría llamado mediante el escaneo de la M-Code. (Voy a usar
DLL como una abreviatura genérica para la biblioteca se pueden compartir y dinámicamente enlazables, el archivo
tipo en los sistemas Windows que resulta ser. dll y en los sistemas Unix es. así que.) El
diferencia es que el esfuerzo de exploración se ha movido de tiempo de ejecución para compilar
tiempo y, por supuesto, esto mejora el rendimiento en tiempo de ejecución. Significativamente, ya que
exactamente las subrutinas PVM mismo se llaman exactamente con los mismos argumentos que en
dos modos de interpretar y nativos, de modo nativo es la garantía de tener exactamente el
misma semántica que el modo de interpretar. Esto significa que toda una clase de pregunta
que periódicamente escuchar (por ejemplo, "¿Es PL / SQL compilación como nativo compatible con
? el modo de servidor compartido ") tiene una respuesta genérica simple:" Sí, porque ambos interpretados y
modos de compilación nativa hacer exactamente lo mismo en tiempo de ejecución. "
Así que ... ¿de dónde C entran en escena? Claramente, PL / SQL compilación como nativo
tiene que trabajar en una variedad de plataformas, lo que implica un esfuerzo de portabilidad. En
Oracle9 i base de datos y bases de datos Oracle 10 g, que "terceriza" el esfuerzo de este por
conseguir el ejecutable de Oracle para transformar el código máquina de pre-cursor se convierte en un
texto equivalente de código C. Entonces se escribió esto como un archivo del sistema operativo y
invoca el compilador y enlazador de C para que la plataforma para generar la necesaria
específicos de la plataforma de DLL. Hemos utilizado este mismo método, tanto en Oracle9 base de datos i
y en Oracle Database 10 g, la única diferencia fue que en el primero, el
lugar canónico de almacenamiento fue el sistema de archivos (lo que causó algunas dificultades
con RAC y con copia de seguridad), pero en el segundo, fue el lugar canónico de almacenamiento
el catálogo. Sin embargo, incluso en el segundo, los archivos DLL que se había materializado en el
sistema de archivos tanto en tiempo de compilación y en tiempo de ejecución porque el sistema operativo
empresas de servicios públicos que se basó en esta necesaria - de ahí el Plsql_Native_Library_Dir y
Plsql_Native_Library_Subdir_Count parámetros de inicialización. Aviso, por cierto,
que no hay un significado en C per se, sino que era sólo un 3GL cómoda en la que ellos desarrolladores de Oracle Corporation y hablaban de que era un compilador
disponible en todas las plataformas de interés.
Este esquema funcionó perfectamente desde un punto de vista técnico, pero sufrió
algunos inconvenientes graves de usabilidad: la religión de algunos clientes simplemente prohíbe la
instalación de un compilador de C en una máquina de producción (y no se puede discutir con
que); otros clientes eran reacios a pagar la licencia de un compilador de C (y por
alguna razón desconfiaba de gcc), y otros clientes encuentran las tareas de configuración DBA
(Instalar el compilador C, comprobando el archivo en el directorio spnc_commands plsql
en inicio de Oracle, y el establecimiento de la Plsql_Native_Library_Dir
y
Plsql_Native_Library_Subdir_Count parámetros) demasiado difícil. El resultado neto fue
que la compilación PL / SQL nativo, que ofrece un rendimiento indiscutible
beneficio de ningún esfuerzo de desarrollo, ha sido muy infrautilizados.
Por cierto, la gente suele preguntar: "¿Se compilar el paquete suministrados por Oracle de forma nativa
mejorar su rendimiento? "Es bueno saber, en primer lugar, que la mayoría de estos son
implementado directamente en el ejecutable de Oracle (que pasa a ser escrito en
C) y son expuestos a través de PL / SQL envoltorios (como se ha mencionado en relación
con DBMS_SQL). En otras palabras, que ya son más nativos que los nativos (si
lo que quiero decir: no hay PVM en la imagen) y por lo que ayuda sólo marginalmente
para elaborar los envoltorios de forma nativa. (Sin embargo, nunca perjudica a hacer esto.)
El objetivo de la "real nativa" del proyecto de Oracle Database 11 g, por lo tanto a
eliminar la dependencia de un compilador de C y el enlazador del sistema operativo y el cargador
servicios públicos mediante la programación de los ejecutables de Oracle para transformar el código máquina
precursor directamente a la necesaria código específico de plataforma de la máquina. (Por supuesto,
este objetivo implica morder la bala y hacer la tarea para todas las plataformas de
de interés.) Un objetivo secundario fue para acelerar el tiempo de compilación. Y un objetivo terciario
no iba a dañar el desempeño de la ejecución. El proyecto fue todo un éxito: ahora
el archivo DLL de PL / SQL nativo nunca se materializa en el sistema de ficheros y por lo tanto necesitan los
para la gestión de la Plsql_Native_Library_Dir y Plsql_Native_Library_Subdir_Count
parámetros y el contenido de los directorios que denota desaparece.
Velocidad de compilación se ha incrementado en cerca de 2 veces. Y, lejos de ser dañado,
velocidad de ejecución se ha incrementado notablemente.
PL / SQL compilación como nativo ahora sólo tiene un botón: Plsql_Code_Type. El DBA
no tiene funciones de configuración, y la decisión por unidad para compilar un archivo DLL nativo
o M-Code puede ser hecha por el desarrollador con la certeza de que el
elección será automáticamente honor en cualquier lugar de la instalación

La mejora del rendimiento TRANSPARENTE: de grano fino
DEPENDENCIA DE SEGUIMIENTO
Desde los albores del tiempo, PL / SQL programadores han disfrutado de un beneficio que (si
que el programa sólo en PL / SQL) que ni siquiera se han dado cuenta que van a obtener:
no hay que pensar en el equivalente de un archivo de hacer. Cuando un sistema de
PL / SQL unidades y otros objetos de base de datos (tablas, vistas, secuencias, etc)
hacen referencia mutua, es suficiente limitarse a dejar que el código fuente de expresar estas
las relaciones y la creación de las unidades en cualquier orden. Siempre que el código fuente
está libre de errores, entonces todo lo que tienes que hacer es crear todos los objetos y luego hacer referencia
alguno de interés. No importa que, durante la creación, algunos terminan inválidos
porque ha elegido un fin desafortunado. Base de Datos Oracle accede a la
la dependencia de los metadatos que se creó como un efecto secundario de la compilación y
compila automáticamente cualquier unidad no válida en la que la unidad elegida se refiere
(Recursivamente) depende. Más adelante, si cambia alguna unidad, entonces todos sus dependientes son
(Recursivamente) invalidado y, en el próximo intento de hacer referencia a cualquier unidad, lo mismo
implícita recursiva re-compilación vuelva a suceder. En otras palabras,
Base de Datos Oracle mantiene una invariable: no se puede hacer referencia a un éxito
objeto a menos que y cada objeto de forma recursiva referencia es válida y todos los objetos
ha sido compilado con las versiones más recientes de todos los objetos que
referencias. Esto se logra mediante la invalidación e implícitos recopilación de inválidos
objetos, o bien todas las compilaciones son libres de errores, y su referencia a la
objeto elegido en silencio éxito, o al menos hay un error de compilación, el
objeto elegido termina inválida, y se obtiene un error de ejecución limpia. En otras palabras,
Base de datos Oracle garantiza que no se puede obtener un comportamiento misterioso porque uno
determinado objeto invoca una versión obsoleta de uno de los objetos de los que depende.
(Esto te libera de la consideración de toda una clase de causas potenciales durante una
ejercicio de depuración.)
Este "hacer automático" ambiente claramente depende de forma crucial en el hecho de que
cuando un objeto se crea o modifica, la lista de objetos de los que depende es
mantenerse al día. Debido a esta misión, la criticidad, la base de datos Oracle tiene, aunque
Comunicado de 10,2, que se utiliza un enfoque que, obviamente, garantiza la exactitud -, pero en
expensas de posibles optimizaciones: información de dependencia se registró en
la granularidad de todo el objeto. Por lo tanto, si usted hizo un cambio a una ya existente
objeto que podría razón no podría causar que usted tenga que cambiar ninguno de sus
objetos dependientes para reflejar este cambio, sin embargo, observó que estas
dependientes fueron invalidadas. (El ejemplo más obvio de este tipo de "inocente"
el cambio es añadir un nuevo subprograma - que no se agregue una nueva sobrecarga
de un subprograma existentes -. a una especificación de paquete existentes) no sólo son
los dependientes inmediatos innecesariamente (a partir de una "lógica" punto de vista) invalidó
-, Sino también la cascada de invalidaciones. El resultado neto, mientras que la corrección es
garantizada, es consumir recursos importantes de computación en una instalación
aplicación está parcheado haciendo compilaciones que podría, en principio, evitar - en
Es decir, para prorrogar el plazo para la interrupción planeada de la aplicación.
Oracle Database 11 g resuelve esto el registro de información, no la dependencia en el
granularidad de todo el objeto, sino más bien en la granularidad de los elementos
dentro del objeto. Por ejemplo, si p1 p2 procedimiento requiere el procedimiento en el paquete
Pkg, entonces los metadatos de p1 se incluyen el hecho de la dependencia es en p2
(Con una lista específica de los parámetros formales con sus tipos y modalidades) dentro de
paquete de Paquete. Esto significa que, ahora, la adición de un nuevo procedimiento para p3
Paquete de paquete no invalidará ninguna de las personas a cargo de Paquete - lo que significa que en
a su vez que el tiempo de inactividad que usted necesita para la aplicación de parches se reduce. Tenga en cuenta que la instalación de un conjunto de parches de base de datos Oracle se le permite cambiar el paquete
especificaciones, sino sólo de una manera estrictamente compatibles: en otras palabras, todos los existentes
código debe funcionar correctamente con las versiones nuevas de las especificaciones de los paquetes
sin hacer ningún cambio de código. Antes de Oracle Database 11 g, la instalación
de un conjunto de parches podría causar nulidad en cascada enorme, y ahora, como un
instalación no causará nulidad. Que conducirá a una reducción dramática en
el tiempo de inactividad necesario para instalar un conjunto de parches de base de datos.
Aviso, por último, que el nuevo grano fino seguimiento de dependencias no se ocupa de
parches de solicitud en línea y actualización. Es fácil ver que porque uno de los
problemas más evidentes que cumplir si se intenta actualizar un cuerpo de paquete con estado
con una sesión en otra sesión se crea una instancia que es el conocido así
llamado 4068 de la familia de los errores, pero la invalidación (o incluso supresión) de un paquete
cuerpo famosa no invalida su especificación. La introducción de un rico
conjunto de características que permite la actualización de solicitud en línea debe esperar hasta que una futura versión
Base de Datos Oracle.
MANDO DE CONTROL-la mejora del rendimiento:
Interior de la unidad inline
Programadores (en cualquier idioma) se les aconseja limitar el tamaño de los ejecutables
sección de cada subprograma. Las opiniones varían, pero la preferencia más comunes
parece que no hay más que un par de screenfulls. Sin embargo, los programadores saben,
también, que hay un costo inevitable asociado con una llamada a subrutina. Consideremos, por
ejemplo, la tarea de sumar dos números. Es probable que todo programador sabe
que a: = b + c, será más rápido en tiempo de ejecución de un: = Suma (a, b), donde la función
Sum () hace lo que dice su nombre - y entiende por qué es así. Este
comprensión puede conducir a un incómodo dilema: si el código de
claridad (y por lo tanto mayor probabilidad de corrección) o para la velocidad de ejecución.
Supongamos que usted tiene que escanear un texto Inglés y contar el número de "sustancial
las palabras "(es decir, con exclusión de las palabras como una, el, yo, tú, y, sino, a donde, desde, en, y
etc.) Un bucle principal de este tipo es evidentemente correcto:
Usted puede imaginar cómo escribir Found_Another_Word (), que escanea el texto de entrada,
extractos de la siguiente palabra, pasa esta de vuelta como un parámetro out y devuelve true
hasta que falle para extraer una sola palabra. Usaría Instr () para encontrar la siguiente
espacios en blanco y substr () para extraer los caracteres entre el final de la última
espacios en blanco y el comienzo de la siguiente. No es ciencia espacial, pero sin duda el tipo
de código que desea aislar en un subprograma dedicado. Un argumento similar
se aplica a Is_Substantial (). Y usted puede imaginar, también, cómo el código podría ser si
que insistió en el rendimiento de priorizar y evitar encapsular la lógica de la
Found_Another_Word () y Is_Substantial () en subprogramas: difícil de escribir y
sin duda más difícil que su sucesor a mantener.
Una forma de tener su pastel y comérselo es usar un preprocesador antes de la compilación
adecuada que reconozca especial mark-up códigos en el texto original (en contrario
desee llamar a un subprograma) y sustitutos que el texto original que el margen de
denota. Este enfoque se denomina procesos en línea y es familiar a los programadores de C. Nosotros
tuvo en cuenta la ampliación función PL / SQL 's compilación condicional para apoyar una
enfoque similar, pero prefirió delegar la tarea al compilador.
Oracle Database 11 g ofrece una línea pragma nuevo con los valores permitidos 'sí' y 'no'.
Al escribir esto:
inmediatamente antes de la declaración que invoca Found_Another_Word (), mientras que
Plsql_Optimize_Level = 2, las solicitudes programador que Found_Another_Word ()
debe ser entre líneas en este sitio de la llamada. (Inlining nunca se hace cuando
Plsql_Optimize_Level es menor que 2.) En algunos casos, la solicitud no puede ser
honrado por razones que son demasiado complejas de explicar. Sin embargo, el programador
necesidad de no tener ninguna duda sobre el resultado de la solicitud. Cuando inline es
hecho, se informa mediante el sistema de advertencias del compilador de esta manera:
PLW-06005: inline de la llamada de 'FOUND_ANOTHER_WORD' procedimiento se realizó
Para el registro, los procesos en línea no se hace en el régimen del texto original de PL / SQL
sino, más bien, en el régimen de la de la representación intermedia que se
generados a partir de la salida de análisis sintáctico y semántico del compilador
fase.
Oracle Database 11 g también aporta un nuevo valor permitido del 3 para el
Plsql_Optimize_Level compilador parámetro. Esto indica al compilador
automáticamente la búsqueda de oportunidades a los subprogramas en línea en los sitios de su llamada
incluso cuando el programador no ha solicitado esta línea con pragma. En este
nivel, pragma en línea (My_Subprogram, "sí"), pide al compilador para clasificar a este sitio de la llamada
alta entre los candidatos a la inclusión entre líneas se descubre el uso es propia heurística. Es en
este nivel que decir "no" en el pragma es significativo: se trata de un mandato a la
compilador que no en línea del subprograma en ese sitio de la llamada.
He implementado el algoritmo para contar las palabras importantes en un texto con el
enfoque que se ilustra arriba. Los subprogramas de ayuda fueron declaradas a nivel local
en el procedimiento de prueba de sección de declaración. (No voy a mostrar mi código, será más
convencido de que si usted escribe su cuenta.) que no utilice la instrucción en línea pragma. Yo
compilado por primera vez con Plsql_Optimize_Level = 2 y luego con el nivel 3. En el nivel 3,
el compilador informó PLW-06005 para la convocatoria de cada uno de Found_Another_Word ()
y Is_Substantial (). También se informó lo siguiente:
PLW-06006: no reclamado de procedimiento "FOUND_ANOTHER_WORD" se elimina.
y lo mismo para Is_Substantial (). Esto es realmente una mejora autónoma
las advertencias. Usted obtendrá la misma advertencia en cualquier nivel de optimización si
compilar una unidad que define un procedimiento local que nunca se invoca.
En mi prueba, utilizando un texto de 32k caracteres seleccionados al azar de la
internet, vi que inline hecho la velocidad del programa por subir a 10x.
Por supuesto, su kilometraje puede variar!
La gente suele preguntar "¿Es inline una panacea universal? Siempre debo compilar con
Plsql_Optimize_Level = 3? "La respuesta es que esto no es como establecer el nivel 2 o como
siempre se compila con Plsql_Code_Type nativo =. Estas opciones de este último no puede
perjudicar el desempeño en tiempo de ejecución, lo peor que el riesgo no es tanto de un aumento a medida que
podría haber esperado. Por supuesto, tanto las opciones de hacer aumentar el tiempo de compilación;
pero por lo general se trata de una simple decisión de un despliegue de producción para la opción de invertir en
un costo en tiempo de compilación para cosechar los frutos en tiempo de ejecución. Procesos en línea, por el otro
mano, tiene el potencial de dañar el rendimiento en tiempo de ejecución. La explicación es
demasiado complejo como para hacer justicia en este ensayo -, pero, a grandes rasgos, que tiene que ver con
consideraciones como las siguientes: el optimizador puede con mayor facilidad para deducir la
propiedades de un subprograma - para que se pueda, por ejemplo, con seguridad izar una llamada con
lazo invariante argumentos fuera de un bucle - de lo que es capaz de deducir
propiedades correspondientes de un tramo común de código.
Procesos en línea también tiene la posibilidad de causar hinchazón de código (a pesar del hecho de que el
optimizador tiene un gobernador hinchazón) o, contra-intuitiva para los iniciados, para reducir
código de volumen. La reducción puede ocurrir cuando un subprograma que se llama entre líneas con
argumentos reales cuyos valores el optimizador sabe en tiempo de compilación y que
determinar el flujo de control, en tales circunstancias, las ramas de código puede ser
eliminado en tiempo de compilación.
En conclusión, se recomienda la experimentación para determinar la eficacia de la
procesos en línea
RENDIMIENTO característica del lenguaje:
LA PL / SQL función de caché RESULTADO
Oracle Database 11 g presenta tanto una consulta SQL caché de resultados y PL / SQL
función de caché de resultados. Ambos utilizan la misma infraestructura y lo que es útil para
describir en una sola cuenta. Primero, para entender el beneficio de la consulta SQL
caché de resultados, considere una consulta que tiene que procesar una gran cantidad de datos a
producir un conjunto de resultados pequeños, donde los cambios de datos subyacente con frecuencia
en comparación con la frecuencia con que se ejecuta la consulta - por ejemplo, para
encontrar el mayor valor promedio de los ingresos por estado sobre la totalidad
población - o alguna métrica similar. Incluso cuando el SGA es tan grande que todos los
los bloques de datos necesarios pueden ser retenidos en la caché del búfer bloque, caro
computación (si no lee el disco) se debe hacer, antes de Oracle Database 11 g, para obtener
el resultado requerido cada vez que se ejecuta la consulta. La consulta SQL caché de resultados
guarda este cálculo a través de almacenamiento en caché el resultado. El caché está en la piscina y
lo que los resultados que una sesión de cachés beneficio de otras sesiones. Por supuesto, el almacenamiento en caché
es interoperable RAC. La forma más sencilla de solicitar el almacenamiento en caché de resultados es añadir un toque
(Escrito / * + result_cache * /) a la instrucción SQL. Cuando alguna de las tablas que
están involucrados en la determinación del resultado de la consulta sufre un cambio, entonces el
los resultados en caché se purgan automáticamente.
Ahora, para entender el beneficio de la caché de la función PL / SQL consecuencia, considerar una
función que se ejecuta varias consultas SQL (donde tal vez uno se parametriza
de acuerdo a los resultados de una consulta anterior), y luego realiza un cálculo
basado en los resultados. (Supongamos que es complicado o imposible de expresar la
de cálculo en una sola consulta SQL.) A pesar de que sólo ayudaría a añadir el result_cache
una pista de las consultas SQL, incluso se benefician más de rendimiento es posible mediante el almacenamiento en caché
el resultado de la función. (Así se evita el cambio de contexto entre el PL / SQL y
los entornos de ejecución de SQL.) Esto es a la vez añadiendo la palabra clave
result_cache a la declaración de la función en el lugar donde otras propiedades como
authid y parallel_enable se especifican. Sin embargo, es responsabilidad del programador
la responsabilidad de mencionar explícitamente la lista de tablas cuyos datos determinar la
resultado de la función de. Esto se hace con la cláusula relies_on. Cuando la función de
declaración y definición están separados, como lo están con una función declarada en un
paquete de especificaciones o con una función local que se declaró hacia adelante, entonces
Recomendamos que sólo la definición de uso de la cláusula de relies_on. La definición
este aspecto:
Tenga en cuenta que en el caso de SQL es suficiente decir result_cache - el compilador de SQL
se resuelve lo que las tablas están involucrados en la determinación del resultado, pero en el PL / SQL
caso de que el programador debe proporcionar esta información. Esto refleja la diferencia
entre SQL como un lenguaje declarativo que describe el resultado deseado sin
especificando la forma en que deben calcularse y PL / SQL como un lenguaje imperativo
que especifica cómo el resultado se debe calcular, sin expresar la intención
de forma explícita.
Cuando una consulta SQL utiliza marcadores de posición, entonces muchos de los resultados se almacenan en caché para que
consulta con llave por la combinación de argumentos se unen para que la consulta se
ejecutado. Del mismo modo, cuando una función PL / SQL tiene parámetros formales, entonces, muchos
los resultados se almacenan en caché para esa función, introducido por la combinación de reales
argumentos con los que se invocó la función. Hay algunas restricciones en
los tipos de datos permitidos para los parámetros formales y el retorno de la función. Para
ejemplo, no se puede tener un parámetro de no escalar formal (que rigen también
excluye los tipos de datos LOB) o un retorno de la pelota alta. Estas restricciones se explican en el
documentación.
Un candidato obvio para la caché de resultados de consultas SQL es la consulta que se traduce
una tecla numérica en el texto de presentación que se representa con una lista de tabla de valores.
Este caso de uso se extiende naturalmente a PL / SQL. He visto que los programadores suelen
utilizar una función PL / SQL para devolver un conjunto de resultados de la combinación interna de una tabla de datos
con uno o varios socios de la lista de las tablas de valores (por ejemplo, a la lista de los empleados
con el nombre de su departamento). En este caso, es muy común para cargar la lista de
valores de los datos en un índice de paquetes globales por mesa varchar2 cuando el paquete se
instancia y luego utilizarlo para sustituir el texto de la pantalla de la llave en
PL / SQL de código después de una consulta contra sólo la tabla de datos única. Este almacenamiento en caché
plan ofrece un beneficio notable en el rendimiento (que, por supuesto, es por eso que es
popular). Sin embargo, adolece de dos inconvenientes fundamentales: la corrección sólo puede
hacer valer, en lugar de garantizar, por ensayar un argumento acerca de la estabilidad
de la lista de la tabla de valores en el funcionamiento normal, y cuando cada uno de los muchos
sesiones simultáneas almacena su propia copia de la tabla de búsqueda, a continuación, escalabilidad
se convierte en un problema. Al escribir el resultado en caché PL / SQL función que, por
ejemplo, devuelve el índice de la tabla de consulta varchar2, ambos son estos inconvenientes
eliminados. Por otra parte, el beneficio de la gestión de la caché (un envejecimiento-LRU-base
a cabo la política, y así sucesivamente) se ofrece de forma transparente - mientras que en la codificación manual
enfoque que yo nunca he visto un esquema de codificación manual.
Como se ha mencionado, tanto en la consulta SQL caché de resultados y el resultado de la función PL / SQL
caché de la misma infraestructura: memoria asignada dinámicamente a partir de la
piscina comunitaria, gobernado por el parámetro de inicialización Result_Cache_Max_Size.
El paquete DBMS_Result_Cache expone subprogramas de administración de caché (por
ejemplo, para anular la memoria caché, para purgar completamente, para purgar los resultados de una
consulta especificada o función, y para desactivar el modo de bypass). Una familia de catálogo
puntos de vista con los nombres que empiecen con v $ Result_Cache_ (y sus correspondientes puntos de vista para gv $
RAC) exponer la información que le permite al ingeniero de desempeño para decidir
si, para cada consulta y la función, el almacenamiento en caché está dando sus frutos. (Por supuesto, si
guardar en caché el resultado que se purga antes de acceder al valor almacenado en caché, o que nunca
se accede, entonces el efecto será el de disminuir el rendimiento.)
Ingenieros en el equipo de PL / SQL en la sede de Oracle utiliza el nuevo PL / SQL
Jerárquico de perfiles (ver abajo) para observar un test automatizado de un APEX
1
de la aplicación. Esta identificado muchas funciones candidato para el almacenamiento en caché de resultados. A
prototipo de la aplicación APEX que recompilar las funciones identificadas con
la propiedad result_cache (y las correspondientes cláusulas de relies_on) mostró una
mejora del rendimiento de alrededor del 15%


OTRA NUEVA PL / SQL de Oracle Database CARACTERÍSTICAS 11 G


Funcionalidad de las características del lenguaje:
Dinámica finalización SQL
La inmediata ejecución puede tomar un clob. DBMS_SQL. Parse () puede tomar un clob. DBMS_SQL
puede manejar definidos por el usuario en la lista de selección y para la unión. Se puede convertir una
DBMS_SQL numérico cursor a un cursor de referencia (para que pueda pasar de nuevo a un
cliente de base de datos o, cuando se conoce la lista de selección en tiempo de compilación, puede traer
en un registro o mayor que la tomase en una colección de registros). Se puede convertir una
ref cursor a un cursor DBMS_SQL numérico (lo que se puede describir). Ahora
necesidad DBMS_SQL sólo para "Método 4" o de los requisitos de arcanos como la ejecución de
DDL a través de un enlace de base de datos.
Funcionalidad de las características del lenguaje:
DBMS_SQL Seguridad
Un intento de adivinar el valor numérico de un abierto (y analizar) DBMS_SQL
cursor (para que inescrupulosamente se puede secuestrar, volver a enlazar los datos para ver que no debe,
y ejecutar a buscar de ella) ahora causa un error y se desactiva para DBMS_SQL
esa sesión. Los subprogramas de unión y la ejecución debe ser invocado por el
CURRENT_USER mismo, con los mismos papeles, que se invoca el análisis. Opcionalmente, a través de un
nueva DBMS_SQL. Parse () de sobrecarga, la invocación de todos los subprogramas DBMS_SQL
se puede restringir de esta manera.
Funcionalidad de las características del lenguaje:
De grano fino control de acceso para UTL_TCP , etc
Ya no es suficiente para tener la ejecución de privilegios en UTL_TCP y sus primos
( UTL_HTTP , UTL_SMTP , UTL_MAIL , Utl_Inaddr ). También debe tener el específico
el privilegio de establecer una conexión TCP / IP a cada nodo: puerto de combinación que
va a acceder. Los privilegios de grano fino son otorgados por conseguir el DBA
para crear una ACL (de usuarios y roles), y aplicar esto a un puerto (rango) en un nodo ,
utilizando el DBMS_Network_Acl_Admin paquete.
Funcionalidad de las características del lenguaje:
Crear un disparador con discapacidad; especificar el orden de activación de disparo
Utilice el desactivar la palabra clave en la creación de declaración para evitar el riesgo de que, si el disparador
no se compila, DDL a la mesa hará que el ORA-04098 error. Utilice El
la siguiente palabra clave en la sentencia de creación de controlar el orden de encendido de mutuo
se activa en el punto mismo tiempo (por ejemplo, antes de cada fila ). Esto ayuda cuando se dispara
se generan mediante programación.
Funcionalidad de las características del lenguaje:
Llamar a un método específico ADT anulado
Si usted no sabe lo que el polimorfismo es dinámico y no escriba de las jerarquías
ADTs con subprogramas miembro anulado, entonces esta función no será de interés
Que. Si no, siga leyendo. Nueva sintaxis permite la implementación de una razón imperiosa
subprograma para invocar el subprograma miembros que lo anula que se define
en un supertipo especificado. Este fue el caso de uso motivación, pero la misma sintaxis
También se puede utilizar normalmente para extender la notación de puntos que llama a un objeto de
Método. La notación de puntos normal invoca el método que reemplaza en este objeto de
tipo de nivel en la jerarquía, la notación extendida le permite invocar una
método particular anulado en ningún nivel en la jerarquía.


La facilidad de uso característica del lenguaje:
El disparador compuesto
Un paradigma conocido utiliza una declaración ante el gatillo, una antes de cada fila o
después de cada fila de disparo, una declaración después de gatillo, una especificación de paquete, y su cuerpo
en concierto. El paradigma es útil cuando se desea "aviso" de actividad de cada
la fila de la LMD despido afecta, sino que actúan en este sólo periódicamente. Esto podría ser
mejorar la eficiencia de darse cuenta de la información de auditoría, el registro esta en un paquete
colección mundial, y el volumen que se inserta en la tabla de auditoría, o puede ser que sea para evitar
la tabla mutante error. El disparador es un objeto compuesto de base de datos única que
"Se siente" más bien como un cuerpo de paquete y le permite a usted poner en práctica el mismo paradigma
en Una Sola Unidad. Permite implementar un "pseudo-procedimiento" para cada uno de los cuatro
puntos de la tabla de tiempo y estado declara que cada uno de estos procedimientos pseudo-puede
ver. me llamó pseudo-procedimientos, porque se ven muy bien como
procedimientos, sino que se nombran con las palabras clave. De esta manera:
El estado se maneja de forma automática para que la vida útil de la LMD despido
declaración en lugar de que el período de sesiones.
La facilidad de uso característica del lenguaje:
Use My_Sequence.Nextval en una expresión de PL / SQL
Ya no es necesario decir seleccionar My_Sequence.Nextval en v de la doble; la misma
Va para CURRVAL .
La facilidad de uso característica del lenguaje:
El continuar declaración
PL / SQL alcanza a otros idiomas. El seguir tiene una relación familiar
a la salida . Tanto se puede escribir sin condiciones o junto con un booleano expresión
como el argumento de que , y tanto puede especificar el nombre de un bucle envolvente.
La diferencia es que la salida abandona el circuito propuesto, pero siguen inicia el
siguiente iteración de este bucle.
La facilidad de uso característica del lenguaje:
Notación con nombre y mezcla de SQL
PL / SQL programadores conocen el valor de la invocación de un subprograma que tiene una muy
gran número de parámetros formales de pagar por escribir
Interesting_Formal => Interesting_Actual
sólo para los parámetros formales que por defecto no quieren aceptar. Este
valor no ha estado disponible cuando una función PL / SQL se invoca en un SQL
declaracion. Ahora bien, esta restricción se ha eliminado.
La facilidad de uso característica del lenguaje:
"Cuando los demás entonces nulo" y otras advertencias en tiempo de compilación
Programadores ingenuos tienen una tendencia a proporcionar un valor nulo cuando los demás excepción
controlador para cada subprograma, porque creen que es malo para causar un
error (sí, de verdad - Tom Kyte leer sobre este tema). Por supuesto, cuando un subprograma
silencio regresa después de la supresión de un error desconocido, y los errores en la persona que llama en
bendita ignorancia, entonces cualquier cosa puede ocurrir - y la depuración es una pesadilla


Sería una labor muy intensa, y propenso a errores, para intentar un análisis de los existentes
código en busca de esta locución peligroso. Ahora, el compilador de puntos si cuando
manejador de los demás no incondicionalmente volver a subir la excepción o plantear una nueva
uno, en este caso los problemas PLW-06009 .
Otras nuevas advertencias se aplican, por ejemplo PLW-06006 , como se ha
mencionado anteriormente.
La facilidad de uso característica del lenguaje:
Regexp_Count () en SQL y PL / SQL
Esto es justo lo que su nombre implica. Sería tedioso de escribir código para producir
la misma respuesta sin que esta nueva función

HERRAMIENTAS
El PL / SQL Profiler jerárquica
Oracle Database 11 g aporta un nuevo perfil del rendimiento para bases de datos jerárquica
PL / SQL. En términos muy generales, que lo utilizan como utilizar SQL Trace: a su vez en datos
colección, ejecute el código, desactive la recopilación de datos y el formato de los datos básicos para
el análisis humano. Sin embargo, debido a la riqueza de la información recopilada,
el formateador de las tiendas de su producción en las tablas de base de datos o genera un conjunto de
hipervínculos páginas HTML. A continuación, puede responder a preguntas como estas: muéstrame
la lista de los subprogramas y las sentencias SQL que se ejecutó durante la carrera,
ordenado por el tiempo transcurrido, para un subprograma particular, me muestra el tiempo
pasado en sí mismo y el tiempo empleado en cada uno de los subprogramas que llama, por una
subprograma particular, muéstrame la lista de los subprogramas que se llama ordenada por
el tiempo total de esas llamadas. Esta información le guiará de manera eficiente para el código
cuya optimización tendrá el mayor efecto.
PL / Ámbito de aplicación
Oracle Database 11 g introduce un parámetro nuevo compilador para controlar la
generación de los metadatos de los identificadores en una unidad. Si se compila una unidad con
"Identificadores: todos los 'PLScope_Settings = entonces se puede consultar uno de los DBA_Identifiers
Catálogo de la familia para obtener la línea y la ubicación de la columna de la referencia a cada uno
identificador y saber que cada identificador está definido (que podría ser en un
unidad diferente, por supuesto). Debido a PL / SQL es un lenguaje estructurado en bloques, uno
nombre en particular a menudo corresponde a un fenómeno diferente en diferentes
lugares en una unidad. Por lo tanto, la búsqueda de texto normales es un instrumento débil para descubrir
en un determinado identificador está definido o donde se hace referencia es, más bien, se necesita el
plena inteligencia del compilador de PL / SQL. Usted puede utilizar el DBA_Identifiers puntos de vista
para apoyar las consultas ad hoc análisis de los efectos si, por ejemplo, se descubre que dos
subprogramas se les ha dado el mismo nombre y desea cambiar el nombre de una
lección de disminuir la confusión que esto provoca que el programador (aunque, por supuesto, no
el compilador).
Sin embargo, esta característica fue motivado por una meta diferente: para permitir que SQL
Desarrollador para presentar el código fuente en el hipervínculo identificador de usos a sus
definiciones, donde identificador de enlace definiciones de listas de enlaces a sus
usos, y así sucesivamente. Esta instalación es análoga a la Cscope (ver cscope.sourceforge.net )
que los programadores de C:. Por esta razón, llamamos a la función de PL / Scope. Tal
instalación es especialmente útil para el programador que hereda un gran corpus de
Código desconocido.
CONCLUSIÓN
Oracle Database 11 g aporta muchas mejoras en PL / SQL. Estos se
mejorar el rendimiento, la funcionalidad y la seguridad de sus aplicaciones y
aumentará su productividad como desarrollador