Ich möchte den Microsoft-SQL-Server-Cache auf meiner Instance von Amazon Relational Database Service (Amazon RDS) für Microsoft SQL Server leeren. Wie kann ich das tun, ohne meine DB-Instance neu zu starten?
Kurzbeschreibung
Es gibt mehrere Möglichkeiten, den SQL-Server-Cache zu leeren, von sehr detailliert bis zum vollständigen Löschen des Cache. Sie können die folgenden Tools verwenden, um den Cache zu leeren. Alle diese Tools sind mit Database Console Commands (DBCC) für SQL Server verfügbar:
- DBCC FREEPROCCACHE: Leert den Cache, indem der gesamte Plan-Cache entfernt wird. Dieser Befehl kann auch bestimmte Pläne entfernen oder Cache-Einträge entfernen, die an einen Ressourcenpool gebunden sind.
- DBCC FREESYSTEMCACHE: Neben dem Entfernen von Elementen aus dem Plan-Cache kann DBCC FREESYSTEMCACHE auch andere Arbeitsspeicher-Caches leeren.
- DBCC ALTER DATABASE SCOPED CONFIGURATION: Dieser Befehl ist ab SQL Server 2016 verfügbar.
Lösung
Hinweis: Es ist eine bewährte Methode, die folgenden Befehle gründlich zu testen, bevor Sie sie in Ihrer Produktionsumgebung ausführen. Tests helfen dabei, potenzielle Probleme zu identifizieren, die während der Implementierung auftreten können.
Identifikation der fünf wichtigsten Caches und des verwendeten Arbeitsspeichers
Führen Sie den folgenden Befehl aus, um die fünf wichtigsten Caches und den verwendeten Arbeitsspeicher zu identifizieren:
SELECT TOP(5) name AS [Name],
SUM(pages_kb) AS [SizeKb]
FROM sys.dm_os_memory_cache_counters WITH (NOLOCK)
GROUP BY name
ORDER BY SizeKb DESC
Entfernen eines Plans aus dem Cache (Parameter-Sniffing-Problem)
Führen Sie den folgenden Befehl aus, um den fehlerhaften Plan zu identifizieren:
SELECT cp.plan_handle, cp.objtype, cp.usecounts,
DB_NAME(st.dbid)
AS [DatabaseName], st.text
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE st.text LIKE N'%[search string]%' OPTION (RECOMPILE);
Führen Sie einen der folgenden Befehle aus, um den fehlerhaften Plan zu entfernen:
DBCC FREEPROCCACHE (plan_handle);
oder
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE [plan_handle];
Entfernen von Plänen nach Bedarf und vorbereiteten Plänen aus dem Cache
Wenn Sie zu viele Pläne nach Bedarf im Cache haben, führen Sie den folgenden Befehl aus, um sie zu entfernen:
DBCC FREESYSTEMCACHE ('SQL Plans')
Leeren des Plan-Caches der aktuellen Datenbank
Wenn Sie SQL Server 2016 oder höher ausführen, führen Sie den folgenden Befehl aus:
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
oder
DBCC FREESYSTEMCACHE('DatabaseName')
Wenn Sie eine SQL-Server-Version vor SQL 2016 verwenden, führen Sie den folgenden Befehl aus:
declare @dbid int = (select DB_ID())
DBCC FLUSHPROCINDB (@dbid);
Leeren aller Caches
DBCC FREESYSTEMCACHE('ALL')
oder
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
Hinweis: Der Befehl DBCC DROPCLEANBUFFERS wird verwendet, um alle Caches und den Pufferpool zu leeren. Dieser Befehl wird in Amazon RDS für SQL Server nicht unterstützt, da er die Mitgliedschaft in der festen Serverrolle sysadmin erfordert.