Compartir vía


Rendimiento dinámico de SQL en ODBC

Aunque SQL estático funciona bien en muchas situaciones, hay una clase de aplicaciones en las que no se puede determinar el acceso a los datos de antemano. Por ejemplo, supongamos que una hoja de cálculo permite a un usuario escribir una consulta, que la hoja de cálculo envía a DBMS para recuperar datos. Obviamente, el programador no puede conocer el contenido de esta consulta cuando se escribe el programa de hoja de cálculo.

Ejecución dinámica

Para solucionar este problema, la hoja de cálculo usa una forma de SQL insertado denominada SQL dinámico. A diferencia de las instrucciones SQL estáticas, que están codificadas de forma rígida en el programa, las instrucciones SQL dinámicas se pueden compilar en tiempo de ejecución y colocarse en una variable de host de cadena. A continuación, se envían al DBMS para su procesamiento. Dado que DBMS debe generar un plan de acceso en tiempo de ejecución para instrucciones SQL dinámicas, SQL dinámico suele ser más lento que SQL estático. Cuando se compila un programa que contiene instrucciones SQL dinámicas, las instrucciones SQL dinámicas no se quitan del programa, como en SQL estático. En su lugar, se reemplazan por una llamada de función que pasa la instrucción a DBMS, las instrucciones SQL estáticas del mismo programa se tratan con normalidad.

La manera más sencilla de ejecutar una instrucción SQL dinámica es con una instrucción EXECUTE IMMEDIATE. Esta instrucción pasa la instrucción SQL a DBMS para la compilación y ejecución.

Una desventaja de la instrucción EXECUTE IMMEDIATE es que el DBMS debe pasar por cada uno de los cinco pasos de procesamiento de una instrucción SQL cada vez que se ejecuta la instrucción . La sobrecarga implicada en este proceso puede ser significativa si muchas instrucciones se ejecutan dinámicamente y es una pérdida de tiempo si esas instrucciones son similares.

Ejecución preparada

Para solucionar la situación anterior, SQL dinámico ofrece una forma optimizada de ejecución denominada ejecución preparada, que usa los pasos siguientes:

  1. El programa construye una instrucción SQL en un búfer, igual que para la instrucción EXECUTE IMMEDIATE. En lugar de las variables host, se puede sustituir un signo de interrogación (?) por una constante en cualquier parte del texto de la instrucción para indicar que se proporcionará un valor para la constante más adelante. Se llama al signo de interrogación como un marcador de parámetro.

  2. El programa pasa la instrucción SQL a DBMS con una instrucción PREPARE, que solicita que DBMS analice, valide y optimice la instrucción y genere un plan de ejecución para ella. A continuación, el programa usa una instrucción EXECUTE (no una instrucción EXECUTE IMMEDIATE) para ejecutar la instrucción PREPARE en un momento posterior. Pasa valores de parámetro para la instrucción a través de una estructura de datos especial denominada área de datos SQL o SQLDA.

  3. El programa puede usar la instrucción EXECUTE repetidamente, proporcionando valores de parámetro diferentes cada vez que se ejecuta la instrucción dinámica.

La ejecución preparada todavía no es la misma que SQL estático. En SQL estático, los cuatro primeros pasos de procesamiento de una instrucción SQL tienen lugar en tiempo de compilación. En la ejecución preparada, estos pasos siguen teniendo lugar en tiempo de ejecución, pero solo se realizan una vez. La ejecución del plan solo tiene lugar cuando se llama a EXECUTE. Este comportamiento ayuda a eliminar algunas de las desventajas de rendimiento inherentes a la arquitectura de SQL dinámico.

Consulte también

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)