Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 确定SQLServer2005中最常用的存储过程变体的最快方法_Sql Server 2005_Tsql_Stored Procedures - Fatal编程技术网

Sql server 2005 确定SQLServer2005中最常用的存储过程变体的最快方法

Sql server 2005 确定SQLServer2005中最常用的存储过程变体的最快方法,sql-server-2005,tsql,stored-procedures,Sql Server 2005,Tsql,Stored Procedures,我正在尝试找出是否有一种方法可以识别被调用最多的SP的“版本”。我有一个SP,它使用一系列不同的参数进行调用。我知道SP导致了一些问题,并试图指出问题所在。除了捕获对SP的调用并手动筛选结果外,是否可以使用探查器按提供的参数对SP调用进行分组 我不是DB(a/E),只是一个web开发人员,所以任何正确方向的提示/要点都会很有帮助。谢谢 编辑:重新编译SP没有多大帮助。这将为您提供前50个最常用的进程和进程中的语句,如下所示: 访问该链接以获取仅针对proc名称的查询,但我认为这是一个更好的查询,

我正在尝试找出是否有一种方法可以识别被调用最多的SP的“版本”。我有一个SP,它使用一系列不同的参数进行调用。我知道SP导致了一些问题,并试图指出问题所在。除了捕获对SP的调用并手动筛选结果外,是否可以使用探查器按提供的参数对SP调用进行分组

我不是DB(a/E),只是一个web开发人员,所以任何正确方向的提示/要点都会很有帮助。谢谢


编辑:重新编译SP没有多大帮助。

这将为您提供前50个最常用的进程和进程中的语句,如下所示:


访问该链接以获取仅针对proc名称的查询,但我认为这是一个更好的查询,因为它还提供了proc中的语句

如果您知道是哪个SP导致了问题,您不能只记录从该SP中传递给它的参数吗?您可以设置一个包含参数列表的表,然后记录这些参数以及完成过程所需的时间,然后查询该表以查看哪些参数导致性能最差。

听起来您只需要在短时间内捕获这些信息。在这段时间内,可以多次调用存储过程,但这是一个有限的时间段

如果是这样,也许您可以将存储过程调用记录在某个地方?如果您可以控制存储过程代码,则可以在那里执行日志记录。一种方法是为此目的创建一个特殊表,在现有存储过程的开始或结束时向该表添加一个INSERT,然后等待一些记录在表中累积

根据具体情况,可以在自定义日志记录表中为每个存储过程参数创建一列

然后,在执行日志记录的时间段内,您将获得有关存储过程使用情况的大量信息

根据表中累积的数据,您可以查询以查找最常见的参数值、需要哪些用户、应用程序或网页等、存储过程调用开始和结束的日期时间,以及您记录的其他内容

这将不涉及对应用程序代码的任何更改,并且在完成故障排除后可以完全消除。因此,除了所有日志记录不可避免地影响性能之外,这种方法的价格并不高


编辑:对于缺乏在sys.dm_exec_query_stats等表上运行DMV查询所需的特殊权限的用户,这种方法是一种替代方法。在许多商店中,获得这样的权限——特别是在生产数据库上——对开发人员来说是不可行的。

我喜欢这段代码,它可以用来提取和查看执行统计数据。以及给定存储过程的缓存查询计划。在ManagementStudio中,您可以单击“查询计划”列中返回的XML以查看执行计划的图形版本

SELECT qp.*,qs.*,st.text
    FROM sys.dm_exec_query_stats qs 
        CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
        CROSS APPLY sys.dm_exec_query_plan(plan_handle) qp
    WHERE st.objectid= object_id('YourStoredProcedureName')

哦,聪明。我从未想过将定义加入到最常用的查询中。我肯定会尝试这样做。如何获取指定的数据库?我不认为这可能是重复的,因为在这种情况下,他们正在寻找同一存储过程的参数变化。另一个问题是最常调用的存储过程。在这里,我们知道哪些存储过程需要关注。问题在于各种参数。这需要一种不同的故障排除方法。是的,这肯定能奏效。当我问这个问题时,我主要考虑的是用SQL事件探查器捕获东西的方式。
SELECT qp.*,qs.*,st.text
    FROM sys.dm_exec_query_stats qs 
        CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
        CROSS APPLY sys.dm_exec_query_plan(plan_handle) qp
    WHERE st.objectid= object_id('YourStoredProcedureName')