2014-10-10 189 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。