2014-10-10 112 views
0

我试图获得最后时间的表是由用户更新:SQL分组结果

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次(请参阅图像波纹管)

query results

由于看来复制所有表具有相同的最后更新的时间。有没有办法按表名分组结果?

+1

我认为它是http://stackoverflow.com/questions/26289609/getting-last-user-update-time-for-all-tables-in-a-database – Recursive 2014-10-10 13:12:08

+1

的重复SELECT DISTINCT * FROM @Collect ORDER BY last_user_update DESC' – bummi 2014-10-10 13:14:21

+0

@Arnand,它不是重复的。这是该问题的后续行动。由于这是一个新问题,我不想编辑该问题以包含新问题。 – RBasniak 2014-10-10 13:15:09

回答

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

表可以有多个索引。动态管理视图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。