如何查找SQL Server中未使用的表

问题描述 投票:0回答:5

有没有办法找出数据上次输入表的时间?我正在尝试在数据库中查找过时的表,并想知道是否有可以运行的简单脚本?

sql sql-server-2008
5个回答
9
投票

您可以尝试检查查询 sys.dm_db_index_usage_stats 动态管理视图的结果,如下所示:

SELECT *
FROM sys.dm_db_index_usage_stats
WHERE [database_id] = DB_ID() 
    AND [object_id] = OBJECT_ID('TableName')

这将返回诸如last_user_seek、扫描和更新表索引上的日期之类的内容。

但是,请注意,当服务器重新启动时,动态管理视图的统计信息将被重置。服务器运行的时间越长,如果记录显示没有活动,您就越有信心。

我个人也会检查所有源代码以检查对相关表的引用,并搜索所有存储过程/UDF以获取引用(您可以使用 Red Gate 的 SQL 搜索来执行此操作 - 它是免费的)


3
投票

上次查询时间:

-- Create CTE for the unused tables, which are the tables from the sys.all_objects and 
-- not in the sys.dm_db_index_usage_stats table

; with UnUsedTables (TableName , TotalRowCount, CreatedDate , LastModifiedDate ) 
AS ( 
  SELECT DBTable.name AS TableName
     ,PS.row_count AS TotalRowCount
     ,DBTable.create_date AS CreatedDate
     ,DBTable.modify_date AS LastModifiedDate
  FROM sys.all_objects  DBTable 
     JOIN sys.dm_db_partition_stats PS ON OBJECT_NAME(PS.object_id)=DBTable.name
  WHERE DBTable.type ='U' 
     AND NOT EXISTS (SELECT OBJECT_ID  
                     FROM sys.dm_db_index_usage_stats
                     WHERE OBJECT_ID = DBTable.object_id )
)
-- Select data from the CTE
SELECT TableName , TotalRowCount, CreatedDate , LastModifiedDate 
FROM UnUsedTables
ORDER BY TotalRowCount ASC

最后更新时间:

With Unused_Tables (Table_Name, Row_Count, Created_Date, Last_Modified_Date,
Last_User_Lookup, Last_User_Scan, Last_User_Seek, Last_User_Update) 
AS ( 
  SELECT AO.name AS Table_Name
     ,PS.row_count AS Row_Count
     ,AO.create_date AS Created_Date
     ,AO.modify_date AS Last_Modified_Date
     ,ius.last_user_lookup AS Last_User_Lookup
     ,ius.last_user_scan AS Last_User_Scan
     ,ius.last_user_seek AS Last_User_Seek
     ,ius.last_user_update AS Last_User_Update
  FROM sys.all_objects  AO 
     JOIN sys.dm_db_partition_stats PS ON OBJECT_NAME(PS.object_id)=AO.name
     LEFT JOIN sys.dm_db_index_usage_stats ius ON OBJECT_NAME(ius.object_id)=AO.name
  WHERE AO.type ='U' 
  
)
SELECT  * FROM Unused_Tables
Where ISNULL(Last_User_Lookup,'1900-01-01')<DATEADD(month, -1, GETDATE()) AND 
      ISNULL(Last_User_Scan,'1900-01-01')<DATEADD(month, -1, GETDATE()) AND
      ISNULL(Last_User_Seek,'1900-01-01')<DATEADD(month, -1, GETDATE()) AND 
      ISNULL(Last_User_Update,'1900-01-01')<DATEADD(month, -1, GETDATE())
ORDER BY Row_Count DESC

1
投票

如果有人正在查找数据库中所有未使用的表(更多的是标题的请求而不是问题正文),这个人有一个很好的查询来引入数据库中所有未更改的表。在这种情况下,“未更改”是指

sys.dm_db_index_usage_stats
中没有条目的任何表(同样,与 AdaTheDev 的答案一样,仅自上次 sql 服务器重新启动以来)。

SELECT OBJECTNAME = Object_name(I.object_id), 
       INDEXNAME = I.name, 
       I.index_id 
FROM   sys.indexes AS I 
       INNER JOIN sys.objects AS O 
               ON I.object_id = O.object_id 
WHERE  Objectproperty(O.object_id, 'IsUserTable') = 1 
       AND I.index_id NOT IN (SELECT S.index_id 
                              FROM   sys.dm_db_index_usage_stats AS S 
                              WHERE  S.object_id = I.object_id 
                                     AND I.index_id = S.index_id 
                                     AND database_id = Db_id(Db_name())) 
ORDER  BY objectname, 
          I.index_id, 
          indexname ASC 

0
投票

如果这对您的应用程序和/或公司很重要,并且表设计正确,那么每个表都应该有一个名为“LastModifiedTime”的列。您可以查询此表以确定哪些表已过时。


0
投票

主要问题是来自 dmv 的数据自上次服务器重新启动以来是准确的。我开发了以下内容以获得“防重启”解决方案: https://github.com/MadeiraData/MadeiraToolbox/blob/master/Health%20Check%20Scripts/GetTableUsage_RestartProof_AllDatabases.sql

© www.soinside.com 2019 - 2024. All rights reserved.