Назад | Перейти на главную страницу

Отслеживайте использование столбцов или таблиц на сервере Microsoft SQL

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

Как я мог определить, какие поля в этих таблицах используются? Есть ли способ в 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 аудит может также помочь вам, но я не знаю много деталей о том, что он на самом деле собирает.

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