Share via


Preparar instrucciones SQL

El motor relacional de SQL Server proporciona compatibilidad completa para preparar las instrucciones SQL antes de que se ejecuten. Si una aplicación necesita ejecutar una instrucción SQL varias veces, puede utilizar la API de bases de datos para lo siguiente:

  • Preparar la instrucción una vez. Esto compila la instrucción SQL en un plan de ejecución.

  • Ejecutar el plan de ejecución compilado previamente cada vez que necesite ejecutar la instrucción. Esto evita tener que volver a compilar la instrucción SQL después de la primera ejecución.

    Las funciones y los métodos de la API controlan la preparación y la ejecución de las instrucciones. No forma parte del lenguaje Transact-SQL. El modelo de preparación y ejecución para ejecutar instrucciones SQL es compatible con el proveedor OLE DB de Native Client de SQL Server y con el controlador ODBC de Native Client de SQL Server. En una solicitud de preparación, el proveedor o el controlador envía la instrucción a SQL Server con una solicitud para preparar la instrucción. SQL Server compila un plan de ejecución y devuelve un identificador para ese plan al proveedor o al controlador. En una solicitud de ejecución, el proveedor o el controlador envían al servidor una solicitud para ejecutar el plan asociado al identificador.

Las instrucciones preparadas no se pueden utilizar para crear objetos temporales en SQL Server. Las instrucciones preparadas no pueden hacer referencia a procedimientos almacenados del sistema que creen objetos temporales, como tablas temporales. Estos procedimientos se debe ejecutar directamente.

El uso excesivo del modelo de preparación y ejecución puede reducir el rendimiento. Si una instrucción sólo se ejecuta una vez, una ejecución directa sólo requiere un recorrido de ida y vuelta por la red al servidor. Preparar y ejecutar una instrucción SQL que sólo se ejecuta una vez requiere un recorrido de ida y vuelta adicional al servidor; uno para preparar la instrucción y otro para ejecutarla.

Preparar una instrucción es más eficaz si se utilizan marcadores de parámetros. Por ejemplo, suponga que se solicita ocasionalmente a una aplicación que recupere información de productos de la base de datos de ejemplo AdventureWorks. Hay dos maneras en que la aplicación puede llevarlo cabo.

En la primera, la aplicación puede ejecutar una consulta independiente para cada producto que se solicta:

SELECT * FROM AdventureWorks.Production.Product
WHERE ProductID = 63;

En la segunda, la aplicación hace lo siguiente:

  1. Prepara una instrucción que contiene un marcador de parámetros (?):

    SELECT * FROM AdventureWorks.Production.Product
    WHERE ProductID = ?;
    
  2. Enlaza una variable de programa al marcador de parámetros.

  3. Cada vez que se necesite información de productos, llena la variable enlazada con el valor de clave y ejecuta la instrucción.

La segunda forma es más eficaz cuando la instrucción se ejecuta más de tres veces.

En SQL Server, el modelo de preparación y ejecución no ofrece una clara ventaja de rendimiento con respecto a la ejecución directa, debido a la manera en que SQL Server vuelve a utilizar los planes de ejecución. SQL Server incluye algoritmos eficaces que permiten establecer coincidencias entre las instrucciones SQL actuales y los planes de ejecución generados en ejecuciones anteriores de la misma instrucción SQL. Si una aplicación ejecuta varias veces una instrucción SQL con marcadores de parámetros, SQL Server volverá a utilizar el plan de ejecución de la primera ejecución para la segunda ejecución, así como para las siguientes (a menos que el plan quede anticuado en la caché de procedimientos). El modelo de preparación y ejecución sigue teniendo estas ventajas:

  • Buscar un plan de ejecución mediante un identificador es más eficaz que los algoritmos que se utilizan para encontrar planes de ejecución existentes que coincidan con una instrucción SQL.

  • La aplicación puede controlar cuándo se crea el plan de ejecución y cuándo se vuelve a utilizar.

  • El modelo de preparación y ejecución se puede transportar a otras bases de datos, incluidas las versiones anteriores de SQL Server.