Определение неиспользуемых объектов в Microsoft SQL Server 2005
Это тривиальная задача выяснить, есть ли на объекте ссылка на что-то еще или нет. То, что я хотел бы сделать, это определить, действительно ли он используется.
Мое решение изначально включало в себя комбинацию таблицы, в которой содержался список объектов в базе данных, и почасовой работы.
Работа сделала две вещи. Сначала он искал новые объекты, которые были добавлены в базу данных с момента последнего запуска. Во-вторых, он посмотрел на объектный кеш sql. Если объект в таблице был указан в кеше, он был помечен в таблице как недавно использованный.
В конце шестимесячного периода или чего-то другого содержимое таблицы было проверено. На все перечисленное в таблице, на которое не было замечено ссылок с тех пор, как я начал мониторинг, вероятно, было безопасно копировать и удалять.
Конечно, есть возможность использования объектов, скажем, один раз в год или что-то еще, но, похоже, это работает по большей части.
Хотя работать с этим было немного больно.
Я работаю с полудюжиной баз данных, большинство из которых имеют тонны устаревших таблиц, которые остаются еще долго после того, как их первоначальные создатели перешли в другие компании.
То, что я ищу, - это достаточно надежный метод отслеживания того, когда вызывается объект (таблица, представление, хранимая процедура или функция).
Для тех из вас, кто в настоящее время отслеживает подобные вещи, какой метод / код вы используете, и вы бы порекомендовали его?
2 ответа
В 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.
Брент Озар упустил из виду тот факт, что dm_db_index_usage_stats имеет object_ids разных баз данных.
SELECT
DB_NAME(i.database_id) AS Datenbank,
object_name(i.object_id,i.database_id) as Tabelle,
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
GROUP BY
i.database_id,
i.object_id
ORDER BY [Total accesses] DESC