1

有没有办法在数据库中找到那些只是垃圾的未使用表?

4

4 回答 4

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];

;

于 2010-07-16T11:51:01.980 回答
1

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

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

但是,与其简单地查看哪些表使用得不多,不如检查每个表包含什么以及它的用途不是更好的方法,以便您对设计有一个正确的理解吗?在这种情况下,您将能够正确判断什么是必要的,什么不是。

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

于 2010-07-16T11:36:08.027 回答
1

如果您使用源代码控制,请参阅最新的数据库脚本。它是最简单的方法。

于 2010-07-16T08:35:50.900 回答
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

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

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

于 2010-07-21T04:08:34.623 回答