Идентификация неиспользуемых объектов в 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.