Выявление неиспользуемых объектов в Microsoft SQL Server 2005
-
08-07-2019 - |
Вопрос
Это простая задача - выяснить, на какой объект ссылается что-то еще или нет. Я хотел бы определить, действительно ли он используется .
Мое решение изначально включало в себя комбинацию таблицы, в которой содержался список объектов в базе данных, и почасовой работы.
Работа сделала две вещи. Сначала он искал новые объекты, которые были добавлены в базу данных с момента последнего запуска. Во-вторых, он посмотрел на объектный кеш sql. Если объект в таблице был указан в кэше, он был помечен в таблице как недавно просмотренный. используется.
В конце шестимесячного периода или любого другого содержимого таблицы были проверены. На все объекты в таблице, на которые не было замечено ссылок, с тех пор, как я начал мониторинг, вероятно, было безопасно выполнять резервное копирование и удаление.
Конечно, существует возможность использования объектов, скажем, один раз в год или как угодно, но, похоже, это работает по большей части.
Работать с этим было немного больно.
Я работаю с полудюжиной баз данных, большинство из которых имеют тонны устаревших таблиц, которые остаются еще долго после того, как их первоначальные создатели перешли в другие компании.
Я ищу достаточно надежный метод отслеживания того, когда вызывается объект (таблица, представление, хранимая процедура или функция).
Для тех из вас, кто в настоящее время отслеживает подобные вещи, каким методом / кодом вы пользуетесь, и вы бы порекомендовали его?
Решение
В SQL Server 2005 вы можете использовать динамическое представление управления sys.dm_db_index_usage_stats. Название говорит «индекс» но это немного вводит в заблуждение - каждая таблица имеет здесь запись, даже если она не имеет индексов. Вот полезный запрос из журнала SQL:
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.