有没有办法找到未使用的表,除了数据库中的垃圾之外别无其他?
答案 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来监控您的数据库,看看是否以及何时引用这些表。