Wir löschen alte gespeicherte Prozeduren und Tabellen.
Wie kann ich wissen, welche Verfahren in letzter Zeit nicht aufgerufen wurden?
dm_exec_procedure_stats
und dm_exec_query_stats
sind nicht zuverlässig, da sie nur Prozeduren im Plan-Cache zurückgeben.
sql-server
sql-server-2008
stored-procedures
maintenance
Felipe Fujiy Pessoto
quelle
quelle
Antworten:
Wenn
sys.dm_exec_procedure_stats
dies für Sie nicht zuverlässig ist (wahrscheinlich mehr, weil die Informationen Neustarts nicht überleben als alles, was mit dem Plan-Cache zu tun hat), verfolgt SQL Server dies auf keine andere Weise.Die einzige Möglichkeit, dies zu tun, besteht darin, Ihren gespeicherten Prozeduren (oder der App, die sie aufruft, wenn dies machbar und umfassend genug ist) eine Protokollierung hinzuzufügen oder eine sehr zielgerichtete serverseitige Ablaufverfolgung fortlaufend auszuführen und die Ablaufverfolgung zu überprüfen.
Beachten Sie auch, dass eine Prozedur, die in einer Woche nicht aufgerufen wurde, nicht bedeutet, dass sie morgen nicht aufgerufen wird. Möglicherweise haben Sie Berichterstattungsverfahren, die nur monatlich oder jährlich aufgerufen werden, oder obskure Vorgänge, die nicht sehr häufig vorkommen. Das Löschen dieser gespeicherten Prozedur kann in Tagen oder Wochen katastrophale Folgen haben, möglicherweise über jede Sicherung hinaus, die Sie zu diesem Zeitpunkt haben (und vorausgesetzt, Sie befolgen nicht die Best Practices und speichern Ihre gespeicherten Prozeduren in der Quellcodeverwaltung).
Der sicherste Weg, IMHO, besteht darin , gespeicherte Prozeduren (möglicherweise mit einem
zzz_
Präfix, damit sie am Ende aller Listen sortiert werden) umzubenennen , die Sie bereits auf andere Weise als potenzielle Kandidaten für "zu alt" identifiziert haben - zumindest dann, wenn Sie dies tun Wenn Sie dies versehentlich tun, und etwas kaputt geht, ist es einfach genug, es erneut umzubenennen und die Funktionalität wiederherzustellen, ohne in Backups nach altem Code suchen zu müssen. Nur löschen , die Verfahren , wenn ein Konjunkturzyklus durchlaufen hat und niemand beschwert hat.quelle
Wenn Sie die Prozeduren ändern können, fügen Sie zu Beginn jeweils eine Zeile hinzu (dies ist ziemlich einfach zu automatisieren):
Die Verwendung
sp_trace_generateevent
ist ziemlich harmlos und hat keinen Einfluss auf den Ablauf / das Ergebnis / das Ergebnis der Prozedurausführung. Am wichtigsten ist, dass es keine Interaktion mit der aktuellen Transaktion gibt. Eine schreibgeschützte Prozedur wird nicht in eine Datenschreibprozedur mit allen Auswirkungen auf die Protokollierung und Sperrung umgewandelt. Wenn es kein Trace-Überwachungsereignis 82 gibt, ist derexec
Anruf grundsätzlich kostenlos (no-op).Erstellen Sie als Nächstes eine serverseitige Ablaufverfolgung und erfassen Sie das Ereignis 82 (das erste Benutzerereignis). Sammeln Sie nach n Tagen die generierten Spuren und aggregieren Sie die Nutzung. Stellen Sie sicher, dass Ihre Ablaufverfolgung auf eine Festplatte mit ausreichend Speicherplatz und ausreichender E / A-Bandbreite schreibt. Für zusätzliche Gutschrift können Sie die Traces auch regelmäßig überprüfen und Anrufe
exec
aus allen dort gefundenen Verfahren entfernen , da nachweislich aufgerufen wird.quelle
INSERT ... (@var)
, Das kein Prozeduraufruf ist. Und hat nicht einen Prozeduraufruf in einem Batch eingebettet erfassen, z. B.exec sp_foo 'bar'
. Neben der Korrektheit kann die handgemachte Nachverfolgung offensichtlich bekannte, häufig genannte Verfahren eliminieren und sich nur auf diejenigen konzentrieren, bei denen der Verdacht besteht, dass sie niemals aufgerufen werden. Ich sehe viele Vorteile.Zu wissen, was in letzter Zeit aufgerufen wurde, hilft nur bei häufig aufgerufenen Dingen, und viele Objekte in einer komplexen Datenbank werden nicht so oft aufgerufen, werden aber dennoch benötigt. Ich kenne keinen einfachen Weg, um festzustellen, was nicht verwendet wird.
Was ich tun würde, ist Profiler auf meiner Entwickler- oder QA-Box zu starten und dann jede Anwendung, die darauf trifft, zu nehmen und die Funktionalität auszuführen. (Wenn Sie eine formelle Qualitätssicherung haben, hilft eine gute Reihe von Regressionstests dabei). Ich würde meine Ablaufverfolgung so einrichten, dass sie in eine Tabelle schreibt. Jetzt wissen Sie zumindest, was die Anwendungen aufrufen, und können sie aus der Liste streichen.
Stellen Sie sicher, dass jeder Job auf dem Produktserver einen entsprechenden Job auf Ihrem Testserver hat, und führen Sie ihn aus. Das sollte noch mehr finden.
Inzwischen ist Ihre Liste potenzieller SPs viel kleiner.
Ihre Liste der aktiven Tabellen sollte nur diejenigen enthalten, die in einem der Prozesse und Tabellen aufgeführt sind, von denen Sie wissen, dass Sie sie benötigen, z. B. Audittabellen. YoOu kann eine Liste von Potenzialen für die Beseitigung von dort erstellen.
Sobald Sie die Liste der zu eliminierenden Potenziale haben, werden Sie wahrscheinlich einige ziemlich offensichtliche wie usp_my_proc_Old sehen (wenn Sie einen USP_My_proc in der Datenbank haben). Das sind meine ersten Kandidaten, die eliminiert werden. Tabellen ohne Daten sind an dieser Stelle weitere offensichtliche Tabellen. Tabellen / Prozesse, die eindeutig auf eine Funktionalität verweisen, von der Sie wissen, dass sie entfernt wurde, sind die nächsten. Angenommen, Sie haben kürzlich die Funktionalität zum Speichern von Umfrageergebnissen durch ein neues Design ersetzt. Möglicherweise möchten Sie die Tabelle behalten (möglicherweise benötigen Sie die Daten), aber die Prozesse, die diese Tabelle aufrufen, sind wahrscheinlich alle veraltet und können gelöscht werden.
Abhängig von Ihren rechtlichen Einschränkungen möchten Sie möglicherweise keine Tabelle mit Daten entfernen. Wir haben kundenspezifische Daten für Kunden, die wir nicht mehr haben, da wir uns in einer regulierten Branche befinden und gelegentlich gebeten werden, Wirtschaftsprüfern, Aufsichtsbehörden und Anwälten Daten zur Verfügung zu stellen. Sie können diese Tabellen jedoch in eine andere Archivdatenbank verschieben, wenn Sie Ihre eigentliche Produktionsdatenbank bereinigen möchten.
Dann schauen Sie sich an, was sie tun. Sie können jeden Prozess entfernen, der nicht ausgeführt wird, insbesondere wenn eine der Tabellen, auf die er verweist, nicht mehr vorhanden ist. Wenn eine Tabelle ein Datumsfeld hat, gibt es aktuelle Daten? Wenn das Datenfeld das letzte Mal mit einem Datum gefüllt wurde, war dies ein guter Kandidat für eine Tabelle, die wir nicht mehr benötigen.
Sobald Sie eine Liste mit mehreren potenziellen Objekten zum Löschen haben, senden Sie die Liste an alle Ihre Entwickler und fragen Sie sie, ob sie die Tabelle / den Prozess verwenden oder wissen, wofür sie gedacht sind. Tun Sie dies nicht mit einer riesigen Liste von Tausenden von Objekten. Senden Sie nicht mehr als 10 bis 20 gleichzeitig und versuchen Sie, sie zu gruppieren, damit sie eindeutig zu verwandten Themen gehören.
Um potenzielle Probleme zu beseitigen, können Sie dem Prozess einen Protokollierungsprozess oder der Tabelle einen Protokollierungsauslöser hinzufügen und ein Datum festlegen, an dem das Objekt entfernt wird, wenn bis zu diesem Datum keine Einträge vorhanden sind.
quelle
Führen Sie eine Ablaufverfolgung für Folgendes aus:
Ziehen Sie in Betracht, nach Datenbank-IDs zu filtern. Sobald Sie genügend Daten zusammengestellt haben, können Sie Ihre Entscheidungen treffen. Beachten Sie natürlich, dass ein Trace einen Leistungseinbruch aufweist. Stellen Sie daher sicher, dass dieser Treffer keine betrieblichen Probleme verursacht.
quelle
Einer meiner Kunden hat genau das gleiche Problem, aber es ist das schlimmste Beispiel, das ich je gesehen habe. Einige betrügerische Entwickler haben Tausende von gespeicherten Prozeduren (über 6 KB) generiert, von denen die meisten nicht verwendet werden.
Sie rufen jetzt alle 5 Minuten sys.dm_exec_cached_plans ab und fügen sie zur Verfolgung in eine Tabelle ein. Es werden nur gespeicherte Prozedurnamen eingefügt, die noch nicht in der Tabelle vorhanden sind.
Wie bereits erwähnt, wird dringend empfohlen, vierteljährliche / jährliche Geschäftszyklen zu durchlaufen.
quelle
Das Problem ist nicht, dass DMVs unzuverlässig sind, sondern dass sie nicht die gewünschten Informationen erfassen. Erstellen Sie einen Job, der regelmäßig ausgeführt wird und mit dem die gewünschten Informationen erfasst werden. Führen Sie ihn zweimal täglich aus, wenn Ihre Daten innerhalb von 24 Stunden abfallen. Angesichts der Tatsache, dass die DMVs nicht wirklich intensiv sind, auch nicht stündlich, wenn Sie möchten.
quelle