Preparar comandos en SQL Server Native Client
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
El proveedor OLE DB de SQL Server Native Client admite la preparación de comandos para optimizar varias ejecuciones de un solo comando; Sin embargo, la preparación del comando genera sobrecarga y un consumidor no necesita preparar un comando para ejecutarlo más de una vez. En general, un comando debería prepararse si va a ejecutarse más de tres veces.
Por razones de rendimiento, la preparación del comando se difiere hasta que se ejecuta el comando. Este es el comportamiento predeterminado. Cualquier error que se produzca en el comando que se está preparando no se dará a conocer hasta que el comando se ejecute o hasta que se realice una operación de metapropiedad. Establecer la propiedad SSPROP_DEFERPREPARE de SQL Server en FALSE puede desactivar este comportamiento predeterminado.
En SQL Server, cuando un comando se ejecuta directamente (sin prepararlo antes), se crea un plan de ejecución y se almacena en la memoria caché. Si vuelve a ejecutarse la instrucción SQL, SQL Server dispone de un algoritmo eficaz para hacer coincidir la nueva instrucción con el plan de ejecución existente en la memoria caché, y reutiliza el plan de ejecución para esa instrucción.
En el caso de los comandos preparados, SQL Server proporciona compatibilidad nativa para preparar y ejecutar instrucciones de comandos. Cuando se prepara una instrucción, SQL Server crea un plan de ejecución, lo almacena en la memoria caché y devuelve un identificador a este plan de ejecución al proveedor. A continuación, el proveedor utiliza este identificador para ejecutar repetidamente la instrucción. No se crea ningún procedimiento almacenado. Dado que el identificador identifica directamente el plan de ejecución de una instrucción SQL en lugar de hacer coincidir la instrucción con el plan de ejecución en la memoria caché (como es el caso de la ejecución directa), es más eficaz preparar una instrucción que ejecutarla directamente, si sabe que la instrucción se ejecutará más de unas pocas veces.
En SQL Server 2005 (9.x), las instrucciones preparadas no pueden utilizarse para crear objetos temporales ni pueden hacer referencia a procedimientos almacenados del sistema que crean objetos temporales, como tablas temporales. Estos procedimientos deben ejecutarse directamente.
Algunos comandos no deberían prepararse nunca. Por ejemplo, no deberían prepararse nunca los comandos que especifican la ejecución de procedimientos almacenados o los comandos que incluyen texto que no es válido para la creación de procedimientos almacenados de SQL Server.
Si se crea un procedimiento almacenado temporal, el proveedor OLE DB de SQL Server Native Client ejecuta el procedimiento almacenado temporal, devolviendo resultados como si se ejecutara la propia instrucción.
La creación de procedimientos almacenados temporales se controla mediante la propiedad de inicialización específica del proveedor OLE DB de SQL Server Native Client SSPROP_INIT_USEPROCFORPREP. Si el valor de la propiedad es SSPROPVAL_USEPROCFORPREP_ON o SSPROPVAL_USEPROCFORPREP_ON_DROP, el proveedor OLE DB de SQL Server Native Client intenta crear un procedimiento almacenado cuando se prepara un comando. La creación del procedimiento almacenado se realiza correctamente si el usuario de la aplicación tiene suficientes permisos de SQL Server.
En el caso de los consumidores que se desconectan con poca frecuencia, la creación de procedimientos almacenados temporales puede requerir recursos significativos de tempdb, la base de datos del sistema de SQL Server en la que se crean los objetos temporales. Cuando el valor de SSPROP_INIT_USEPROCFORPREP está SSPROPVAL_USEPROCFORPREP_ ON, los procedimientos almacenados temporales creados por el proveedor OLE DB de SQL Server Native Client solo se quitan cuando la sesión que creó el comando pierde su conexión a la instancia de SQL Server. Si esa conexión es la conexión predeterminada creada durante la inicialización del origen de datos, el procedimiento almacenado temporal solamente se quita cuando se cancela la inicialización del origen de datos.
Cuando se SSPROPVAL_USEPROCFORPREP_ON_DROP el valor de SSPROP_INIT_USEPROCFORPREP, los procedimientos almacenados temporales del proveedor OLE DB de SQL Server Native Client se quitan cuando se produce una de las siguientes acciones:
El consumidor usa ICommandText::SetCommandText para indicar un nuevo comando.
El consumidor usa ICommandPrepare::Unprepare para indicar que ya no requiere el texto del comando.
El consumidor libera todas las referencias al objeto de comando utilizando el procedimiento almacenado temporal.
Un objeto de comando tiene a lo sumo un procedimiento almacenado temporal en tempdb. Cualquier procedimiento almacenado temporal existente representa el texto de comando actual de un objeto de comando concreto.