【问题标题】:When are multiple Execution Plans created?何时创建多个执行计划?
【发布时间】:2014-04-23 18:30:47
【问题描述】:

想象一个名为dbo.TheBestCodedProcedure 的过程,如果它以下列方式执行:

EXEC dbo.TheBestCodedProcedure

还有

EXEC TheBestCodedProcedure

两者都将成功执行,但是创建了多少执行计划?据我了解,执行计划基于被调用对象的名称和提供的参数。即使提供了相同的参数,我也看到了多个执行计划的示例,唯一的区别是dbo. 前缀,这是真的还是假的? 何时创建附加执行计划的规则是什么?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

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

    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 话题太宽泛,无法在此详细讨论。

    【讨论】:

    • 你的例子给出了一个缓存计划
    • 对不起,我没有在文本中注意到这一点
    【解决方案2】:

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

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

    最好使用两部分名称,因为它消除了解析模式的需要,并且 sql server 执行此过程所需的工作更少。

    架构名称

    另一方面,如果您在调用存储过程时不使用两部分名称,则 sql server 必须经过几个步骤才能找到存储过程,如下所示。

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

    正如您所见,在调用过程时仅添加架构名称可以为 sql server 节省一些工作,因此在 sql server 中调用过程时使用架构名称始终是最佳实践。

    执行计划

    当我们在 Sql server 中执行 Sql Query 时,Sql Server 会经过 4 个步骤才能成功执行查询。

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

    在存储过程的情况下,前两个步骤仅在创建存储过程时发生。
    第三步发生在第一次执行存储过程时。
    最后,每次后续执行都会进行第 4 步。

    现在可以出于多种原因创建执行计划。其中一些是

    • 存储过程有一段时间没有执行,缓存的 计划已从缓存中刷新。
    • 索引已被删除或添加到基础表中。
    • 统计信息已更新。
    • 使用重新编译选项执行存储过程。

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2021-02-20
      • 2011-07-06
      • 2022-09-28
      • 2012-05-07
      相关资源
      最近更新 更多