SQL Server, wie nicht verwendete Ansichten erkannt und / oder Nutzungsstatistiken abgerufen werden
7
Gibt es eine Möglichkeit festzustellen, ob eine Ansicht nicht mehr verwendet wird (ohne sie zu entfernen)?
Idealerweise möchte ich die Verwendung der Ansichten für SQL Server 2000 und 2012 kennen .
Ich aktualisiere einige Datenbanken und vermute, dass viele der Ansichten nicht mehr verwendet werden. Außerdem ist es schwierig, einige der Ansichten auf dem neuen Server zu kompilieren, da sie auf mehrere Datenbanken zugreifen, von denen einige nicht auf den neuen Server verschoben werden.
Möglicherweise möchten Sie DBCC FREEPROCCACHE <sql_plan_handle>das Planhandle für alle Pläne verwenden, die die Ansicht verwenden, und dann die Ergebnisse der obigen Abfrage anzeigen, um festzustellen, ob sie erneut angezeigt wird.
MSSQLTips hat einen großartigen Artikel dazu in SQL Server 2000 +
USE Master
GO
SELECT
UseCounts, RefCounts,CacheObjtype, ObjType, DB_NAME(dbid)as DatabaseName, SQL
FROM syscacheobjects
WHERE SQL LIKE'%view_name_here%'ORDERBY dbid,usecounts DESC,objtype
Danke, es sieht so aus, als wäre der UseCount sehr hilfreich.
Ich
Ich habe meiner Antwort SQL Server 2000-Ratschläge hinzugefügt ...
Max Vernon
Vielleicht ist es nicht ideal, aber ich werde eine einfache App erstellen, um mit dieser Abfrage abzufragen und die Ergebnisse in einer Tabelle zu speichern. Ich stelle fest, dass einige Objekte tagsüber aus dem Cache verschwinden und morgens ziemlich leer sind. Ich brauche nur einen Treffer, um zu wissen, dass die Ansicht aktiv ist.
PatFromCanada
Danke für diese Info! Zu Ihrer Information, ich habe diesen Fehler erhalten, als ich ihn ausprobiert habe: "Die XML-Datentypinstanz von Nachricht 6335, Ebene 16, Status 101, Zeile 2 enthält zu viele Ebenen verschachtelter Knoten. Die maximal zulässige Tiefe beträgt 128 Ebenen." damit?
Jrdevdba
1
@jrdevdba - sp_BlitzErik hat heute Morgen im Chat erwähnt, dass "Abfragepläne mit> 128 Knoten in sys.dm_exec_text_query_plan und nicht in sys.dm_exec_query_plan gespeichert sind" ... das könnte Ihnen helfen.
Max Vernon
15
Wenn Sie 100% genau sein möchten, wird der Plan-Cache leider nicht gekürzt, da es in SQL Server alle Arten von Szenarien gibt, in denen ein Plan möglicherweise überhaupt nicht zwischengespeichert wird. Zum Beispiel OPTION (RECOMPILE), Nullkostenpläne, Optimierung für Ad-hoc-Workloads und Single-Use-Plan-Stubs usw.
Da Sie eine Methode wünschen, die zwischen 2000 und 2012 funktioniert, besteht Ihre einzige echte Option, um sicherzustellen, dass Sie die Verwendung abfangen, darin, eine serverseitige Ablaufverfolgung mit dem Audit Database Object AccessEreignis zu verwenden:
Richten Sie dann einen Job ein, der die Dateidaten abruft und die Anzahl alle paar Stunden (oder sogar Tage, abhängig von der Datengenerierungsrate) aggregiert, und Sie können die auftretenden Zugriffe genau nachverfolgen.
Ja, ich hasse Trace genauso wie den nächsten, aber dies ist eines dieser Szenarien, in denen es das richtige Werkzeug für die jeweilige Aufgabe ist.
FWIW, 2012 konnten Sie auch Server Audit oder Extended Events verwenden , um den Objektzugriff zu verfolgen. Sobald Sie jedoch die Trace-Definition für 2000 erstellt haben, sollte sie größtenteils bis 2012 portierbar sein und Sie können Profiler zum Generieren verwenden die Skripte, um die Arbeit zu vereinfachen.
Das sieht sehr vielversprechend aus, aber ich konnte SQL Server 2000 nicht dazu bringen, etwas für Ansichten zu protokollieren. Wenn ich mit dem Ereignis Objects-Object: Opened einen Trace für alle Objekttypen ausführe, erhalte ich keine Treffer. (In der Hilfe zu diesem Ereignis heißt es: "Gibt an, wann auf ein Objekt zugegriffen wurde, z. B. für eine SELECT-, INSERT- oder DELETE-Anweisung.") Es gibt kein Objektzugriffsereignis, das ich sehen kann.
Wenn Sie 100% genau sein möchten, wird der Plan-Cache leider nicht gekürzt, da es in SQL Server alle Arten von Szenarien gibt, in denen ein Plan möglicherweise überhaupt nicht zwischengespeichert wird. Zum Beispiel OPTION (RECOMPILE), Nullkostenpläne, Optimierung für Ad-hoc-Workloads und Single-Use-Plan-Stubs usw.
Da Sie eine Methode wünschen, die zwischen 2000 und 2012 funktioniert, besteht Ihre einzige echte Option, um sicherzustellen, dass Sie die Verwendung abfangen, darin, eine serverseitige Ablaufverfolgung mit dem
Audit Database Object Access
Ereignis zu verwenden:http://msdn.microsoft.com/en-us/library/ms175013.aspx
Sie möchten nach filtern,
ObjectType = 8278
damit Sie nur Ansichten abrufen , auf die zugegriffen wird:http://msdn.microsoft.com/en-us/library/ms180953.aspx
Richten Sie dann einen Job ein, der die Dateidaten abruft und die Anzahl alle paar Stunden (oder sogar Tage, abhängig von der Datengenerierungsrate) aggregiert, und Sie können die auftretenden Zugriffe genau nachverfolgen.
Ja, ich hasse Trace genauso wie den nächsten, aber dies ist eines dieser Szenarien, in denen es das richtige Werkzeug für die jeweilige Aufgabe ist.
FWIW, 2012 konnten Sie auch Server Audit oder Extended Events verwenden , um den Objektzugriff zu verfolgen. Sobald Sie jedoch die Trace-Definition für 2000 erstellt haben, sollte sie größtenteils bis 2012 portierbar sein und Sie können Profiler zum Generieren verwenden die Skripte, um die Arbeit zu vereinfachen.
quelle