【问题标题】:Stored Procedure tracking存储过程跟踪
【发布时间】:2014-09-03 14:17:30
【问题描述】:

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

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

我能看到的唯一区别是第 2 步中的过程出现“警告:空值被聚合或其他 SET 操作消除”,而第 1 步没有。这对程序是否出现在sys.dm_exec_procedure_stats 中是否有影响?

希望有人能帮忙!

【问题讨论】:

  • 我不认为这是一个重复的问题,因为另一个问题是如何跟踪,而我已经在跟踪。我遇到的问题是 sys.dm_exec_procedure_stats 表中没有出现一个过程,以及它是否与 NULL 警告有关。谢谢

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


【解决方案1】:

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

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

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

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

编辑:
回答以下具体问题:

“警告:Null 值被聚合或其他 SET 操作消除”警告是否在未显示在 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];

【讨论】:

  • 所有代码都通过作业或 Reporting Services 运行。大多数程序都进入了表格,而那些不是我已经签出并且它们不再运行的程序,所以我对此感到满意。有问题的程序是我知道的,每周运行一次,但没有出现在表格中。是否有可能在代码完成后立即从缓存中删除?
  • @ChrisUpton:是的,这是可能的。我非常怀疑 ANSI 警告会阻止它首先被记录。您是否通过运行 SQL 作业并立即检查 SSMS 以查看它是否在 DMV 中进行了测试?它可能只存在几秒钟?
  • 我已经手动运行了代码,但它似乎根本没有注册——即使它已经执行了!。是否会将缓存记录在单独的数据库中,而不是运行程序的数据库中?!
  • @ChrisUpton:DMV 是服务器范围的,并且有一个 [database_id] 字段,所以你在哪个数据库中并不重要。database_id 和 object_id 匹配对象存在的位置,而不是当前数据库执行时的上下文。
  • @ChrisUpton:我刚刚测试并确认不,该警告 not 会阻止 proc 进入缓存。我会用测试代码更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多