Wie leere ich den Puffer-Cache oder andere Caches, ohne meine RDS-für-SQL-Server-Instance neu zu starten?

Lesedauer: 3 Minute
0

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.