您在问题中显示的两个陈述的唯一区别在于,您在一个陈述中使用了TWO PART NAME
,即[Schema].[Object]
,而在其他语句中,您只使用对象名称来调用该过程。
这对存储过程的执行计划没有任何影响,但它确实会影响sql server如何找到此存储过程。
总是最好使用两个部分名称,因为它消除了解析模式的需要,并且为了执行此过程,sql服务器执行的工作量较少。
架构名称
在另一方面,如果你不,当你调用它的SQL服务器要经过几个步骤来查找存储的过程,它是一个存储过程使用两个部分名称如下。
- 它在当前数据库的
sys
模式中查找该过程。
- 如果它不能在sys架构中找到它,而不是它在
Caller's Default Schema
中查找它。
- 如果它不在那里,而是从外部调用过程的模式中看,如果从另一个过程中调用此过程。
- 如果找不到它,最终会寻找
dbo
模式中的过程。
正如您所看到的,在调用过程时只需添加模式名称就可以为sql server节省一些工作,因此在sql server中调用过程时最好使用模式名称。
执行计划
当我们在SQL Server中执行一个SQL查询时,SQL Server,以便成功地执行查询经过4个步骤。
- 解析语法。
- 转换为查询树。
- 创建一个执行计划。
- 执行。
在存储过程的情况下,只有在创建存储过程时才会执行前两个步骤。
当存储过程第一次执行时发生第三步。
并且最后第四步发生在每个后续执行中。
现在创建执行计划可能会有多种原因。其中一些是
- 存储过程尚未执行一段时间,并且缓存中的 计划已从高速缓存存储器中清除。
- 索引已被删除或添加到基础表。
- 统计数据已更新。
- 带重新编译选项的已执行存储过程。
优秀的信息! –
You'er welcome :) –