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