存储过程跟踪

时间:2014-09-03 14:17:30

标签: sql-server stored-procedures database-administration

我已经在我们的数据库上设置了一个存储过程跟踪器表,希望使用它来清除我们不再使用的过程。我几个月前就开始这样做了,现在我已经准备好开始清洁了。这些表使用SQL Server 2008 R2中的sys.proceduressys.dm_exec_procedure_stats DMV,并且作业每10小时,每天24小时更新静态表

我一直在检查我的程序清单,并且遇到了一些我知道的事实已经运行的事情。我找到的特定一个作为作业的第2步运行,但sys.dm_exec_procedure_stats似乎不包含已运行的任何记录,但步骤1中的过程已在正确的时间出现。我已经检查了工作历史,第1步和第2步都没有遇到任何问题。

我能看到的唯一区别是步骤2中的过程出现了一个"警告:Null值被聚合或其他SET操作消除了#34;而第一步没有。这是否会影响该程序是否会出现在sys.dm_exec_procedure_stats

希望有人可以提供帮助!

1 个答案:

答案 0 :(得分:0)

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

该链接问题中接受的答案(这是@ bastos.sergio引用的问题:Last Run Date on a Stored Procedure in SQL Server)遗漏了一些内容,所以我将在此处添加:

ONLY 了解调用内容的方法是:

  • 扫描所有代码(应用代码,其他存储过程,作业步骤[在msdb.dbo.sysjobsteps中],SSRS报告定义文件等)以供参考
  • 如果您允许临时访问(例如某人在Access应用程序[或任何Microsoft Office“应用程序”]中引用了存储过程),那么您需要执行部分中提到的其他步骤接受了该相关问题的答案,即:
    • 在过程顶部添加RAISERROR(N'Deprecated! Please contact YourName.', 16, 1); RETURN;并将其保留一两个月。
    • 添加一个表来记录proc调用和INSERT到任何假定过时代码顶部的日志表中,并每周检查一次以查看是否有任何显示。如果还要执行RAISERROR,请将INSERT置于RAISERROR(...); RETURN;
    • 之前
    • 关于临时访问(即在您控制的代码之外访问),请注意始终牢记不经常访问可能只是:不经常访问。如果有一个代码路径每月,每季度,每两年,每年执行一次,当某个经理记得要求提供此类报告等时,如果您不允许足够长的话,您可能会删除有效的代码捕捉“高度”不常使用的时间框架(这就是为什么,即使DMV数据更可靠,你仍然需要同样谨慎)。
    • 同样,如果所有访问都在您控制的代码中,则只需扫描您的代码(最有可能使用正则表达式)。

修改
回答以下具体问题:

  

“警告:Null值是否被聚合或其他SET操作消除”警告:在存储过程中运行但未显示在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;

然后运行以下查询,您应该看到两个proc名称出现在“tempdb”中:

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];