17 de agosto de 2012.Hace ya varios años tuve la oportunidad de participar en un importante proyecto de BusinessIntelligence en IBERIA LAE, ahora llamada IAG, utilizando tecnología Oracle. Recuerdo que unaconsulta aparentemente sencilla consumía demasiados recursos de máquina y tardaba muchotiempo en ejecutarse, más de lo razonable. Un colaborador de Oracle nos ofreció una solución quepor aquel entonces me impresionó mucho, y logró reducir el tiempo al orden de minutos, lo que antes se contaba por horas.Algunas versiones nuevas de Oracle han salido desde entonces, cambiando enormemente latecnología, y dotando al sistema de nuevas técnicas para mejorar el rendimiento de las consultas,pero lo esencial que subyace al problema no ha cambiado sustancialmente.Empecemos por indicar que el tipo de consulta utilizada era una consulta correlacionada. Este tipode consultas eran y siguen siendo muy costosas en tiempo y hacen un consumo intensivo de losrecursos de máquina disponibles ya que se debe ejecutar una consulta para cada registrorecuperado de otra consulta. Ni qué decir tiene que cuanto mayor es el volumen de estas tablas, más costosa es la consulta, y no es precisamente una relación lineal. Y las tablas que teníamos quegestionar tenían muchos, muchos registros. No es recomendable el uso de este tipo de consultas y,siempre que sea posible, se deberían evitar.No es propósito comentar qué es una consulta correlacionada. En internet hay muchísimos artículostécnicos que hablan sobre ello, por lo que supondré a partir de ahora que el lector sabe de quéhablamos.La solución aportada para mejorar el rendimiento era la utilización de SQL dinámico. BásicamenteSQL dinámico consiste en la construcción en una cadena de caracteres en tiempo de ejecución deuna consulta SQL. Para esta construcción se puede utilizar toda la capacidad de PL/SQL, incluidolos cursores y parámetros en la consulta, implementados a través de variables host.Tampoco es propósito aquí comentar qué es SQL dinámico, o mejor, "construcción dinámica deconsultas SQL", internet también está lleno de artículos técnicos que hablan del tema, simplementecomentar que frecuentemente se indica que el motivo principal para utilizar SQL dinámico es porqueen tiempo de ejecución no se conoce con exactitud la consulta SQL deseada. Pero también se puede utilizar para mejorar el rendimiento, como ha sido nuestro caso.Pero ¡ojo!, SQL dinámico no supone "per sé" una mejora en el rendimiento, hay que aplicar técnicasespecíficas para lograrlo.El truco aquí consiste en conocer algunos de los pasos que Oracle hace para ejecutar una consulta.Veamos:1.Un análisis sintáctico, en el que se determina si la consulta contiene la palabras claveadecuadas, como SELECT, FROM, WHERE ... etc.2.Un análisis semántico, en el que se accede a las tablas del diccionario para comprobar que elresto de la consulta está bien construida, es decir, que existen las tablas indicadas, que existenlos campos indicados y que éstos corresponden a las tablas que aparecen en la consulta, nohay ambigüedades, etc.3.La creación de un árbol de posibles planes de ejecución, cada uno de ellos con su costeasociado.4.La generación del plan de ejecución con el menor coste calculado.5.Enlazar el plan de ejecución elegido con los elementos físicos de la base de datos:tablespaces, datafiles, redologs, etc.6.Ejecución de la consulta y extracción de las filas.Como podemos ver el trabajo que subyace en la ejecución de una consulta es bastante grande, aesto se le llama la fase de "parse" (en inglés viene a ser algo así como analizar o redistribuir). Anosotros nos parece que lanzar una consulta no es gran cosa porque en la mayoría de los casosenviamos la consulta al motor de base de dato y en muy pocos segundos tenemos la respuesta, pero las operaciones que tiene que realizar el motor de base de datos pueden ser muy costosas enconsumo de recursos de máquina.En el caso de las consultas correlacionadas se tiene que ejecutar, para cada registro recuperado dela consulta más externa, una nueva consulta. Y en realidad para el motor de base de datos es unanueva consulta porque cambia un contenido, que es precismente el valor que corresponda delregistro en curso de la consulta exterior. Y todo esto con el coste que conlleva. Y sí, en determinadas circunstancias hay consultas o requerimientos funcionales que van a necesitar incluso millones de operaciones parse para el mismo tipo de consultas, ya sea por consultascorrelacionadas o mediante procedimientos PL/SQL, con lo que la penalización del rendimiento va aser en muchos casos intolerable.La idea para mejorar el rendimiento consiste en evitarnos todas las operaciones "parse" de laconsulta interior. Para ello la consulta correlacionada de implementa en un procedimiento PL/SQL através de cursores y se utilizará el paquete dbms_sql, que proporciona una interfaz para el suso deSQL dinámico. No voy a explicar aquí el uso de dbms_sql, ni "Native Dynamic SQL" como alternativa a ese paquete,Ni tampoco voy a exponer largas cantidades de código, quien esté interesado ya sabe, Internet.Simplemente comentar que la técnica básica es generar en un string la consulta interna, los datos del registro en curso de la consultaexterna se implementan mediante variables host. Se realiza el "parse", ¡una sola vez! mediante dbms_sql.parse y se enlazan las variablesmediante dbms_sql.bind_variable. La ejecución de la consulta se realiza mediante dbms_sql.execute.Con esto la mejora del rendimiento es sustancial. Existen otras técnicas pero la indicada aquí es todavía viable y muy usada (por quien laconozca, claro).SQL dinámco proporciona herramientas que nos ayudan a hacer un trabajo que realmente aporte valor. Sin embargo en el mundo de lainformática abundan ejemplos de utilización de SQL dinámico simplemente para generaruna consulta y ejecutarla, sin dotar al sistema del más mínimo valor añadido. Por esto, a mi me gusta pensar queSQL dinámico, el cual aportarealmente valor, no es lo mismo que"generación dinámica de consultasSQL". Hay una sutil diferencia,quien lo quiera entender, pues bien,y si no, también.Por último, recomendar un par delibros que seguro serán de granayuda.Proyecto de expresión y espacio para la tecnología, cultura, empresa, estética y humanidades en generalInformación legalOracle con SQL dinámico como método para mejorar el rendimiento