Wie kann ich den SQL Server-Abfragecache leeren?


199

Ich habe eine einfache Abfrage für SQL Server 2005

SELECT * 
FROM Table 
WHERE Col = 'someval'

Das erste Mal, wenn ich die Abfrage ausführe, kann dauern > 15 secs. Nachfolgende Ausführungen sind wieder in < 1 sec.

Wie kann ich SQL Server 2005 dazu bringen, keine zwischengespeicherten Ergebnisse zu verwenden? Ich habe versucht zu rennen

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Dies scheint jedoch (noch < 1 sec) keinen Einfluss auf die Abfragegeschwindigkeit zu haben .


Antworten:


259

Hier ist eine gute Erklärung. Schau es dir an.

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

Aus dem verlinkten Artikel:

Wenn alle Leistungstests in SQL Server durchgeführt werden, besteht der beste Ansatz möglicherweise darin, einen CHECKPOINT und anschließend den Befehl DBCC DROPCLEANBUFFERS auszugeben. Obwohl der CHECKPOINT-Prozess ein automatischer interner Systemprozess in SQL Server ist und regelmäßig ausgeführt wird, ist es wichtig, diesen Befehl auszugeben, um alle fehlerhaften Seiten für die aktuelle Datenbank auf die Festplatte zu schreiben und die Puffer zu bereinigen. Anschließend kann der Befehl DBCC DROPCLEANBUFFERS ausgeführt werden, um alle Puffer aus dem Pufferpool zu entfernen.


14
Eine Möglichkeit ist auch DBCC FREEPROCCACHE
Jaraics

1
Wenn Sie dropcleanbuffers verwenden, ist dies für alle, die mit der Datenbank verbunden sind, oder nur für diesen Benutzer?
Kris Nobels

1
@Kris: DBCC DROPCLEANBUFFERS, entfernt alle sauberen Puffer aus dem Pufferpool. Dies ist ein notwendiger Schritt bei der Optimierung der Abfrageleistung und sollte nicht unter Live-SQL Server verwendet werden.
Saar

Dies funktioniert gut für SQL Server. Beachten Sie jedoch, dass dies in SQL Azure nicht funktioniert. Ich habe unten eine alternative Lösung für das SQL Azure-Szenario veröffentlicht.
MSC

1
Gut, dies ist der einzige Befehl, der tatsächlich funktioniert, viele andere ausprobiert hat und nicht funktioniert hat.
Gabriel Rodriguez

15

Acht verschiedene Möglichkeiten, den Plan-Cache zu leeren

1. Entfernen Sie alle Elemente für die gesamte Instanz aus dem Plan-Cache

DBCC FREEPROCCACHE;

Verwenden Sie diese Option, um den Plan-Cache sorgfältig zu löschen. Durch das Freigeben des Plan-Cache wird beispielsweise eine gespeicherte Prozedur neu kompiliert, anstatt aus dem Cache wiederverwendet zu werden. Dies kann zu einer plötzlichen, vorübergehenden Verringerung der Abfrageleistung führen.

2. Leeren Sie den Plan-Cache für die gesamte Instanz und unterdrücken Sie die reguläre Abschlussmeldung

"DBCC-Ausführung abgeschlossen. Wenn DBCC Fehlermeldungen gedruckt hat, wenden Sie sich an Ihren Systemadministrator."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

3. Leeren Sie den Ad-hoc- und vorbereiteten Plan-Cache für die gesamte Instanz

DBCC FREESYSTEMCACHE ('SQL Plans');

4. Leeren Sie den Ad-hoc- und vorbereiteten Plan-Cache für einen Ressourcenpool

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

5. Leeren Sie den gesamten Plan-Cache für einen Ressourcenpool

DBCC FREEPROCCACHE ('LimitedIOPool');

6. Entfernen Sie alle Elemente für eine Datenbank aus dem Plan-Cache (funktioniert in SQL Azure nicht).

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

7. Löschen Sie den Plan-Cache für die aktuelle Datenbank

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

8. Entfernen Sie einen Abfrageplan aus dem Cache

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

Quelle 1 2 3


9

Obwohl die Frage nur ein bisschen alt ist, könnte dies dennoch helfen. Ich habe ähnliche Probleme und die Verwendung der folgenden Option hat mir geholfen. Ich bin mir nicht sicher, ob dies eine dauerhafte Lösung ist, aber sie behebt sie vorerst.

OPTION (OPTIMIZE FOR UNKNOWN)

Dann wird Ihre Anfrage so sein

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

1
Falsche Syntax in der Nähe des Schlüsselworts 'OPTION'. oder Falsche Syntax in der Nähe von 'UNBEKANNT'.
Pabrams

1
@pabrams Diese gehen nach (als Teil) Ihrer Anfrage wie folgt:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius

1
Stellen Sie einfach ABSOLUT sicher, dass Sie so etwas nicht versehentlich in den PRODUCTION-Code einfügen - da dies später zu großen Problemen führen kann.
Michael K. Campbell

4
OPTIMIZE FOR UNKNOWN hat nicht ignorieren zwischengespeichert Pläne. Beim Generieren eines Plans wird SQL Server vielmehr angewiesen, "durchschnittliche Verteilungswerte, unabhängig von einer [automatischen] Parametrisierung" zu wählen, um zu entscheiden, welcher Plan erstellt werden soll. Dies führt zu Plänen, die in uneinheitlichen Statistiken möglicherweise konsistenter sind. Eine OPTION (RECOMPILE) erstellt einen neuen Plan, bereinigt / gibt den Datencache jedoch nicht anderweitig frei. Dadurch werden normalerweise idealere Pläne auf Kosten der Planregenerierung und der Kosten für das Zwischenspeichern von Plänen generiert.
user2864740

6
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

Welchen Wert Sie für den Serverspeicher angeben, ist nicht wichtig, solange er sich vom aktuellen unterscheidet.

Übrigens ist das, was die Beschleunigung verursacht, nicht der Abfrage-Cache, sondern der Daten-Cache.


3

Beachten Sie, dass in SQL Azure / SQL Data Warehouse weder DBCC DROPCLEANBUFFERS;noch DBCC FREEPROCCACHE;unterstützt wird.

Wenn Sie jedoch den Plan-Cache in SQL Azure zurücksetzen müssen, können Sie eine der Tabellen in der Abfrage ändern (z. B. einfach eine Spalte hinzufügen und dann entfernen). Dies hat den Nebeneffekt, dass der Plan aus dem Cache entfernt wird .

Ich persönlich mache dies, um die Abfrageleistung zu testen, ohne mich mit zwischengespeicherten Plänen befassen zu müssen.

Weitere Informationen zum SQL Azure-Prozedurcache finden Sie hier


Das hat bei mir nicht funktioniert, dann war der Plan unverändert. Bitte sehen Sie hier stackoverflow.com/questions/46987785/…
Meneghino
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.