Comment puis-je savoir si une table de base de données est plus accessible? Voulez quelque chose comme un “déclencheur”

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)
  • Est-il un moyen pour capturer ces données dans un tableau lorsque le serveur s'arrête? Cela permettrait à long terme de suivi.
  • Grande question. Pour n'importe qui d'autre en regardant cela, si vous utilisez 2008, vous pouvez remplacer les requêtes à l'intérieur de la CTE avec la suivante; SELECT object_id AS TableName, (SELECT Max(v) FROM (VALUES (last_user_seek), (last_user_scan), (last_user_lookup)) AS value(v)) as [LastAction] FROM sys.dm_db_index_usage_stats u WHERE database_id = db_id(db_name()) Exemple à partir de ici
InformationsquelleAutor SqlRyan | 2010-01-28