У меня очень большая база данных с сотнями таблиц, и после многих, многих обновлений продуктов, я уверен, что половина из них больше не используется. Как я могу узнать, активно ли выбирается таблица? Я не могу просто использовать Профилировщик - я не только хочу наблюдать более нескольких дней, но также существуют тысячи хранимых процедур, и профилировщик не будет переводить вызовы SP в вызовы доступа к таблице.
Единственное, о чем я могу думать, - это создать кластеризованный индекс для интересующих таблиц, а затем отслеживать sys.dm_db_index_usage_stats
, чтобы увидеть, есть ли какие-либо поиски или сканирования в кластерном индексе, то есть данные из таблицы загружен. Однако добавление кластеризованного индекса в каждую таблицу является плохой идеей (по ряду причин), поскольку на самом деле это неосуществимо.
Есть ли у меня другие варианты? Я всегда хотел использовать такую функцию, как «триггер SELECT», но, возможно, существуют и другие причины, по которым 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)