Resolución diferida de nombres y compilación
Cuando se crea un procedimiento almacenado, se analizan sus instrucciones para asegurar la precisión sintáctica. Si se detecta un error sintáctico en la definición, se devuelve un error y no se crea el procedimiento almacenado. Si las instrucciones son correctas desde el punto de vista sintáctico, el texto del procedimiento se almacena en la vista de catálogo sys.sql_modules.
Cuando se ejecuta un procedimiento almacenado por primera vez, el procesador de consultas lee el texto correspondiente en la vista de catálogo sys.sql_modules y comprueba si están presentes los nombres de los objetos que utiliza el procedimiento. Este proceso se denomina resolución diferida de nombres porque los objetos de tabla a los que hace referencia el procedimiento almacenado no tienen por qué existir cuando se crea éste, sino sólo cuando se ejecuta.
[!NOTA] La resolución diferida de nombres sólo se puede utilizar cuando se hace referencia a objetos de tabla que no existen. Los demás objetos deben existir en el momento en que se crea el procedimiento almacenado. Por ejemplo, si hace referencia a una tabla existente en un procedimiento almacenado, no puede incluir columnas no existentes de la tabla.
En la etapa de resolución, Microsoft SQL Server 2005 también realiza otras actividades de validación (por ejemplo, comprueba la compatibilidad del tipo de datos de una columna con variables). Si los objetos a los que hace referencia el procedimiento almacenado no se encuentran durante la ejecución, el procedimiento almacenado se interrumpe cuando llega a la instrucción que hace referencia al objeto que falta. En este caso, o si se detectan otros errores en la etapa de resolución, se devuelve un error.
[!NOTA] Si se cambia el nombre de un objeto al que hace referencia un procedimiento almacenado, o bien se elimina, se devuelve un error cuando se ejecuta el procedimiento. No obstante, si un objeto al que se hace referencia en un procedimiento almacenado se reemplaza por un objeto con el mismo nombre, el procedimiento se ejecuta sin necesidad de volver a crearse. Por ejemplo, si el procedimiento almacenado Proc1 hace referencia a la tabla Test1, se elimina Test1 y se crea otra tabla con el nombre Test1, Proc1 hará referencia a la nueva tabla. No es necesario volver a crear el procedimiento almacenado.
Si la ejecución del procedimiento supera sin problemas la etapa de resolución, el optimizador de consultas de Microsoft SQL Server analiza las instrucciones Transact-SQL del procedimiento almacenado y crea un plan de ejecución. El plan de ejecución describe el método más rápido para ejecutar el procedimiento, a partir de información de este tipo:
- La cantidad de datos que hay en las tablas.
- La naturaleza y la presencia de índices en las tablas, así como la distribución de los datos en las columnas indizadas.
- Los operadores y los valores de comparación utilizados en las condiciones de las cláusulas WHERE.
- La presencia de combinaciones y de las palabras clave UNION, GROUP BY y ORDER BY.
Después de haber analizado estos factores en el procedimiento almacenado, el optimizador de consultas coloca el plan de ejecución en la memoria. El proceso consistente en analizar el procedimiento almacenado y crear un plan de consultas se denomina compilación. El plan de ejecución en memoria optimizado se utiliza para ejecutar la consulta. Este plan permanece en la memoria hasta que se reinicie SQL Server o hasta que se necesite espacio para el almacenamiento de otro objeto.
Cuando se ejecute posteriormente el procedimiento almacenado, SQL Server vuelve a utilizar el plan de ejecución existente si sigue en la memoria. Si el plan de ejecución ya no está en la memoria, se crea uno nuevo.
Vea también
Conceptos
Ejecutar procedimientos almacenados (motor de base de datos)
Crear procedimientos almacenados (motor de base de datos)
Crear procedimientos almacenados CLR
Modificar procedimientos almacenados
Volver a compilar procedimientos almacenados
Ver procedimientos almacenados
Eliminar procedimientos almacenados
Otros recursos
CREATE PROCEDURE (Transact-SQL)
sys.sql_modules (Transact-SQL)