Compartir a través de


Ejecución preparada

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

La API odbc define la ejecución preparada como una manera de reducir la sobrecarga de análisis y compilación asociada con la ejecución repetida de una instrucción Transact-SQL. La aplicación compila una cadena de caracteres que contiene una instrucción SQL y, a continuación, la ejecuta en dos fases. Llama a la función SQLPrepare una vez para que la instrucción se analice y compile en un plan de ejecución mediante el Motor de base de datos. A continuación, llama a SQLExecute para cada ejecución del plan de ejecución preparado. De esta forma, se guarda la sobrecarga de análisis y compilación en cada ejecución. Las aplicaciones suelen usar la ejecución preparada para ejecutar repetidamente una misma instrucción SQL parametrizada.

Para la mayoría de las bases de datos, la ejecución preparada es más rápida que la ejecución directa de instrucciones que se ejecutan más de tres o cuatro veces, principalmente porque la instrucción se compila solo una vez, mientras que las instrucciones ejecutadas directamente se compilan cada vez que se ejecutan. La ejecución preparada también puede proporcionar una reducción del tráfico de red porque el controlador puede enviar un identificador de plan de ejecución y los valores de los parámetros, en lugar de una instrucción SQL completa, al origen de datos cada vez que se ejecuta la instrucción.

SQL Server reduce la diferencia de rendimiento entre la ejecución directa y preparada mediante algoritmos mejorados para detectar y reutilizar planes de ejecución de SQLExecDirect. Estos algoritmos permiten disfrutar en las instrucciones que se ejecutan directamente de algunas de las ventajas de rendimiento de la ejecución preparada. Para obtener más información, consulte Ejecución directa.

SQL Server también proporciona compatibilidad nativa para la ejecución preparada. Un plan de ejecución se basa en SQLPrepare y se ejecuta más adelante cuando se llama a SQLExecute . Dado que SQL Server no es necesario para compilar procedimientos almacenados temporales en SQLPrepare, no hay ninguna sobrecarga adicional en las tablas del sistema en tempdb.

Por motivos de rendimiento, la preparación de la instrucción se aplaza hasta que se llama a SQLExecute o se realiza una operación de metapropiedad (como SQLDescribeCol o SQLDescribeParam en ODBC). Este es el comportamiento predeterminado. Cualquier error que se produzca en la instrucción que se está preparando no se dará a conocer hasta que la instrucción se ejecute o hasta que se realice una operación de metapropiedad. Establecer el atributo de instrucción específica del controlador ODBC de SQL Server Native Client SQL_SOPT_SS_DEFER_PREPARE en SQL_DP_OFF puede desactivar este comportamiento predeterminado.

En el caso de la preparación diferida, llamar a SQLDescribeCol o SQLDescribeParam antes de llamar a SQLExecute genera un recorrido de ida y vuelta adicional al servidor. En SQLDescribeCol, el controlador quita la cláusula WHERE de la consulta y la envía al servidor con SET FMTONLY ON para obtener la descripción de las columnas del primer conjunto de resultados devuelto por la consulta. En SQLDescribeParam, el controlador llama al servidor para obtener una descripción de las expresiones o columnas a las que hace referencia cualquier marcador de parámetro de la consulta. Este método tiene también algunas restricciones, como la imposibilidad de resolver parámetros en subconsultas.

El exceso de uso de SQLPrepare con el controlador ODBC de SQL Server Native Client degrada el rendimiento, especialmente cuando se conecta a versiones anteriores de SQL Server. La ejecución preparada no se debe utilizar para las instrucciones que se ejecutan una sola vez. La ejecución preparada es más lenta que la ejecución directa para una ejecución única de una instrucción porque requiere un ciclo de ida y vuelta de red adicional del cliente al servidor. En versiones anteriores de SQL Server, también genera un procedimiento almacenado temporal.

Las instrucciones preparadas no se pueden utilizar para crear objetos temporales en SQL Server.

Algunas aplicaciones ODBC iniciales usaron SQLPrepare en cualquier momento en que se usó SQLBindParameter . SQLBindParameter no requiere el uso de SQLPrepare, se puede usar con SQLExecDirect. Por ejemplo, use SQLExecDirect con SQLBindParameter para recuperar el código de retorno o los parámetros de salida de un procedimiento almacenado que solo se ejecuta una vez. No use SQLPrepare con SQLBindParameter a menos que la misma instrucción se ejecute varias veces.

Consulte también

Ejecución de instrucciones (ODBC)