У меня очень большая база данных с сотнями таблиц, и после многих, многих обновлений продукта, я уверен, что половина из них больше не используется. Как определить, активно ли выбран таблица? Я не могу просто использовать Profiler - не только я хочу наблюдать более нескольких дней, но также есть тысячи хранимых процедур, а профилировщик не будет переводить вызовы SP в вызовы доступа к таблице.
Единственное, о чем я могу думать, это создать кластерный индекс в интересующих таблицах, а затем отслеживать sys.dm_db_index_usage_stats
, чтобы увидеть, есть ли какие-либо поиски или сканирование в кластерном индексе, что означает, что данные из таблицы были загружен. Однако добавление кластеризованного индекса в каждую таблицу является плохим решением (по каким-либо причинам), поскольку это не реально.
Существуют ли другие варианты? Я всегда хотел использовать функцию типа "SELECT trigger", но, вероятно, есть и другие причины, по которым SQL Server не имеет этой функции.
РЕШЕНИЕ:
Спасибо, Ремус, за то, что указал мне в правильном направлении. Используя эти столбцы, я создал следующий SELECT, который делает именно то, что я хочу.
WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
last_user_seek as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_scan as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_lookup as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
)
SELECT OBJECT_NAME(so.object_id) AS TableName,
MAX(la.LastAction) as LastSelect
FROM sys.objects so
LEFT
JOIN LastActivity la
on so.object_id = la.ObjectID
WHERE so.type = 'U'
AND so.object_id > 100
GROUP BY OBJECT_NAME(so.object_id)
ORDER BY OBJECT_NAME(so.object_id)