it-swarm.com.de

Wie kann ich den SQL Server-Abfragecache leeren?

Ich habe eine einfache Abfrage gegen SQL Server 2005 ausgeführt

SELECT * 
FROM Table 
WHERE Col = 'someval'

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

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

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

187
PaulB

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

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

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 auszuführen, 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.

245
Saar

Acht verschiedene Möglichkeiten zum Löschen des Plan-Caches

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 leeren. Wenn Sie den Plan-Cache freigeben, wird beispielsweise eine gespeicherte Prozedur neu kompiliert, anstatt sie erneut aus dem Cache zu verwenden. Dies kann zu einem plötzlichen, vorübergehenden Rückgang 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 ausgibt, 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 aus dem Plan-Cache für eine Datenbank (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 12

9
Somnath Muluk

Die Frage ist zwar nur ein bisschen alt, aber das könnte trotzdem 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 es behebt sie vorerst.

OPTION (OPTIMIZE FOR UNKNOWN)

Dann wird Ihre Anfrage so aussehen

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
9
Tony Basallo
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 vom aktuellen Wert abweicht.

Übrigens ist das, was die Beschleunigung verursacht, nicht der Abfragecache, sondern der Datencache.

6
erikkallen

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

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 tue dies, um die Abfrageleistung zu testen, ohne mich mit zwischengespeicherten Plänen befassen zu müssen.

Weitere Details zum SQL Azure-Prozedurcache hier

3
MSC