У нас есть коллекция очень старых, ужасно оформленных баз данных, и мне дали зеленый свет на их удаление и реструктуризацию. Однако в этих базах данных нет нормализации, многие поля были пустыми в течение многих лет или были повторно назначены без документации, и у нас есть множество устаревших приложений и общедоступных веб-сайтов, которые используют различные части этих данных, но никто в компании не имеет никакого представления что делает что к чему.
Как я мог определить, какие поля в этих таблицах используются? Есть ли способ в SQL-сервере или при необходимости использовать сторонний инструмент для просмотра истории использования? или настроить дополнительное ведение журнала для определения этого использования? «Использование» в идеале означает, когда оно было обновлено или вставлено в последний раз, и когда и как часто оно включается в оператор выбора.
В дополнение к этому, мы осуществляем переход с SQL 2005 на 2008. Таким образом, решение, использующее любой тип сервера, будет работать, так как я смогу довести 05 dbs до соответствия 08.
Лично я бы использовал DMV как свое первоначальное расследование для поиска основных действий. Это может помочь нацелить ваше расследование, чтобы вы могли создать правильные трассировки профилировщика. (Как упоминает Сэм, вы должны быть осторожны с ними, чтобы не создавать проблем с производительностью.)
Поскольку вы упомянули, что у вас есть возможность использовать sql 2008, новый функции аудита может быть вам полезен.
Вот на что рекомендую посмотреть:
Ищите доступ к объекту с индексными DMV
Наиболее полезными будут два DMV: sys.dm_db_index_usage_stats
(BOL Вот) и sys.dm_db_missing_index_details
(BOL Вот).
Ищите в кеше наиболее частые и наиболее важные запросы.
Использовать sys.dm_exec_query_stats
запросы, чтобы найти наиболее часто выполняемые запросы. BOL Вот.
Удачи!
Вы можете запустить трассировку с помощью профилировщика SQL, подождать некоторое время, а затем выполнить поиск в выходных данных, чтобы найти имена полей, которые вас беспокоят.
Другой вариант - создать триггер на сервере SQL и записать эту информацию в другую таблицу.
т.е.
CREATE TRIGGER Audit
ON dbo.Employee
FOR INSERT, UPDATE, DELETE
AS
IF (SELECT COUNT(*) FROM inserted) > 0
BEGIN
IF (SELECT COUNT(*) FROM deleted) > 0
BEGIN
-- update!
INSERT AuditEmployee
(EmployeeID, UserName, Operation)
SELECT EmployeeID, SUSER_SNAME(), 'U'
FROM inserted
END
ELSE
BEGIN
-- insert!
INSERT AuditEmployee
(EmployeeID, UserName, Operation)
SELECT EmployeeID, SUSER_SNAME(), 'I'
FROM inserted
END
END
ELSE
BEGIN
-- delete!
INSERT AuditEmployee
(EmployeeID, UserName, Operation)
SELECT EmployeeID, SUSER_SNAME(), 'D'
FROM deleted
END
GO
Этот пример взят из http://sqlserver2000.databases.aspfaq.com/how-do-i-audit-changes-to-sql-server-data.html. Чтобы сохранить имя столбца, вы можете добавить эту переменную в свой оператор вставки. Видеть http://www.devx.com/dbzone/Article/7939/1954 для другого примера.
Операторы выбора теперь можно проверять с помощью трассировки сервера sql. Они не хранятся в журнале. Ваши журналы содержат изменения данных, которые можно проверить с помощью некоторых сторонних инструментов от популярных поставщиков утилит SQL. Вы также можете использовать триггеры во всех своих таблицах для аудита изменений, но они не будут перехватывать выборки.
Запуск 'широко открытых' трассировок для всех операторов select на производстве не рекомендуется. Если возможно, перенесите его в разработку и настройте тестирование.
c2 аудит может также помочь вам, но я не знаю много деталей о том, что он на самом деле собирает.
Кроме того, изучение кода приложения было бы хорошим местом для исследования.