2009-11-05 65 views
1

是否有一个更简单的方法来清理有大量存储过程的数据库,我确信除了逐个搜索之外,还有一些不再使用。在代码中查找未使用的存储过程?

我想搜索存储过程我的Visual Studio解决方案,看看哪些是不使用从数据库中的人不再。

回答

3

您可以创建在数据库中的存储过程的列表。将它们存储到一个文件中。

SELECT * 
FROM sys.procedures; 

然后将该文件读入内存,然后在每个条目的源文件中运行一个大型的正则表达式搜索。一旦您为给定的存储过程点击第一个匹配项,就可以继续。

如果没有一个给定存储过程的比赛,你也许可以在该存储过程看起来更紧密合作,并甚至可以将其删除。

我会小心删除存储过程 - 你还需要检查,没有其他的存储过程取决于你的候选人去除!

0

嗯......你可以搜索你的代码的解决方案,调用存储过程,这样(从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 

应该找到自指定日期以来未使用的对象。请注意,我还没有尝试过这些方法,但它们似乎是合理的。

+0

。这将生成一个列表来研究不是要删除的列表。 – HLGEM 2009-11-05 18:22:43

1

我会使用探查器并设置一个跟踪。最大的问题是追踪每月或每年使用的SP。不显示在跟踪了

任何东西都可以进行调查。我有时会将单个SP记录到一个表格中,然后查看该表格的活动。我甚至有个别SP在接到电话时给我发电子邮件。

通过在GREOR中搜索INFORAMTION_SCHEMA.ROUTINES或源代码,确保不会从服务器的其他任何地方调用SP。检查SSIS包和作业有点困难。

但这一切消除的可能性,有可能是偶尔的SP其中有人打电话每个月手动SSMS纠正数据异常或东西。当然,并不是所有的SPS是由应用程序,这并不意味着数据库可能并不需要它们的工作或SSIS或DTS包或访问数据库的某些其他应用程序所使用的

相关问题