Avances tecnológicos del siglo XXI y ejemplos de estos
5 mejoras en-rendimiento Oracle 10g
1. Cambios de Oracle9i a Oracle10g
para desarrolladores
Mejoras enMejoras en RendimientoRendimiento
2. Mejoras en Rendimiento SQL
El optimizador basado en Reglas (RBO) queda
obsoleto en Oracle 10g. Esto implica:
Las opciones CHOOSE y RULE del parámetro
OPTIMIZER_MODE todavía existen, pero dejan de estar
soportadas.
El valor por defecto del parámetro OPTIMIZER_MODE
parameter es ALL_ROWS.
Los hints CHOOSE and RULE aún existen pero dejan
de estar soportados.
El código basado en el RBO debe ser modificado para
utilizar el optimizador de consultas (CBO).
Optimizador por ReglasOptimizador por Reglas
3. Mejoras en Rendimiento SQL
SPREAD_MIN_ANALYSIS
USE_NL_WITH_INDEX
QB_NAME
NO_QUERY_TRANSFORMATION
NO_USE_NL, NO_USE_MERGE, NO_USE_HASH,
NO_INDEX_FFS, NO_INDEX_SS y
NO_STAR_TRANSFORMATION
INDEX_SS, INDEX_SS_ASC, INDEX_SS_DESC
Nuevos Hints de OptimizaciónNuevos Hints de Optimización
4. Mejoras en Rendimiento SQL
Los Hints que especifican nombres de tabla
aceptan Hints de tablas globales, mediante
nombre_vista.nombre_tabla.
Los Hints que especifican nombres de vistas
aceptan Hints de Indices Compuestos, mediante
nombre_table.nombre_indice.
Algunos Hints pueden, opcionalmente, aceptar
un parámetro de bloque de consultas.
Hints de Optimización modificadosHints de Optimización modificados
5. Mejoras en Rendimiento SQL
NO_PARALLEL
NO_PARALLEL_INDEX
NO_REWRITE
Hints de Optimización RenombradosHints de Optimización Renombrados
6. Mejoras en Rendimiento SQL
AND_EQUAL
HASH_AJ
MERGE_AJ
NL_AJ
HASH_SJ
NL_SJ
EXPAND_GSET_TO_UNION
ORDERED_PREDICATES
ROWID
STAR
Hints de Optimización ObsoletosHints de Optimización Obsoletos
7. Versionado de Filas
Nueva cláusula VERSIONS en la cláusula FROM de
sentencias SQL.
SQL>SELECT salary FROM employees WHERE employee_id=101;
SALARY
--------
17000
SQL> UPDATE employees SET salary=salary*1.1 WHERE
employee_id=101;
SQL> SELECT salary FROM employees
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id=101;
SALARY
--------
18700
17000
9. Mejoras en campos LOB
Mejora de rendimiento en LOBs
temporales.
LOBs con capacidad de TeraBytes.
(4Gb-1)*DB_BLOCK_SIZE
Soportados en PL/SQL, JDBC (Java) y OCI
Conversión entre CLOB y NCLOB.
Carga de BFILES a CLOB/NCLOB.
Tablespaces transportables con LOBs.
10. Mejoras en el Compilador
Oracle 10g proporciona nuevas características para
mejorar el rendimiento de PL/SQL:
Nuevo compilador PL/SQL para generación de
código optimizado.
Transparente para el usuario
PL/SQL es más rápido que en versiones anteriores
Mejoras en el Compilador PL/SQLMejoras en el Compilador PL/SQL
11. Mejoras en el Compilador
Dos propósitos:
Un aumento en la calidad del código generado,
mejorando el rendimiento en la ejecución.
Una fundación de optimización global para mejorar la
ejecución PL/SQL.
El nuevo compilador ejecuta código PL/SQL:
2 veces más rapido que Oracle 8i
1.5 veces más rápido que Oracle9i
Opciones de compilación:
Debug | Non_Debug
Interpreted | Native
Basic | PLSQL_OPTIMIZE_LEVEL
Nuevo Compilador PL/SQLNuevo Compilador PL/SQL
12. Mejoras en el Compilador
Eliminación de operadores temporales.
Cálculo de determinadas operaciones en
compilación, no en ejecución.
Reutilización de valores de expresiones.
Simplificación de ramificaciones.
Eliminación de llamadas a librerías.
Eliminación de dead code.
Cierre de cursores al finalizar un bucle de
cursor.
Cambios en el Compilador PL/SQLCambios en el Compilador PL/SQL
13. Mejoras en el Compilador
Constantes enteras como PLS_INTEGER.
Operaciones que combinan PLS_INTEGER
y BINARY_INTEGER se ejecutan como
PLS_INTEGER.
Operaciones aritméticas de valores IEEE
754 son mucho más rápidas que para los
valores Oracle NUMBER.
Cambios en el Compilador PL/SQLCambios en el Compilador PL/SQL
14. Mejoras en el Compilador
El código compilado de forma nativa se ejecuta
aún más rápidamente.
Habilidad para cambiar el código compilado en
modo intérprete a código compilado en modo
nativo.
Uso de scripts para realizar el cambio
Uso de tres nuevos parámetros
PLSQL_CODE_TYPE: NATIVE | INTERPRETED.
PLSQL_DEBUG: TRUE | FALSE.
PLSQL_OPTIMIZE_LEVEL: 0 | 1 | 2.
PLSQL_COMPILER_FLAGS queda obsoleto.
Cambios en la compilación Nativa PL/SQLCambios en la compilación Nativa PL/SQL
15. Mejoras en Funciones de
Tablas
La proyección de la información pasada a
la función de tabla ayuda a procesar
únicamente los atributos requeridos
La integración con el optimizador genera
planes de ejecución más óptimos.
Soporte a tipos anónimos retornados
para funciones de tabla AnyDataSet.
Proporcionan beneficios en cuanto a
rendimiento.
16. Mejoras en Funciones de
Tablas
Oracle 10g permite a la función DESCRIBE
construir y devolver un tipo de datos
anónimo, mediante un interfaz ANYTYPE.
CREATE FUNCTION AnyDocuments (VARCHAR2)
RETURN ANYDATASET PIPELINED
USING DocumentMethods;
Soporte de Tipos AnónimosSoporte de Tipos Anónimos
Hinweis der Redaktion
Dicha funcionalidad está aún presente, pero no se han incorporado nuevas características, y deja de estar soportado por Oracle. Está presente únicamente para proporcionar compatibilidad hacia atrás durante la migración al optimizador de consultas (Optimizador basado en costes CBO). Debido a ello:
Las opciones CHOOSE y RULE del parámetro OPTIMIZER_MODE todavía existen, pero dejan de estar soportadas.
El valor por defecto del parámetro OPTIMIZER_MODE parameter es ALL_ROWS.
Los hints CHOOSE and RULE aún existen pero dejan de estar soportados.
El código basado en el RBO debe ser modificado para utilizar el optimizador de consultas (CBO).
SPREAD_MIN_ANALYSIS – Especifica las opciones de análisis de Hojas de Cálculo.
USE_NL_WITH_INDEX – Especifica una unión NESTED LOOP.
QB_NAME – Define un nombre para un bloque de consulta.
NO_QUERY_TRANSFORMATION – Impide que el optimizador realize una transformación de consultas.
NO_USE_NL, NO_USE_MERGE, NO_USE_HASH, NO_INDEX_FFS, NO_INDEX_SS ay NO_STAR_TRANSFORMATION – Excluyen operaciones específicas del plan de ejecución.
INDEX_SS, INDEX_SS_ASC, INDEX_SS_DESC – Excluyen búsquedas por rango del plan de ejecución.
Los Hints que especifican nombres de tabla han sido expandidos para aceptar Hints de tablas globales. Esto permite referenciar a una tabla base dentro de una vista mediante la sintaxis nombre_vista.nombre_tabla.
Los Hints que especifican nombres de vistas han sido expandidos para aceptar Hints de Indices Compuestos. Esto permite referenciar a un índice mediante la sintaxis nombre_table.nombre_indice.
Nueva cláusula VERSIONS en la cláusula FROM de sentencias SQL – devuelve todas las versiones de todas las filasque han existido alguna vez desde el momento de la ejecución de la consulta hasta los UNDO_RETENTION segundos antes del momento actual.
El parámetro UNDO_RETENTION es un parámetro de inicialización de la base de datos que especifica cuantos segundos de modificaciones deben almacenarse en la base de datos.
El resultado de una consulta de versionado se comporta como si la cláusula where se aplicara a todas las versiones de las filas.
La consulta de versionado devuelve versiones de las filas a través de las transacciones únicamente. La cláusula VERSIONS no tiene efecto en el comportamiento transaccional de la consulta. Esto significa que una consulta sobre una tabla con la cláusula VERSIONS todavía hereda el entorno de consulta de la transacción pendiente.
La consulta versionada recupera todas las versiones validadas de las filas seleccionadas. Los cambios realizados por las transacciones activas no se recuperan.
La consulta versionada devuelve todas las reencarnaciones de las filas. Esto significa que las versiones devueltas incluyen todas las filas borradas y posteriormente reinsertadas.
La cláusula VERSIONS no modifica el plan de ejecución de una consulta.
La cláusula VERSIONS puede especificarse como VERSIONS BETWEEN SCN |TIMESTAMP val_min AND val_max.
La cláusula VERSIONS es una extensión SQL únicamente para las consultas. Es posible utilizar dicha cláusula en DML pero dentro de subconsultas.
Start_Time/ SCN – Especifica el momento de creación de una versión. El valor es nulo si la versión fue creada antes del límite inferior del intervalo de tiempo.
End_Time/ SCN – Especifica el momento de expiración de una versión. El valor es NULL en los casos siguientes:
La versión está activa en el momento de ejecución de la sentencia.
Es una versión eliminada de la fila.
La columna versionada devuelve las versiones eliminadas de las filas, si existen. Esta versión eliminada se representa como la versión de la fila antes de ser borrada, y para ella la pseudocolumna VERSIONS_OPERATION devuelve el valor “D”.
Las pseudocolumnas incorporadas son las siguientes:
Versions_startscn – SCN de la creación de una versión de la fila.
Versions_starttime – Fecha y hora de creación de una versión de la fila.
Versions_endscn – SCN de expiración de una versión de la fila.
Versions_endtime – Fecha y hora de expiración de una versión de la fila.
Versions_xid – Identificador de transacción que creó la versión de la fila.
Versions_operation – Operación realizada por la transacción.
ORA_rowscn – fila SCN de la fila devuelta.
Se han añadido las siguientes funciones de conversión:
SCN_TO_TIMESTAMP – Función SQL que convierte un número SCN en su correspondiente TIMESTAMP.
TIMESTAMP_TO_SCN – Función SQL que convierte un TIMESTAMP en su correspondiente número SCN.
Con Oracle 10g, el rendimiento y los requisitos de espacio de LOBs temporales han sido enormemente mejorados mediante la incorporación de un nuevo mecanismo de referencia en lectura y copia en escritura. La idea es que no habrá una copia de valores de LOB tras una asignación. En cambio, para cada LOB, se utilizará un contador de referencias para mantener registrado el número de referencias al LOB temporal.
En los entornos soportados, es posible crear y manipular LOBs hasta un tamaño máximo dependiente de la configuración de la base de datos, en función del tamaño del bloque especificado por DB_BLOCK_SIZE. El tamaño máximo se calculará mediante la fórmula (4Gb-1)*DB_BLOCK_SIZE. Dado que los tamaños de bloque posible oscilan entre 2Kb y 32Kb, una columna LOB podrá almacenar entre 8 y 128 terabytes para cada fila en Oracle 10g.
Los LOBs sin límite de tamaño están soportados por todas las API en el paquete PL/SQL DBMS_LOB. La función DBMS_LOB.STORAGE_LIMIT devuelve el límite de almacenamiento para la base de datos actual. Las clases Oracle JDBC y la Oracle Call Interface API (OCI) también incluyen soporte a estos nuevos LOBs ilimitados.
La conversión de datos entre UNICODE y el juego de caracteres national NLS de la base de datos es cada vez más frecuente.
La conversión explícita entre CLOB y NCLOB ya estaba disponible en SQL mediante las funciones TO_CLOB y TO_NCLOB. Oracle 10g introduce la conversión implícita para variables SQL IN y OUT en consultas y en sentencias DML, así como en PL/SQL, tanto en la asignación de variables, como en parámetros de procedimientos y funciones.
La carga de datos desde BFILE externos a un campo LOB de la base de datos puede ocasionar problemas. Los datos pueden ser ilegibles debido al juego de caracteres o a restricciones de caracteres entre origen y destino. El nuevo procedimiento LOADFROMFILE2() ofrece funcionalidad mejorada para cargar texto en un campo CLOB o NCLOB. El procedimiento está disponible tanto en el paquete DBMS_LOB como en OCI.
Las nuevas funcionalidades de tablespaces transportables introducidas en Oracle 10g permiten transportar un tablespace a lo largo de bases de datos independientes en diferentes plataformas.
Oracle 10g tiene un nuevo compilador PL/SQL completamente rediseñado y reimplementado, incluyendo capacidades de optimización de código. Sustituye al viejo compilador, incorporando modernas técnicas de compilación.
Oracle 10g introduce una nueva funcionalidad que permite al compilador PL/SQL comunicar mensajes de aviso cuando no se cumplen los estándares de programación PL/SQL. Los avisos de compilación (Compiler Warnings) permiten a los desarrolladores evitar errores de codificación habituales para mejorar la productividad.
Por otro lado, en Oracle 10g las operaciones de enlaces masivos (BULK BINDINGS) has sido mejoradas para aumentar el rendimiento. Ahora es posible utilizar colecciones dispersas y arrays indexados en operaciones masivas.
Algunos de los cambios implícitos en la compilación de código son:
Eliminación de operadores temporales generados por el compilador PL/SQL. Dicha eliminación provoca menor almacenamiento y menos tiempo inicializando valores temporales.
El cálculo de determinadas operaciones durante la compilación, y no durante la ejecución.
Reutilización de valores de expresiones. Por ejemplo, si la expresión A + B se ejecuta dos veces y los valores de A y B no han variado, la segunda ejecución será eliminada por el optimizador.
Simplificación o eliminación de algunas ramas innecesarias.
Eliminación de llamadas a librerías mediante ejecución directa en la máquina virtual PL/SQL de algunas operaciones.
Eliminación de código inactivo (dead code).
Se han resuelto algunos problemas con PL/SQL, como que todos los cursores se cierran correctamente al salir de un bucle de cursor o de un bloque declarativo.
La eliminación de cálculos cuyo único efecto es provocar una excepción. Si no hay otros efectos colaterales de la expresión condicional, el optimizador PL/SQL elimina el cálculo entero.
Algunos de los cambios implícitos en la compilación de código son:
Todas las constantes enteras suficientemente pequeñas para ser representadas como PLS_INTEGER se representarán como tal, y no como un valor NUMBER.
Todas las operaciones aritméticas que combinen valores BINARY_INTEGER y PLS_INTEGER se ejecutarán con aritmética PLS_INTEGER.
La operación de división de PLS_INTEGER se realiza con aritmética PLS_INTEGER, no como NUMBER.
Cuando se active el modo DEBUG, la optimización quedará desactivada, y la generación de código será más lenta.
Las operaciones aritméticas para valores numéricos de coma flotante IEEE 754 es varias veces más rápida que para tipos de datos NUMBER. Particularmente, el producto de dos valores IEEE 754 puede llegar a ser de 5 a 10 veces más rápido que con valores NUMBER.
En Oracle 10g, el código compilado de forma nativa se ejecuta aún más rápido que en versiones anteriores.
La salida de la compilación nativa de PL/SQL se almacena ahora dentro de la base de datos como dato BLOB. Esto simplifica las copias de seguridad en un entorno de PL/SQL nativo. Los beneficios de rendimiento de la compilación nativa de PL/SQL están ahora disponibles en una configuración Real Application Cluster (RAC).
Es posible intercambiar entre la compilación nativa e intérprete de código para los bloques PL/SQL. Es posible depurar una unidad PL/SQL compilada de forma nativa y recompilarla con la información de depuración, obviando de forma temporal la compilación nativa. Tras finalizar el proceso de depuración, se debe recompilar el código de forma nativa.
Oracle 10g suministra tres nuevos parámetros para controlar diferentes aspectos de la compilación de PL/SQL:
PLSQL_DEBUG: controla la compilación en modo depuración.
PLSQL_CODE_TYPE: controla el método de compilación.
PLSQL_OPTIMIZE_LEVEL: controla el nivel de compilación.
El valor de cada parámetro se puede especificar de manera independiente, bien en los ficheros de parámetros de la base de datos, bien mediante sentencias ALTER SYSTEM o ALTER SESSION. Pueden tomar el valor NULL.
Oracle consulta dichos valores cada vez que ejecuta una sentencia CREATE OR REPLACE. Las vistas del diccionario USER|ALL|DBA_PLSQL_OBJECTS muestran los valores para los objetos PL/SQL.
El parámetro PLSQL_COMPILER_FLAGS queda obsoleto, y será eliminado en futuras versiones. Estos tres parámetros sustituyen su funcionalidad.
Las funciones de tabla son funciones que devuelven una colección de filas (tablas anidadas o VARRAY) que pueden ser consultadas como una tabla física de la base de datos.
Oracle 10g proporciona las siguientes mejoras al entorno de funciones de tabla PIPELINED:
La proyección de la información pasada a la función de tabla ayuda a procesar únicamente los atributos requeridos
La integración con el optimizador genera planes de ejecución más óptimos.
Soporte a tipos anónimos retornados para funciones de taba AnyDataSet.
Las mejoras incluyen una nueva llamad en tiempo de compilación: ODCITablePrepare, que puede ser utilizada para estudiar el contexto en tiempo de compilación, proporcionando información de proyecciones y soporte para tipos anónimos de retorno. Esta nueva llamada opcional es llamada por el servidor Oracle al final de la compilación de una consulta, y se utiliza para pasar información de la consulta e inicializar la búsqueda de contexto.
La información de proyección pasada a la función de tabla mejora el rendimiento, al procesar únicamente los atributos utilizados.
En versiones anteriores existía el soporte para funciones de tabla genéricas (AnyDataSet), que determinaban el tipo de salida únicamente en tiempo de compilación de la consulta, basándose en los argumentos pasados por la función.
Oracle 10g permite al método DESCRIBE construir y devolver tipos transitorios de datos anónimos, mediante el uso de interfaces ANYTYPE.
El ejemplo permite mostrar una función d etabla declarada para devolver una colección AnyDataSet cuya estructura no está definida en el momento de creación de la función.