Ich habe eine sehr große Datenbank mit Hunderten von Tabellen, und nach vielen, vielen Produkt-Upgrades wird sicher die Hälfte davon nicht mehr verwendet. Wie kann ich feststellen, ob aus einer Tabelle aktiv ausgewählt wird? Ich kann nicht einfach Profiler verwenden - ich möchte nicht nur mehr als ein paar Tage beobachten, sondern es gibt auch Tausende von gespeicherten Prozeduren, und Profiler wird die SP-Aufrufe nicht in Tabellenzugriffsaufrufe übersetzen.
Das Einzige, was mir einfällt, ist, einen geclusterten Index für die betreffenden Tabellen zu erstellen und dann die sys.dm_db_index_usage_stats
um zu sehen, ob es irgendwelche Suchvorgänge oder Scans für den geclusterten Index gibt, was bedeutet, dass Daten aus der Tabelle geladen wurden. Das Hinzufügen eines geclusterten Indexes für jede Tabelle ist jedoch eine schlechte Idee (aus einer Vielzahl von Gründen), da es nicht wirklich machbar ist.
Gibt es noch andere Möglichkeiten für mich? Ich habe mir immer eine Funktion wie einen "SELECT-Trigger" gewünscht, aber es gibt wahrscheinlich andere Gründe, warum SQL Server diese Funktion nicht hat.
LÖSUNG:
Danke, Remus, dass du mich auf den richtigen Weg gebracht hast. Unter Verwendung dieser Spalten habe ich das folgende SELECT erstellt, das genau das tut, was ich will.
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)