Résolution de noms différée et compilation
Lors de la création d'une procédure stockée, ses instructions sont analysées afin de vérifier si la syntaxe est correcte. Si une erreur de syntaxe est détectée dans la définition de la procédure, une erreur est retournée et la procédure stockée n'est pas créée. Si la syntaxe des instructions est correcte, le texte de la procédure stockée est enregistré dans la vue de catalogue sys.sql_modules.
Lors de la première exécution d'une procédure stockée, le processeur de requêtes lit le texte de la procédure stockée à partir de l'affichage catalogue sys.sql_modules et vérifie que les noms des objets utilisés par la procédure sont présents. Ce processus s'appelle résolution de noms différée parce qu'il n'est pas nécessaire que les objets de table référencés par la procédure stockée existent lors de la création de cette dernière, mais seulement au moment de son exécution.
Remarque : |
---|
La résolution de noms différée est utilisable uniquement lorsque vous faites référence à des objets de table qui n'existent pas. Tous les autres objets doivent exister au moment de la création de la procédure stockée. Par exemple, lorsque vous faites référence à une table existante dans une procédure stockée, vous ne pouvez pas donner de colonne inexistante pour cette table. |
Pendant la phase de résolution, Microsoft SQL Server 2005 réalise aussi d'autres activités de validation, par exemple vérifier la compatibilité du type de données d'une colonne avec des variables. Si les objets référencés par la procédure stockée sont absents au moment de l'exécution, celle-ci est interrompue dès qu'elle rencontre l'instruction qui fait référence à un objet manquant. Dans ce cas, ou si d'autres erreurs sont détectées au cours de la phase de résolution, une erreur est retournée.
Remarque : |
---|
Si un objet référencé par une procédure stockée a été supprimé ou renommé, une erreur est retournée au moment de l'exécution de la procédure. Cependant, si un objet référencé dans une procédure stockée est remplacé par un objet du même nom, la procédure s'exécute sans qu'il soit nécessaire de la recréer. Par exemple, si la procédure stockée Proc1 référence la table Test1, et que Test1 est supprimée et qu'une autre table appelée Test1 est créée, Proc1 référence la nouvelle table. La procédure stockée n'a pas à être recréée. |
Si l'exécution de la procédure réussit la phase de résolution, l'optimiseur de requête de Microsoft SQL Server analyse les instructions Transact-SQL dans la procédure stockée et crée un plan d'exécution. Le plan d'exécution décrit la méthode la plus rapide permettant d'exécuter la procédure stockée, en se basant sur des informations telles que :
- le volume de données des tables ;
- la nature et la présence d'index sur les tables et la distribution des données dans les colonnes indexées ;
- les opérateurs et les valeurs de comparaison utilisés dans les conditions de la clause WHERE ;
- la présence éventuelle de jointures et de mots clés UNION, GROUP BY et ORDER BY.
Après avoir analysé tous ces facteurs dans la procédure stockée, l'optimiseur de requêtes place le plan d'exécution en mémoire. Le processus d'analyse de la procédure stockée et de création du plan d'exécution s'appelle la compilation. Le plan d'exécution optimisé résidant en mémoire est utilisé pour exécuter la requête. Le plan d'exécution reste en mémoire jusqu'à ce que SQL Server soit redémarré ou que de l'espace soit nécessaire pour stocker un autre objet.
Lorsque la procédure stockée est exécutée par la suite, SQL Server réutilise le plan d'exécution existant s'il réside encore en mémoire. S'il ne s'y trouve plus, un nouveau plan d'exécution est créé.
Voir aussi
Concepts
Exécution de procédures stockées (Moteur de base de données)
Création de procédures stockées (moteur de base de données)
Création de procédures stockées CLR
Modification des procédures stockées
Recompilation de procédures stockées
Affichage des procédures stockées
Suppression de procédures stockées
Autres ressources
CREATE PROCEDURE (Transact-SQL)
sys.sql_modules (Transact-SQL)