2009-11-05 35 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包或訪問數據庫的某些其他應用程序所使用的

相關問題