SQL Server,Unused表很长一段时间(如何摆脱不必要的表)?

时间:2010-07-16 08:29:54

标签: sql sql-server sql-server-2000 database-table

有没有办法找到未使用的表,除了数据库中的垃圾之外别无其他?

4 个答案:

答案 0 :(得分:2)

如果正在使用表,我能想到的唯一方法是使用sys.dm_db_index_usage_stats。需要注意的是,它只记录自上次启动SQL服务以来表的使用情况。 因此,请记住,您可以使用以下查询:

  SELECT DISTINCT
         OBJECT_SCHEMA_NAME(t.[object_id])   AS 'Schema'
       , OBJECT_NAME(t.[object_id])          AS 'Table/View Name'
       , CASE  WHEN rw.last_read > 0 THEN rw.last_read END  AS 'Last Read'
       , rw.last_write                        AS 'Last Write'
       , t.[object_id]
    FROM sys.tables                           AS t
    LEFT JOIN sys.dm_db_index_usage_stats     AS us
      ON us.[object_id]    = t.[object_id]
     AND us.database_id    = DB_ID()
    LEFT JOIN
         ( SELECT MAX(up.last_user_read)      AS 'last_read'
                , MAX(up.last_user_update)    AS 'last_write'
                , up.[object_id]
             FROM (SELECT last_user_seek
                        , last_user_scan
                        , last_user_lookup
                        , [object_id]
                        , database_id
                        , last_user_update, COALESCE(last_user_seek, last_user_scan, last_user_lookup,0) AS null_indicator
                     FROM sys.dm_db_index_usage_stats) AS sus 
                  UNPIVOT(last_user_read FOR read_date IN(last_user_seek, last_user_scan, last_user_lookup, null_indicator)) AS up
            WHERE database_id = DB_ID()
         GROUP BY up.[object_id]
         ) AS rw
      ON rw.[object_id] = us.[object_id]
ORDER BY [Last Read]
       , [Last Write]
       , [Table/View Name];

答案 1 :(得分:1)

如果使用源代码管理,请参阅最新的数据库脚本。这是最简单的方法。

答案 2 :(得分:1)

我认为你可能会发现数据库统计数据是最有利可图的地方。 它应该能够告诉你哪些表最常读,哪些表更新。 如果您发现既不读取也不写入的表格,则可能没有太多使用。

我不确定SQL Svr 2000中有哪些数据库统计信息可用。

然而,不是简单地查看哪些表没有被广泛使用,而是更好的方法是检查每个表所包含的内容以及它的用途,以便您对设计有一个正确的理解?在这种情况下,您将能够正确判断什么是必要的,什么不是。

令人担忧的是,您不知道源代码控制是什么(这是管理更改文件的一种方式 - 通常是代码 - 因此您可以跟踪谁更改了内容,时间和原因。)任何大于一个人的项目(甚至一些单人项目)应该使用它。

答案 3 :(得分:0)

您可以使用sp_depends确认可疑表的任何依赖性。

以下是一个例子:

CREATE TABLE Test (ColA INT)
GO

CREATE PROCEDURE usp_Test AS 
BEGIN
  SELECT * FROM Test
END
GO

CREATE FUNCTION udf_Test() 
RETURNS INT 
AS 
BEGIN 
  DECLARE @t INT 
  SELECT TOP 1 @t = ColA FROM Test 
  RETURN @t 
END
GO

EXEC sp_depends 'Test'

/** Results **/

In the current database, the specified object is referenced by the following:
name          type
-----         ----------------
dbo.udf_Test  scalar function
dbo.usp_Test  stored procedure

这种方法有一些caveats。此外,这对于直接从应用程序或其他软件(即Excel,Access等)访问的表也无济于事。

为了完全彻底,我建议使用SQL Profiler来监控您的数据库,看看是否以及何时引用这些表。