任何机构都可以帮助我理解SQL服务器中缓存的函数的执行计划吗?

任何在线资源?

===============>>#1 票数:8 已采纳

是的,他们确实进入执行计划缓存。

sys.dm_exec_query_plan DMV将显示给定计划句柄的计划。 从那里引用:

各种类型的Transact-SQL批处理(例如临时批处理,存储过程和用户​​定义的函数)的查询计划缓存在称为计划缓存的内存区域中。 每个缓存的查询计划都由称为计划句柄的唯一标识符标识。 您可以使用sys.dm_exec_query_plan动态管理视图指定此计划句柄,以检索特定Transact-SQL查询或批处理的执行计划。

===============>>#2 票数:8

接受的答案是不准确/误导的,主要是由于引用的引用对于术语“用户定义的函数”而言过于模糊。

Microsoft SQL Server中有几种不同类型的用户定义函数,它们的处理方式不同:

  • 多语种TVF:

    这些被视为存储过程。 执行它们的查询仅显示对其名称的引用,而不显示其任何定义。 它们出现在sys.dm_exec_cached_plans ,其cacheobjtype为“编译计划”, objtype为“Proc”。 任何输入参数值也与计划一起存储,因此多语句TVF受到参数嗅探问题的影响。

  • 内联TVF(iTVF):

    这些被视为视图。 执行它们的查询包含它们的定义。 它们出现在sys.dm_exec_cached_plans ,其cacheobjtype为“Parse Tree”, objtype为“View”。 输入参数值存储的计划,因此,内联TVFs 不受参数嗅探问题。

  • 标量UDF:

    这些被视为存储过程。 执行它们的查询仅显示对其名称的引用,而不显示其任何定义。 它们出现在sys.dm_exec_cached_plans ,其cacheobjtype为“编译计划”, objtype为“Proc”。 任何输入参数值也与计划一起存储,因此标量UDF受参数嗅探问题的影响。 此外,与上面提到的两种类型的TVF不同,但与常规存储过程类似,当通过EXEC[UTE]而不是SELECTSET执行时,可以使用WITH RECOMPILE选项强制重新编译执行计划。

  • SQLCLR对象:

    这些被视为更像客户端/应用程序代码。 执行它们的查询仅显示对其名称的引用,而不显示其任何定义。 它们出现在sys.dm_exec_cached_plans ,其cacheobjtype为“CLR Compiled Func”或“CLR Compiled Proc”,以及objtype为“Proc”。 但是,与多语句TVF和标量UDF不同,它们没有定义,因此没有关联的查询计划。 但是,它们执行的任何特殊查询(而不是存储过程调用)都显示在sys.dm_exec_cached_plans ,其cacheobjtype为“已编译计划”, objtype为“已准备好”。 任何这些特殊查询,如果参数化,应该使用准备好的计划存储初始输入参数值,因此会受到参数嗅探问题的影响。

有关对象缓存的更多详细信息,请参阅缓存机制的MSDN页面。

===============>>#3 票数:2

是的,他们被认为是缓存。

http://msdn.microsoft.com/en-us/library/ms181055.aspx

  ask by Ashwani K translate from so

未解决问题?本站智能推荐:

1回复

创建函数时SQL Server中的Begin附近的语法不正确

我陷入了一个无法解决的小问题。 这给我一个错误- “开始附近的语法不正确”。 我无法确定为什么会出现错误。
4回复

具有表值函数的INNER JOIN不起作用

我有一个表值函数返回一个表。 当我尝试用另一个表JOIN表值函数时,我没有得到任何结果,但是当我将函数的结果复制到一个实际的表中并进行相同的连接时,我得到了预期的结果。 查询看起来像这样: 总而言之,我有大约4个这样的查询,每个查询都有不同的功能,但所有功能都产生相同的表,但数据
3回复

SQL Server sp_ExecuteSQL和执行计划

我有一个查询,它在SQL Server Management STudio中是超高速的,并且在sp_ExecuteSQL下运行时超级慢。 这是否与在spExecuteSQL下运行时未执行的执行计划的缓存有关?
5回复

SQL Server 2008执行计划问题

我有一个问题发给sql guru。 有两个表几乎相同的结构。 根据传入存储过程的参数,我需要从一个或另一个表中收集数据。 如何以最好的方式做到这一点? 请不要建议将这些表合并为一个表 - 这是不合适的。 我做了以下(MS SQL Server 2008):
1回复

SQL Server无法生成执行计划

我正在使用 Microsoft SQL Server 2016企业SP1:基于核心的许可(64位)版本13.0.4411.0 我有一个非常奇怪的问题,我不知道该如何解决。 我有一个(相当大的)查询,将100多个表连接在一起。 我写了一段时间原来的代码,并使用100多个表上的
2回复

从SQL Server的XML执行计划中提取数据

我的最终目标是从缓存的执行计划中自动提取所有引用的列。 这将有助于我们跟踪计划的SSRS报告集使用的所有列。 感兴趣的XML数据如下所示: 我想在表中存储数据库,模式,表,别名和列值。 但是,为了概念验证,我进行了一个简单的查询,并将完整执行计划的以下部分复制到下面的TSQ
1回复

合并多个表时的SQL Server执行计划

我有一个存储过程,发出与以下查询类似的查询(pseudo-tsql)。 多个ParentIds作为参数(csv)传递,解析并插入到表变量@i 。 对于每个传入的ParentId ,我们查找StorageTable并将其包含在@i 。 现在,根据StorageTable列的值,我们需要通
2回复

如何解决SQL Server - 基于参数的内联表值函数执行计划变化?

情况如下: 我有一个带有datetime参数的表值函数,例如tdf(p_date),它可以过滤大约200万行,选择列日期小于p_date的行,并计算其他列的某些聚合值。 它工作得很好,但是如果p_date是一个自定义标量值函数(在我的情况下返回结束日期),则执行计划会被更改,查询将从1秒
1回复

如何找出SQL Server执行计划中使用的中间值所代表的内容

我正在学习如何阅读SQL Server中的实际执行计划。 我注意到SQL Server倾向于表示物理查询计划中使用的中间值,例如expr1006 , expr1007等(即expr后跟一个数字)。 这是一个截图。 注意在底部附近,表达式expr1006, expr1008, expr1
2回复

基于WHERE值的不同SQL执行计划

我有一个稍微复杂的SQL视图,该视图根据传递给WHERE子句的值来执行不同的操作,我无法解释原因。 查询视图时,我有一个WHERE子句,它可以是两个值之一。 根据使用哪个值,查询以不同的速度返回。 要么 尽管返回的记录数有所不同,但我无法相信这会造成如此大的影响。 当我