是否有一个更简单的方法来清理有大量存储过程的数据库,我确信除了逐个搜索之外,还有一些不再使用。在代码中查找未使用的存储过程?
我想搜索存储过程我的Visual Studio解决方案,看看哪些是不使用从数据库中的人不再。
是否有一个更简单的方法来清理有大量存储过程的数据库,我确信除了逐个搜索之外,还有一些不再使用。在代码中查找未使用的存储过程?
我想搜索存储过程我的Visual Studio解决方案,看看哪些是不使用从数据库中的人不再。
您可以创建在数据库中的存储过程的列表。将它们存储到一个文件中。
SELECT *
FROM sys.procedures;
然后将该文件读入内存,然后在每个条目的源文件中运行一个大型的正则表达式搜索。一旦您为给定的存储过程点击第一个匹配项,就可以继续。
如果没有一个给定存储过程的比赛,你也许可以在该存储过程看起来更紧密合作,并甚至可以将其删除。
我会小心删除存储过程 - 你还需要检查,没有其他的存储过程取决于你的候选人去除!
嗯......你可以搜索你的代码的解决方案,调用存储过程,这样(从DAAB)
using (DbCommand cmd = DB.GetStoredProcCommand("sp_blog_posts_get_by_title"))
{
DB.AddInParameter(cmd, "@title", DbType.String,title);
using (IDataReader rdr = DB.ExecuteReader(cmd))
result.Load(rdr);
}
搜索第一线的相关部分:
DB.GetStoredProcCommand("
从“查找结果”窗格中复制搜索结果,并与数据库中存储的proc列表进行比较(如果您使用的是SQL Server,可以使用sysObjects表中的选择生成该列表)。
如果你真的想要花一点时间,你可以写一个小应用程序(或使用GREP或类似的)来执行与.cs文件的正则表达式匹配,以提取存储过程列表,对列表进行排序,生成列表通过从系统对象中选择从数据库中存储的特效,并做一个比较。这可能更容易自动化。
UPDATE或者,请参阅this link。作者建议设置一个星期左右的跟踪并将您的proc列表与跟踪中发现的proc列表进行比较。另一位作者建议:(复制)
-- Unused tables & indexes. Tables have index_id’s of either 0 = Heap table or 1 = Clustered Index
SELECT OBJECTNAME = OBJECT_NAME(I.OBJECT_ID), INDEXNAME = I.NAME, I.INDEX_ID
FROM SYS.INDEXES AS I
INNER JOIN SYS.OBJECTS AS O
ON I.OBJECT_ID = O.OBJECT_ID
WHERE OBJECTPROPERTY(O.OBJECT_ID,'IsUserTable') = 1
AND I.INDEX_ID
NOT IN (SELECT S.INDEX_ID
FROM SYS.DM_DB_INDEX_USAGE_STATS AS S
WHERE S.OBJECT_ID = I.OBJECT_ID
AND I.INDEX_ID = S.INDEX_ID
AND DATABASE_ID = DB_ID(db_name()))
ORDER BY OBJECTNAME, I.INDEX_ID, INDEXNAME ASC
应该找到自指定日期以来未使用的对象。请注意,我还没有尝试过这些方法,但它们似乎是合理的。
我会使用探查器并设置一个跟踪。最大的问题是追踪每月或每年使用的SP。不显示在跟踪了
任何东西都可以进行调查。我有时会将单个SP记录到一个表格中,然后查看该表格的活动。我甚至有个别SP在接到电话时给我发电子邮件。
通过在GREOR中搜索INFORAMTION_SCHEMA.ROUTINES或源代码,确保不会从服务器的其他任何地方调用SP。检查SSIS包和作业有点困难。
但这一切消除的可能性,有可能是偶尔的SP其中有人打电话每个月手动SSMS纠正数据异常或东西。当然,并不是所有的SPS是由应用程序,这并不意味着数据库可能并不需要它们的工作或SSIS或DTS包或访问数据库的某些其他应用程序所使用的
。这将生成一个列表来研究不是要删除的列表。 – HLGEM 2009-11-05 18:22:43