Dan*_*iel 0 sql-server-2005 sql-server stored-procedures t-sql
我正在尝试获取整个 SQL 服务器中未使用过程的列表。我已经完成了获取所有过程的列表,现在我正在使用以下脚本来确定使用了哪些过程。
DECLARE @command varchar(1000)
SELECT @command =
'USE [?] SELECT
qt.text AS "SP Name",
qs.execution_count AS "Execution Count",
qs.max_logical_reads,
qs.max_logical_writes,
qs.creation_time,
DB_NAME() as DatabaseName,
DATEDIFF(Minute, qs.creation_time, GetDate()) AS "Age in Cache"
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qt.text DESC'
EXEC sp_MSforeachdb @command
Run Code Online (Sandbox Code Playgroud)
我知道这只会显示重启后使用过的程序。数据似乎有些作用 - 然而;我遇到的问题是它似乎显示了整个程序文本 IE:
CREATE PROCEDURE dbo.proc_MSS_PropagationGetQueryServers AS
DECLARE @Temp table(ServerID int, SearchServerName nvarchar(31), IndexDirectory nvarchar(260),
MachineStatus int, LastPropagationTime datetime,
PropagationStatus int ) INSERT INTO @Temp
SELECT SearchServerDirectory,
LastPropagationTime Index,LastPropagationMachineName 1 AS PropagationStatus FROM
dbo.MSSPropagationSearchServerTable UPDATE @Temp
SET PropagationStatus = 0 WHERE NOT EXISTS (SELECT * FROM dbo.MSSPropagationSearchServerReady AS R WHERE ServerID = R.SearchServerID) AND (1 < DATEDIFF(m, LastPropagationTime, GETUTCDATE()) OR 30 < DATEDIFF(s, LastPropagationTime, GETUTCDATE) ) CREATE TABLE #UnresponsiveQueryServers (
ServerID int ) INSERT #UnresponsiveQueryServers EXEC
dbo.proc_MSS_PropagationGetUnresponsiveQueryServers UPDATE
@Temp SET PropagationStatus = 3 WHERE
ServerID IN ( SELECT ServerID FROM #Unresponsive
UPDATE QueryServers )
= 机器状态或机器状态机2
MachineStatus = 2 SELECT SearchServerName、
IndexDirectory、MachineStatus、PropagationStatus
FROM @Temp
我只想要程序本身的名称。所以在这种情况下 proc_MSS_PropagationGetQueryServers
任何人都可以帮助解决这个问题?
您正在寻找的东西并不是真正可能的,至少不是本着您最终试图完成的精神。正如我在回答几乎是重复的问题时所解释的那样 -上次使用/读取视图、函数或 sp 时查询- 这种方法没有考虑应用程序代码中不常访问的代码路径和“支持”手动执行的代码,通常在 SSMS 中。这很糟糕,但你真的只需要对所有可能执行存储过程的代码进行详尽的审查,以及包括关于在 X 情况下运行什么的说明的支持票,甚至可能有指示指示的内部 wiki 页面执行存储过程(或使用 UDF 等)。
此外,您可以创建一个表来记录使用情况,对于那些您认为“未使用”的存储过程,请在顶部添加一行以插入到此日志表中。定期检查该日志表,并与您的团队/部门设置一个截止时间,如果在这段时间内没有访问过该代码,每个人都可以轻松地摆脱该代码。
PS我以前经历过这个过程。在发布后不久,我有支持人员给我(或我的经理)打电话,因为我删除了一些没有在任何其他代码或内部 wiki 页面等中引用的代码(相信我,我的研究非常彻底!)。但是,它是被在Microsoft Access应用程序使用的做出一定的保障任务支持工程师创建前两年/请求花费更少的时间(即不是需要等待2周的一个DBA来避开运行存储过程,这样一客户可以做他们需要做的)。而且由于我们数据库工程师中没有人知道这个应用程序甚至存在(它只在支持区域的少数桌面上,当然不在 SVN 中),所以它有点难以考虑。
PPS关于此声明:
我知道这只会显示重启后使用过的程序。
这是最多可以显示的。但是,重新启动并不是清除缓存系统数据的唯一方法。以下任一命令也将清除该数据:
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
Run Code Online (Sandbox Code Playgroud)
并且,当存在内存压力(即可用物理内存不足)时,SQL Server 将定期转储缓存数据。
因此,您不能为此目的使用任何 DMV/DMF 的输出。
购买力平价的sys.dm_exec_query_stats
DMV工作在服务器/实例级别,而不是数据库级别。这意味着,您不仅不需要将此类查询包装在 中sp_MSforeachdb
,而且您也不想这样做,因为每个数据库都会重复相同的结果集。
PPPPSsys.dm_exec_sql_text
您已经在使用的DMF 可以方便地返回objectid
和 的列dbid
。该dbid
列可以与DB_NAME()
您已经用于获取该查询的“当前”数据库名称的内置函数一起使用。并且,dbid
和objectid
列都可以与OBJECT_NAME()
内置函数一起使用来获取存储过程的名称,相对于该“当前”数据库(与您正在运行此查询的数据库相反,它可能返回错误值,因为对象可能不在该数据库中)。然后这两个函数都可以在ORDER BY
子句中再次使用。
考虑到所有这些信息,重写的查询是:
SELECT DB_NAME(qt.[dbid]) AS [DatabaseName],
OBJECT_NAME(qt.[objectid], qt.[dbid]) AS [SP Name],
qs.execution_count AS [Execution Count],
qs.max_logical_reads,
qs.max_logical_writes,
qs.creation_time,
DATEDIFF(Minute, qs.creation_time, GetDate()) AS [Age in Cache]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
ORDER BY DB_NAME(qt.[dbid]) DESC,
OBJECT_NAME(qt.[objectid], qt.[dbid]) DESC;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
290 次 |
最近记录: |