我试图让用户最后一次更新表格
Declare @Collect Table (Name Varchar(100),last_user_update datetime)
Insert into @Collect
EXEC sp_MSForEachTable 'SELECT ''?'' as TableName,
last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID(''SP3D_DB_RESEARCH_MDB'') AND OBJECT_ID = OBJECT_ID(''?'')'
SELECT * FROM @Collect ORDER BY last_user_update DESC
问题在于,在结果中,有些表格出现了3次(请参见下图)
由于看起来所有重复的表都具有相同的上次更新时间。有没有办法按表名对结果进行分组?
答案 0 :(得分:1)
如果值确实相同,您只需将DISTINCT
添加到查询中,然后让它返回唯一结果
SELECT DISTINCT ''?'' as TableName, last_user_update ...
如果您想在事后分组,并且只有最后一次更新感兴趣,您可以
SELECT TableName, max(last_user_update) as last_update
FROM @Collect
GROUP BY TableName
ORDER BY 2 DESC
答案 1 :(得分:1)
表可以有多个索引。动态管理视图sys.dm_db_index_usage_stats将为每个索引分别创建条目。
如果要查看每个索引的名称,请尝试以下操作:
SELECT
o.name as TableName,
i.name as IndexName,
istats.last_user_update
from sys.dm_db_index_usage_stats istats
inner join sys.objects o
on o.object_id = istats.object_id
inner join sys.indexes i
on i.index_id = istats.index_id
and i.object_id = istats.object_id
order by
o.name,
i.name
或者,如果您不关心这一点,只想要上次更新时间,您可以按表名分组:
SELECT
o.name as TableName,
max(istats.last_user_update)
from sys.dm_db_index_usage_stats istats
inner join sys.objects o
on o.object_id = istats.object_id
group by
o.name
您可以使用此查询直接在表格中插入:
declare @Collect table (Name varchar(100),last_user_update datetime)
insert into @Collect
select
o.name as TableName,
istats.last_user_update
from sys.dm_db_index_usage_stats istats
inner join sys.objects o
on o.object_id = istats.object_id
inner join sys.indexes i
on i.index_id = istats.index_id
and i.object_id = istats.object_id
where database_id = db_id('SP3D_DB_RESEARCH_MDB')
此外,我不确定您的目标是什么,但请理解此视图仅包含对其有活动的索引的条目。如果索引未使用,则不在此视图中。第一次访问在视图中创建一行。这个视图中真正有趣的东西是搜索和扫描信息。
请参阅MSDN上的此说明:
使用索引时,会向sys.dm_db_index_usage_stats添加一行 如果索引尚不存在行。添加行时, 其计数器最初设置为零。
如果您的目标是枚举所有索引,然后显示所有索引的最后更新日期,则需要加入sys.indexes,然后将其连接到sys.dm_db_index_usage_stats。