有没有办法在数据库中找到那些只是垃圾的未使用表?
4 回答
如果正在使用表,我能想到的唯一方法是使用 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];
;
我认为您可能会发现数据库统计信息是最有利可图的地方。它应该能够告诉您哪些表读取最多,哪些表更新最多。如果您发现既不读取也不写入的表,它们可能没有太多使用。
我不确定 SQL Svr 2000 中有哪些可用的数据库统计信息。
但是,与其简单地查看哪些表使用得不多,不如检查每个表包含什么以及它的用途不是更好的方法,以便您对设计有一个正确的理解吗?在这种情况下,您将能够正确判断什么是必要的,什么不是。
令人担忧的是,您不知道源代码控制是什么(这是一种管理文件更改的方式 - 通常是源代码 - 因此您可以跟踪谁更改了什么、何时以及为什么更改。)任何比一个更大的东西- man 项目(甚至一些单人项目)应该使用它。
如果您使用源代码控制,请参阅最新的数据库脚本。它是最简单的方法。
您可以使用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来监视您的数据库并查看是否以及何时引用了这些表。