データベース内のゴミに他ならない未使用のテーブルを見つける方法はありますか?
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 プロジェクト (および一部の 1 人プロジェクト) で使用する必要があります。
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 プロファイラーを使用してデータベースを監視し、これらのテーブルが参照されているかどうか、いつ参照されるかを確認することをお勧めします。