2014-04-23 52 views
1

想象一下,一个名为dbo.TheBestCodedProcedure程序,如果是通过以下方式执行:何时创建多个执行计划?

EXEC dbo.TheBestCodedProcedure 

而且

EXEC TheBestCodedProcedure 

双方将成功执行,但有多少执行的创建计划?我的理解是,执行计划基于被调用的对象的名称和提供的参数。即使提供了相同的参数,我也看到了多个执行计划的例子,唯一的区别是dbo.前缀,这是真的还是不是?什么是什么时候什么规则创建一个额外的执行计划?

回答

2

您在问题中显示的两个陈述的唯一区别在于,您在一个陈述中使用了TWO PART NAME,即[Schema].[Object],而在其他语句中,您只使用对象名称来调用该过程。

这对存储过程的执行计划没有任何影响,但它确实会影响sql server如何找到此存储过程。

总是最好使用两个部分名称,因为它消除了解析模式的需要,并且为了执行此过程,sql服务器执行的工作量较少。

架构名称

在另一方面,如果你不,当你调用它的SQL服务器要经过几个步骤来查找存储的过程,它是一个存储过程使用两个部分名称如下。

  1. 它在当前数据库的sys模式中查找该过程。
  2. 如果它不能在sys架构中找到它,而不是它在Caller's Default Schema中查找它。
  3. 如果它不在那里,而是从外部调用过程的模式中看,如果从另一个过程中调用此过程。
  4. 如果找不到它,最终会寻找dbo模式中的过程。

正如您所看到的,在调用过程时只需添加模式名称就可以为sql server节省一些工作,因此在sql server中调用过程时最好使用模式名称。

执行计划

当我们在SQL Server中执行一个SQL查询时,SQL Server,以便成功地执行查询经过4个步骤。

  1. 解析语法。
  2. 转换为查询树。
  3. 创建一个执行计划。
  4. 执行。

在存储过程的情况下,只有在创建存储过程时才会执行前两个步骤。
当存储过程第一次执行时发生第三步。
并且最后第四步发生在每个后续执行中。

现在创建执行计划可能会有多种原因。其中一些是

  • 存储过程尚未执行一段时间,并且缓存中的 计划已从高速缓存存储器中清除。
  • 索引已被删除或添加到基础表。
  • 统计数据已更新。
  • 带重新编译选项的已执行存储过程。
+0

优秀的信息! –

+0

You'er welcome :) –

3

要回答你原来的问题,试试这个:

create procedure dbo.proc_test 
@i int 
as 
select @i 
go 

exec proc_test 1 
exec dbo.proc_test 2 
go 

select usecounts, text 
from sys.dm_exec_cached_plans 
cross apply sys.dm_exec_sql_text(plan_handle) 
where text like '%proc_test%' 
and text not like '%dm_exec_cached_plans%' 

只有一个缓存中的计划,你可以看到。

对于计划缓冲能力和可重用性的完整讨论,请在这里看到:

http://technet.microsoft.com/en-us/library/ee343986%28v=sql.100%29.aspx

IMO它太宽泛的主题在此处详细讨论。

+0

你的例子给出了一个缓存计划 –

+0

是的,它是我的观点。 – dean

+0

对不起,我没有注意到这个文字 –