【问题标题】:when is execution plans in SQL Server generated?SQL Server 中的执行计划是什么时候生成的?
【发布时间】:2011-02-23 07:48:21
【问题描述】:

在 SQL Server 的存储过程中,何时生成实际的 SQL 查询计划?第一次运行 SQL 时或编译存储过程时?知道与 Oracle 相比,查询计划的生成成本有多高吗?

【问题讨论】:

    标签: sql-server sql-execution-plan


    【解决方案1】:

    运行查询时,SQL Server 将检查执行计划缓存中是否已存在该查询的执行计划。如果找到,它可以重用该执行计划。如果在缓存中没有找到,它会生成一个计划,将缓存放入缓存中以供后续调用以重用,然后执行查询。因此它在执行查询时执行此操作。

    计划在缓存中保留多长时间取决于多种因素,包括:
    - 该计划的使用频率
    - 该计划提供多少“价值”
    - 服务器内存压力

    因此,一个给定的查询可能会在给定的时间段内多次生成一个执行计划,如果它的计划没有设法留在缓存中。此外,当 SQL Server 重新启动时,缓存会被清除。

    Execution Plan Caching and Reuse 上有一篇很好的 MSDN 文章

    【讨论】:

    • 那很好,但是您可以按照 OP 的要求扩展存储过程(不是随机 tsql 查询)吗?
    • @astander - 通过“查询”,我将临时 tsql 语句/参数化 tsql 语句/存储过程都包括在内 - 我觉得这里没有任何区别
    • 我认为你应该这样做。存储过程不同于即席查询。保存的执行计划/强制重新编译/参数嗅探只是提到了我脑海中的一些......
    • 如果我理解正确的话,你编译存储过程时没有生成执行计划?只有当你实际运行存储过程时,才会为过程内部运行的 SQL 生成查询计划?
    • @KTrum - 当您创建存储过程时,它不会编译它(“编译”在这里可能是一个误导性术语,不要从例如 .NET 的意义上思考)并且没有执行计划在那个时候生成。所以是的,只有在执行时才会生成计划。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多