J'ai une très grande base de données avec des centaines de tables, et après beaucoup, beaucoup de mises à niveau de produits, je suis sûr que la moitié d'entre eux ne sont pas plus utilisées. Comment puis-je savoir si un tableau est activement sélectionnées à partir de? Je ne peut pas utiliser de générateur de profils - non seulement je veux regarder pour plus de quelques jours, mais il y a des milliers de procédures stockées en tant que bien, et le générateur de profils de ne pas traduire le PS appelle dans l'accès à la table des appels.
La seule chose que je peux penser à est de créer un index cluster sur les tables de l'intérêt, et puis surveiller l' sys.dm_db_index_usage_stats
pour voir s'il y a des recherches ou des analyses sur l'index cluster, ce qui signifie que les données de la table a été chargé. Cependant, l'ajout d'un index cluster sur chaque tableau est une mauvaise idée (pour diverses raisons), que n'est pas vraiment possible.
Existe-il d'autres options? J'ai toujours voulu une fonction comme un "déclencheur", mais il y a probablement d'autres raisons pour que SQL Server n'a pas cette fonctionnalité soit.
SOLUTION:
Merci, Remus, pour me pointer dans la bonne direction. L'utilisation de ces colonnes, j'ai créé la sélection suivante, qui fait exactement ce que je veux.
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)