如果存储过程在缓存中没有条目,是否会认为它已编译?
Will a Stored Proc be consider compiled if it does not have an entry in cache?
我正在开发 SQL Server 2008 R2。
我有一个存储过程 Rpt_RegionReport
。它已经 运行 至少一次,所以我可以说它是 编译的 。它在缓存中有一个条目,我可以在 sys.dm_exec_cached_plans
.
中看到
现在,我使用 plan_handle
并调用 DBCC FREEPROCCACHE
并将其 plan_handle
传递给它,将其从缓存中删除。我确认缓存中没有条目了。
现在,
你认为这个存储过程仍然被认为是已编译,尽管它在缓存中没有条目吗?
或者
您是否认为此存储过程现在考虑 未编译 因为它在缓存中没有条目?
我想知道什么时候 SQL 服务器将存储过程视为 未编译 和 已编译 。
谢谢
如果计划缓存中没有条目,我会说 "not compiled"。下次调用应该需要解析编译。
需要说明的是,计划不会永远保存在缓存中。当 SQL 服务器服务重新启动时,当您调用 DBCC FREEPROCCACHE 时,如果系统需要添加更多计划并且在计划缓存中 运行 超出 space 时,缓存将被清除,它将开始删除一段时间未使用的旧计划。
编辑:
此外,这有助于澄清术语 "compiled",因为它与编译成 EXE 或 DLL 的 C#/C++/VB.NET/F# 不同。查看 sys.dm_exec_cached_plans 的 MSDN 页面。我们在这里谈论的是 "query plans",这些计划可以用于各种不同的对象类型,包括 Ad Hoc 查询。不要纠结于 FREEPROCCACHE
的名称,以为您真正在处理过程本身。 "FREEPROCCACHE" 中的术语 "PROC" 可能来自旧版本的 SQL 服务器(2000 或更早版本),当时缓存可能只包含存储过程的计划。
而且,由于您需要向您的经理解释这一点,因此应该指出 "query plan" 即 "compiled" 是 "how" SQL 服务器将执行查询。它是 JOIN 的类型,当某些事情完成时,例如执行函数和排序等。执行每个查询有很多很多方法,计划缓存允许 SQL 服务器可能跳过数量在尝试找到最佳方法时,通过重复使用上次得出的答案(无论是好答案还是坏答案),计算(即 "compile")这些变化所需的时间。
do you think this stored proc is still consider compiled although it
does not have an entry in cache?
AFAIK,只有当存储过程 运行 是第一次而不是在编译之后,您才会在 sys.dm_exec_cached_plans
中获得一个条目。此外,程序的编译是按需进行的。例如,如果您刚刚创建了过程,那么它可能还没有被编译,但是当您 运行 它第一次被编译并且编译的计划被缓存以供重新使用。
所以,不它不再编译了。 运行ning DBCC FREEPROCCACHE
将使优化器缓存在内存中的所有存储过程计划无效,并强制 SQL Server
编译并在下次这些过程 运行 时生成新计划。 运行 它会重新生成并缓存计划。
如果您想生成一个新计划并且不想重复使用缓存的计划,您可以在过程主体中使用 WITH RECOMPILE
选项。
我正在开发 SQL Server 2008 R2。
我有一个存储过程 Rpt_RegionReport
。它已经 运行 至少一次,所以我可以说它是 编译的 。它在缓存中有一个条目,我可以在 sys.dm_exec_cached_plans
.
现在,我使用 plan_handle
并调用 DBCC FREEPROCCACHE
并将其 plan_handle
传递给它,将其从缓存中删除。我确认缓存中没有条目了。
现在,
你认为这个存储过程仍然被认为是已编译,尽管它在缓存中没有条目吗?
或者
您是否认为此存储过程现在考虑 未编译 因为它在缓存中没有条目?
我想知道什么时候 SQL 服务器将存储过程视为 未编译 和 已编译 。
谢谢
如果计划缓存中没有条目,我会说 "not compiled"。下次调用应该需要解析编译。
需要说明的是,计划不会永远保存在缓存中。当 SQL 服务器服务重新启动时,当您调用 DBCC FREEPROCCACHE 时,如果系统需要添加更多计划并且在计划缓存中 运行 超出 space 时,缓存将被清除,它将开始删除一段时间未使用的旧计划。
编辑:
此外,这有助于澄清术语 "compiled",因为它与编译成 EXE 或 DLL 的 C#/C++/VB.NET/F# 不同。查看 sys.dm_exec_cached_plans 的 MSDN 页面。我们在这里谈论的是 "query plans",这些计划可以用于各种不同的对象类型,包括 Ad Hoc 查询。不要纠结于 FREEPROCCACHE
的名称,以为您真正在处理过程本身。 "FREEPROCCACHE" 中的术语 "PROC" 可能来自旧版本的 SQL 服务器(2000 或更早版本),当时缓存可能只包含存储过程的计划。
而且,由于您需要向您的经理解释这一点,因此应该指出 "query plan" 即 "compiled" 是 "how" SQL 服务器将执行查询。它是 JOIN 的类型,当某些事情完成时,例如执行函数和排序等。执行每个查询有很多很多方法,计划缓存允许 SQL 服务器可能跳过数量在尝试找到最佳方法时,通过重复使用上次得出的答案(无论是好答案还是坏答案),计算(即 "compile")这些变化所需的时间。
do you think this stored proc is still consider compiled although it does not have an entry in cache?
AFAIK,只有当存储过程 运行 是第一次而不是在编译之后,您才会在 sys.dm_exec_cached_plans
中获得一个条目。此外,程序的编译是按需进行的。例如,如果您刚刚创建了过程,那么它可能还没有被编译,但是当您 运行 它第一次被编译并且编译的计划被缓存以供重新使用。
所以,不它不再编译了。 运行ning DBCC FREEPROCCACHE
将使优化器缓存在内存中的所有存储过程计划无效,并强制 SQL Server
编译并在下次这些过程 运行 时生成新计划。 运行 它会重新生成并缓存计划。
如果您想生成一个新计划并且不想重复使用缓存的计划,您可以在过程主体中使用 WITH RECOMPILE
选项。