Als Tag 12 des DBCC-Befehlsmonats bei SteveStedman.com , der heutige gekennzeichnete DBCC Befehl ist DBCC FREEPROCCACHE.
Beschreibung:
DBCC FREEPROCCACHE wird verwendet, um alle analysierten Abfragepläne aus dem Speicher zu löschen. Dies wird häufig in Entwicklungsumgebungen verwendet, in einer Produktionsumgebung jedoch nicht so häufig.
Die Verwendung in einer Entwicklungsumgebung ist üblich, z. B. wenn Sie an der Leistungsoptimierung oder Parametrierung von Abfragen arbeiten. Sie können den Prozedurcache mit DBCC FreeProcCache löschen, das Programm oder die Webseite ausführen, die möglicherweise die Datenbank verwendet, und dann sehen, was sich im Prozedurcache befindet. Dies kann nützlich sein, um Abfragen zu finden, die möglicherweise parametrisiert werden müssen. Eine andere Möglichkeit wäre, herauszufinden, welche Abfragen von einem Programm ausgeführt werden. Dazu arbeiten Sie zunächst mit einer Datenbank, die nicht von anderen verwendet wird, Löschen den Prozedurcache mit DBCC FreeProcCache, führen dann das Programm aus, das Sie herausfinden möchten, und schauen sich dann an, was sich im Cache befindet.
Verwendung in einer Produktionsumgebung sollte selten sein, dies ist eines der häufigsten Dinge zu versuchen, wenn SQL Server Schwierigkeiten hat. Wenn Sie an dem Punkt sind, an dem SQL Server extrem langsam reagiert und Sie die Ursache nicht finden konnten, sollten Sie versuchen, den Prozedurcache mit DBCC FreeProcCache freizugeben und zu prüfen, ob das Problem dadurch behoben wird.
DBCC FreeProcCache Syntax:
dbcc freeproccache
Beispiel:
Das folgende Beispiel stammt aus einer Entwicklungsumgebung mit der AdventureWorks2012-Datenbank.
Zuerst stellen wir eine Verbindung zu AdventureWorks2012 her und sehen, was sich im Cache befindet.
USE AdventureWorks2012;GOSELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
Hier sehen wir, dass es im Cache viel gibt. Als nächstes löschen wir den Cache mit DBCC FreeProcCache und schauen uns noch einmal an, was sich im Cache befindet.
DBCC FREEPROCCACHE;SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
Nach dem Ausführen von DBCC FreeProcCache können Sie sehen, dass sich nichts mehr im Cache befindet.
Wenn die nächste Abfrage ausgeführt wird, muss sie neu analysiert werden, anstatt eine bereits analysierte Abfrage im Cache zu verwenden. Dies dauert etwas länger, als wenn bereits ein analysierter Plan ausgeführt werden müsste. Lassen Sie uns 3 Abfragen ausführen und dann einen Blick auf den Cache werfen.
GOSELECT FirstName, MiddleName, LastName FROM person.Person p WHERE FirstName like 'John';GOSELECT FirstName, MiddleName, LastName FROM person.Person p WHERE FirstName like 'Mary';GOSELECT FirstName, MiddleName, LastName FROM person.Person p WHERE FirstName like 'Bill';
Beachten Sie die GO-Anweisung zwischen jeder Abfrage. Dadurch wird SSMS angewiesen, jede Abfrage als separaten Stapel auszuführen. Ohne die GO-Anweisung wären die 3 Abfragen als einzelner Stapel analysiert worden.
Hier sehen wir die Ergebnisse der drei Abfragen. Die ersten beiden gaben Ergebnisse zurück, und die dritte enthielt keine Zeilen in der Ergebnismenge. Werfen wir nun einen Blick auf den Cache
SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st;
Unten sehen wir jetzt insgesamt 20 Elemente im Cache. der zweite rot hervorgehobene Block enthält die 3 Abfragen von oben und der dritte Rest davon sind Abfragen, die von SQL oder anderen unterstützenden Abfragen ausgeführt werden. Zum Beispiel ist Zeile 13 der dm_exec_sql_text, der aus der obigen Abfrage aufgerufen wird, die den Plan überprüft.
Wenn wir dies nur auf die von uns geschriebenen Abfragen filtern möchten, können Sie dies tun, indem Sie der Abfrage eine WHERE text LIKE … Klausel hinzufügen, wie hier gezeigt.
SELECT size_in_bytes, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE text LIKE N'SELECT FirstName%';
Hier sehen wir, dass nur die drei Abfragen angezeigt werden und dass jede dieser drei ungefähr 40 KB Speicher auf SQL Server beansprucht. Also, warum gibt es drei Kopien der gleichen SELECT-Anweisung, das scheint ein bisschen verschwenderisch. In der Tat tut es, für weitere Informationen siehe einen früheren Beitrag mit dem Titel Wie viel Prozedurcache-Speicher belegt eine SQL-Anweisung? Es gibt Möglichkeiten, dies zu korrigieren.
DBCC FreeProcCache für ein bestimmtes Plan-Handle verwenden
Wenn Sie nur ein einzelnes Plan-Handle und nicht alle Plan-Handles löschen möchten, können Sie den optionalen Parameter @handle .
Um das Plan-Handle zu erhalten, ändern wir zunächst unsere frühere Abfrage, um anzuzeigen, was sich im Plan-Cache befindet. Sie könnten die WHERE Klausel auf Ihrem eigenen System weglassen, aber ich habe sie hier, um uns nur die drei fraglichen Abfragen von oben zu zeigen.
SELECT size_in_bytes, text, plan_handle FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE text LIKE N'SELECT FirstName%';
Hier sehen wir die gleichen drei Abfragepläne von früher, mit einer zusätzlichen Spalte namens plan_handle. Um ein einzelnes Plan-Handle freizugeben, kopieren wir einfach das numerische Plan-Handle und fügen es der DBCC FreeProcCache-Abfrage hinzu.
DBCC FREEPROCCACHE(0x060007000100FF3310B8DA7D0600000001000000000000000000000000000000000000000000000000000000);SELECT size_in_bytes, text, plan_handle FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE text LIKE N'SELECT FirstName%';
Wo wir nur 2 der drei ursprünglichen Abfragen im Plancache sehen.
Wie groß ist mein Prozedurcache?
Sie können die folgende Abfrage ausführen, um die Größe Ihres Prozedurcaches zu überprüfen.
SELECT count(*) AS NumPlans, objtype as Type,SUM(size_in_bytes)/(1024.0*1024.0) AS size_in_mbFROM sys.dm_exec_cached_plansGROUP BY objtype;
Was auf meinem Testserver zu den folgenden Ergebnissen führt.
Datenbankzustandsberichte und der Plancache
Sie können den Plancache auch mit der Anwendung Datenbankzustandsberichte anzeigen, wie hier gezeigt.
Anmerkungen:
Weitere Informationen finden Sie unter TSQL Wiki DBCC freeproccache.
DBCC Befehl Monat bei SteveStedman.com es macht fast so viel Spaß wie Wackelpudding zu essen.
Steve und das Team von Stedman Solutions sind für alle Ihre SQL Server-Anforderungen da.
Kontaktieren Sie uns noch heute für Ihre kostenlose 30-minütige Beratung..
Wir sind bereit zu helfen!