2014-10-10 3 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

+1

의 복사본이라고 생각한다. SELECT DISTINCT * FROM @Collect ORDER BY last_user_update DESC' – bummi

+0

@Arnand, 중복되지 않았습니다. 그 질문의 후속 조치입니다. 새로운 문제이기 때문에 나는 그 질문을 편집하여 새 질문을 포함하고 싶지 않았습니다. – RBasniak

답변

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') 

을, 나는 N 해요 o 목표가 무엇인지는 확실하지만이보기에는 활동이있는 색인에 대한 항목 만 있습니다. 색인이 사용되지 않으면이보기에 없습니다. 첫 번째 액세스는 뷰에 행을 작성합니다. 이 관점에서 실제로 흥미로운 점은 검색 및 검색 정보입니다.

은 MSDN에서이 참고 사항을 참조 : 행이 이미 인덱스에 존재하지 않는 경우

인덱스를 사용하는

은 행이 sys.dm_db_index_usage_stats 에 추가됩니다. 행이 추가되면 카운터는 처음에 0으로 설정됩니다.

당신의 목표는 모든 인덱스를 열거 한 다음 모두를위한 마지막 업데이트 날짜를 표시하는 경우, 다음 sys.indexes에 가입해야합니다은 sys.dm_db_index_usage_stats에 가입 떠났다.