簡體   English   中英

SQL分組結果

[英]SQL grouping results

我試圖獲取用戶最后一次更新表的時間:

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次(請參見下面的圖片)

查詢結果

由於似乎所有重復的表都具有相同的上次更新時間。 有什么方法可以通過表名對結果進行分組?

如果值確實相同,則可以將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

表可以具有多個索引。 動態管理視圖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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM