Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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 存储过程跟踪_Sql Server_Stored Procedures_Database Administration - Fatal编程技术网

Sql server 存储过程跟踪

Sql server 存储过程跟踪,sql-server,stored-procedures,database-administration,Sql Server,Stored Procedures,Database Administration,我在数据库上设置了一个存储过程跟踪表,希望用它来清除我们不再使用的过程。我在几个月前建立了这个系统,现在我已经准备好可以开始清理了。这些表使用SQL Server 2008 R2中的sys.procedures和sys.dm_exec_procedures_statsDMV,作业每天24小时每10分钟更新一次静态表 我一直在检查我的程序列表,并且遇到了一对我知道是事实的夫妇,他们最近正在运行。我发现的特定程序作为作业的步骤2运行,但是sys.dm_exec_procedure_stats似乎不包

我在数据库上设置了一个存储过程跟踪表,希望用它来清除我们不再使用的过程。我在几个月前建立了这个系统,现在我已经准备好可以开始清理了。这些表使用SQL Server 2008 R2中的
sys.procedures
sys.dm_exec_procedures_stats
DMV,作业每天24小时每10分钟更新一次静态表

我一直在检查我的程序列表,并且遇到了一对我知道是事实的夫妇,他们最近正在运行。我发现的特定程序作为作业的步骤2运行,但是
sys.dm_exec_procedure_stats
似乎不包含任何已运行的记录,但是步骤1中的程序在正确的时间出现。我已经检查了作业历史记录,步骤1和步骤2都没有出现任何问题

我能看到的唯一区别是,步骤2中的过程出现了“警告:通过聚合或其他集合操作消除空值”,而步骤一没有。这是否会对该过程是否会出现在
sys.dm_exec_procedure_stats
中产生影响


希望有人能帮忙

虽然它没有出现在DMV中的原因可能是@bastos.sergio在对该问题的评论中提到的链接/相关答案中指定的原因,但仍然存在“如何找到未使用的程序?”的问题

该链接问题(这是@bastos.sergio:引用的问题)中的公认答案缺少某些内容,因此我将在此处补充:

知道它叫什么的唯一方法是:

  • 扫描所有代码(应用程序代码、其他存储的过程、作业步骤[在msdb.dbo.sysjobsteps中]、SSRS报告定义文件等)以查找引用
  • 如果您允许临时访问(例如,有人引用了access应用程序[或任何Microsoft Office“应用程序”)中的存储过程),则您需要执行该链接问题的公认答案中提到的一些附加步骤,即:
    • 添加一个
      RAISERROR(不推荐!请联系您的姓名',16,1);返回在程序的顶部,并将其保留一两个月
    • 在任何假定的过时代码的顶部添加一个表来记录proc调用,并在该日志表中插入一个INSERT,每周检查一次以查看是否有任何显示。如果还执行RAISERROR,则将插入放在
      RAISERROR(…)之前;返回
    • 关于临时访问(即,在您控制的代码之外的访问),请务必记住,不频繁的访问可能就是:不频繁的。如果有一个代码路径是每月、每季度、每两年、每年执行一次的,当一些经理记得要求这样或那样的报告时,等等,那么如果您不允许足够长的时间来捕获“高度”不频繁的使用,那么您可能会删除有效的代码(这就是为什么,即使车管所的数据更可靠,你仍然需要同样谨慎)
    • 同样,如果所有访问都在您控制的代码内,只需扫描您的代码(很可能使用正则表达式)
编辑:
回答以下具体问题:

“警告:通过聚合或其他集合操作消除空值”警告在DMV中未显示的存储过程中运行的查询与DMV中未显示的原因有关吗

执行以下测试:

CREATE PROCEDURE #NoWarning
AS
 SELECT AVG(tmp.col)
 FROM (
    SELECT 1.0
    UNION ALL
    SELECT 2
    ) tmp(col);
GO

EXEC #NoWarning;
GO

CREATE PROCEDURE #Warning
AS
 SELECT AVG(tmp.col)
 FROM (
    SELECT 1.0
    UNION ALL
    SELECT null
    ) tmp(col);
GO

EXEC #Warning;
然后运行以下查询,您应该会在“tempdb”中看到两个进程名:


重复的我不认为这是一个重复的问题,因为另一个问题是如何跟踪,而我已经在跟踪。我的问题是sys.dm_exec_procedure_stats表中没有出现一个过程,以及它是否与空警告有关。谢谢所有代码都是通过作业或报告Se运行的服务。大多数过程都会进入表中,那些不是的我已经签出,它们不再运行,所以我对此很满意。我知道有问题的过程每周运行一次,但没有出现在表中。有可能代码一完成就从缓存中删除吗?@ChrisUpton:是的,这是可能的。我高度怀疑ANSI警告是否会阻止它首先被记录。您是否通过运行SQL作业并立即检查SSMS来进行测试,以查看它是否在DMV中?它可能只在DMV中停留几秒钟?我已经手动运行了代码,并且它似乎根本没有注册-即使它一经注册就没有注册已执行!。是否将缓存记录在一个单独的数据库中,而不是运行该过程的数据库中?!@ChrisUpton:该DMV是服务器范围的,并且具有
[database\u id]
字段,因此您所处的数据库并不重要。匹配对象所在位置的数据库id和对象id,而不是执行时的当前数据库上下文。@ChrisUpton:我刚刚测试并确认否,该警告不会阻止进程进入缓存。我将用测试代码更新我的答案。
SELECT  DB_NAME(ps.database_id) AS [DatabaseName],
        OBJECT_NAME(ps.[object_id], ps.database_id) AS [ProcName],
        *
FROM sys.dm_exec_procedure_stats ps
ORDER BY [DatabaseName], [ProcName];