Определение неиспользуемых объектов в 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
Другие вопросы по тегам