Ube*_*en1 5 sql-server stored-procedures sql-server-2008-r2 dmv
我做的长时间运行的存储过程的一些分析和所遇到的异常的东西,根据网上图书sys.dm_exec_procedure_stats应该只显示一个每缓存的存储过程的计划行,但是有存储过程一个用户出现两次在表中。
此存储过程的两个“版本”具有截然不同的执行时间/计数。
这仅仅是因为缓存和使用了不同的计划吗?如果是这样,我没有意识到 sql server 为同一个 object_id 缓存了多个计划,我认为这是一种一对一的交易?另外,如果是这种情况,它似乎与 DMV 的 BOLS 定义相矛盾?
继此,如果是使用计划的两个版本,我怎么能知道在什么情况下使用什么样的计划?
其他人遇到过这个吗?
只是根据保罗的评论工作。联机丛书中的陈述与您的解释之间的主要区别:
它说:... 每个缓存的存储过程计划一行。
你读到:... 每个缓存存储过程一行。
您可以通过查看属性 DMV 的内容(按属性名称排序)来检查哪些计划属性不同,从而导致计划的不同副本。您应该至少看到一个属性,其中同一文本的两行在列中具有不同的值value。
SELECT t.[text], pa.attribute, pa.value
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
CROSS APPLY sys.dm_exec_plan_attributes(p.plan_handle) AS pa
WHERE LOWER(t.[text]) LIKE N'%create%procedure%procedure_name%'
AND LOWER(t.[text]) NOT LIKE N'%sys.dm%'
AND pa.is_cache_key = 1
ORDER BY t.[text], pa.attribute;
Run Code Online (Sandbox Code Playgroud)
通常,您会看到以下两个属性之一的差异:
set_options
这是由于在设置运行时的差异一样ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS,在下面的帖子等我说说这个:
user_id
这并不是真正运行查询的用户,而是由于两个不同的用户具有不同的默认架构(该值实际上是schema_id),并且其中至少一个正在调用没有架构前缀的存储过程(SQL Server 缓存不同的计划,因为搜索路径不同 - 它必须首先检查默认架构)。我在上面的帖子以及以下内容中谈到了这一点:
(另外,请确保您正在查看过程的总体计划,而不是存储过程中两个完全不同的语句的两个计划,例如WHERE p.objtype = N'Proc'。)