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.

PatFromCanada
quelle

Antworten:

8

Obwohl diese Antwort akzeptiert wurde, finden Sie in der Antwort von Jonathan Kehayias unten einen viel besseren Weg, dies zu tun.


Für SQL Server 2012 können Sie den Plan-Cache auf den Namen der Ansicht überprüfen.

DECLARE     @FindSql nvarchar(max) = 'name_of_view';
SELECT 
    /* cp.*, ct.* */
    cp.objtype AS [Type],
    cp.refcounts AS ReferenceCount,
    cp.usecounts AS UseCount,
    cp.size_in_bytes / 1024 AS SizeInKB,
    db_name(ct.dbid) AS [Database],
    CAST(pt.query_plan as xml) as QueryPlan
FROM sys.dm_exec_cached_plans cp
OUTER APPLY sys.dm_exec_text_query_plan(plan_handle, 0, -1) pt
OUTER APPLY sys.dm_exec_sql_text(plan_handle) AS ct
WHERE (ct.text LIKE '%' + @FindSql + '%') OR (pt.query_plan LIKE '%' + @FindSql + '%')
ORDER BY cp.usecounts DESC;

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%'
ORDER BY dbid,usecounts DESC,objtype
Max Vernon
quelle
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:

http://msdn.microsoft.com/en-us/library/ms175013.aspx

Sie möchten nach filtern, ObjectType = 8278damit 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.

Jonathan Kehayias
quelle
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.
PatFromCanada