Выявление неиспользуемых объектов в Microsoft SQL Server 2005 - PullRequest
17 голосов
/ 14 ноября 2008

Это тривиальная задача выяснить, есть ли на объекте ссылка на что-то еще или нет. То, что я хотел бы сделать, это определить, действительно ли он используется .

Мое решение изначально включало в себя комбинацию таблицы, в которой содержался список объектов в базе данных, и почасовой работы.

Работа сделала две вещи. Сначала он искал новые объекты, которые были добавлены в базу данных с момента последнего запуска. Во-вторых, он посмотрел на объектный кеш sql. Если объект в таблице был указан в кеше, он был помечен в таблице как «недавно использованный».

В конце шестимесячного периода или любого другого, содержимое таблицы было проверено. На все перечисленные в таблице ссылки, которые не были видны, с тех пор, как я начал мониторинг, возможно, было безопасно выполнять резервное копирование и удаление.

Конечно, существует возможность использования объектов, скажем, один раз в год или что-то в этом роде, но, похоже, это работает по большей части.

Хотя работать с ней было немного больно.

Есть около полудюжины баз данных, с которыми я работаю, в большинстве из которых есть тонны устаревших таблиц, которые остаются еще долго после того, как их первоначальные создатели перешли в другие компании.

То, что я ищу, - это достаточно надежный метод отслеживания того, когда вызывается объект (таблица, представление, хранимая процедура или функция).

Для тех из вас, кто в настоящее время следит за такого рода вещами, какой метод / код вы используете, и вы бы порекомендовали его?

1 Ответ

24 голосов
/ 15 ноября 2008

В 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.

...