延迟名称解析和编译

创建存储过程时,要分析该过程中的语句以检查语法的准确性。如果在过程定义中遇到语法错误,将返回错误,并且将不创建该存储过程。如果该语句语法正确,存储过程的文本将存储在 sys.sql_modules 目录视图中。

在首次执行存储过程时,查询处理器从 sys.sql_modules 目录视图中读取存储过程的文本,并检查由过程使用的对象名称是否存在。这一过程称为延迟名称解析,因为存储过程引用的表对象不需要在创建该存储过程时就存在,而只需在执行该存储过程时存在。

注意注意

只有当引用的表对象不存在时才能使用延迟名称解析。所有其他对象在创建所存储的过程时必须存在。例如,引用所存储的过程中的一个现有表时,不能列出该表不存在的列。

在解析阶段,Microsoft SQL Server 还执行其他验证活动(例如,检查列数据类型与变量的兼容性)。如果执行存储过程时存储过程所引用的对象丢失,则存储过程在到达引用丢失对象的语句时将停止执行。在这种情况下,或在解析阶段发现其他错误时,将返回错误信息。

注意注意

如果删除或重命名了存储过程所引用的对象,则在执行该存储过程时会返回错误。但如果存储过程中引用的对象被同名的对象所替换,则无须重新创建即可执行该存储过程。例如,如果存储过程 Proc1 引用表 Test1,而 Test1 已经删除并创建了另一个不同的名为 Test1 的表,则 Proc1 引用新表。该存储过程不必重新创建。

如果执行过程时成功通过解析阶段,则 Microsoft SQL Server 查询优化器将分析存储过程中的 Transact-SQL 语句并创建一个执行计划。执行计划描述执行存储过程的最快方法,所依据的信息包括:

  • 表中的数据量。

  • 表的索引的存在及特征,以及数据在索引列中的分布。

  • WHERE 子句条件所使用的比较运算符和比较值。

  • 是否存在联接以及 UNION、GROUP BY 和 ORDER BY 关键字。

查询优化器在分析完存储过程中的这些因素后,将执行计划置于内存中。分析存储过程和创建执行计划的过程称为编译。优化的内存中的执行计划将用来执行该查询。执行计划将驻留在内存中,直到重新启动 SQL Server 或其他对象需要存储空间时为止。

如果随后执行了存储过程,而现有执行计划仍留在内存中,则 SQL Server 将重用现有执行计划。如果执行计划不再位于内存中,则创建新的执行计划。