Microsoft SQL Server 2005에서 사용되지 않은 개체 식별
-
08-07-2019 - |
문제
객체가 다른 것에 의해 참조되는지 여부를 찾는 것은 사소한 일입니다. 내가하고 싶은 것은 그것이 의지 여부를 식별하는 것입니다. 실제로 사용됩니다.
내 솔루션에는 원래 데이터베이스에 객체 목록을 보유한 테이블의 조합과 시간당 작업이 포함되었습니다.
그 일은 두 가지 일을했다. 먼저, 마지막 실행 이후 데이터베이스에 추가 된 새 개체를 찾았습니다. 둘째, SQL의 객체 캐시를 보았습니다. 테이블의 객체가 캐시에 나열된 경우, 최근에 사용중인 "본"것으로 테이블에 표시되었습니다.
6 개월이 끝나면 테이블의 내용이 검사되었습니다. 모니터링을 시작한 이후로 언급되지 않은 테이블에 나열된 내용은 아마도 백업하고 제거하기에 안전했습니다.
물론, 1 년에 한 번만 사용되는 물체의 가능성이 있지만 대부분은 작동하는 것처럼 보였습니다.
그래도 함께 일하는 것은 일종의 고통이었습니다.
함께 일하고있는 약 6 개의 데이터베이스가 있으며, 대부분은 수많은 레거시 테이블을 가지고 있으며, 원래 제작자가 다른 회사로 이동 한 지 오래 남았습니다.
내가 찾고있는 것은 객체 (테이블, 뷰, 저장 프로 시저 또는 기능)가 호출 될 때를 추적하는 상당히 신뢰할 수있는 방법입니다.
현재 이런 종류의 것을 모니터링하는 사람들을 위해 어떤 방법/코드를 사용하고 있으며 추천 하시겠습니까?
해결책
SQL Server 2005를 사용하면 동적 관리보기 SYS.DM_DB_INDEX_USAGE_STATS를 사용할 수 있습니다. 이름은 "색인"이라고 말하지만 약간 오해의 소지가 있습니다. 모든 테이블에는 인덱스가 없더라도 여기에 항목이 있습니다. SQL Magazine의 유용한 쿼리는 다음과 같습니다.
SELECT
t.name AS 'Table',
SUM(i.user_seeks + i.user_scans + i.user_lookups)
AS 'Total accesses',
SUM(i.user_seeks) AS 'Seeks',
SUM(i.user_scans) AS 'Scans',
SUM(i.user_lookups) AS 'Lookups'
FROM
sys.dm_db_index_usage_stats i RIGHT OUTER JOIN
sys.tables t ON (t.object_id = i.object_id)
GROUP BY
i.object_id,
t.name
ORDER BY [Total accesses] DESC
원래 기사는 다음과 같습니다.
http://www.sqlmag.com/article/articleid/53878/sql_server_53878.html
SQL Server가 다시 시작될 때 이러한 사용 통계가 재설정됩니다.