Comment puis-je vider le cache de requête SQL Server?
j'ai une requête simple contre SQL Server 2005
SELECT *
FROM Table
WHERE Col = 'someval'
la première fois que j'exécute la requête peut prendre > 15 secs
. Les exécutes suivantes sont de retour dans < 1 sec
.
Comment puis-je obtenir SQL Server 2005 sans utiliser de résultats en cache? J'ai essayé de courir
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Mais cela ne semble pas avoir d'effet sur la vitesse de requête (toujours < 1 sec
).
5 réponses
Voici une bonne explication. check-out.
http://www.mssqltips.com/tip.asp?tip=1360
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
de l'article lié:
si tous les tests de performance sont effectués dans SQL Server, la meilleure approche peut être d'émettre un CHECKPOINT et ensuite la commande DBCC DROPCLEANBUFFERS. Bien que le processus de contrôle soit un processus automatique interne du système dans SQL Server et se produit sur une base régulière, il est important d'émettre cette commande pour écrire toutes les pages sales pour la base de données actuelle sur le disque et nettoyer les tampons. Ensuite, la commande DBCC DROPCLEANBUFFERS peut être exécutée pour supprimer tous les tampons du pool de buffers.
bien que la question soit un peu vieille, cela pourrait encore aider. Je rencontre des problèmes similaires et l'utilisation de l'option ci-dessous m'a aidé. Je ne sais pas si c'est une solution permanente, mais elle la répare pour le moment.
OPTION (OPTIMIZE FOR UNKNOWN)
alors votre requête sera comme ceci
select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO
quelle valeur vous spécifiez pour la mémoire du serveur n'est pas importante, tant qu'elle diffère de la valeur actuelle.
Btw, la chose qui provoque l'accélération n'est pas le cache de requête, mais le cache de données.
huit différentes façons de vider la cache plan
1. Supprimer tous les éléments du cache plan pour l'instance entière
DBCC FREEPROCCACHE;
utilisez ceci pour vider soigneusement le cache du plan. Libérer le cache plan permet, par exemple, de recompiler une procédure stockée au lieu de la réutiliser. Cela peut provoquer une soudaine baisse temporaire des performances des requêtes.
2. Videz le cache plan pour toute l'instance et supprimer le message d'achèvement régulier
"exécution de DBCC terminée. Si des messages d'erreur imprimés par le DBCC sont affichés, communiquez avec l'administrateur de votre système."
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
3. Videz le cache de plan ad hoc et préparé pour l'instance entière
DBCC FREESYSTEMCACHE ('SQL Plans');
4. Vider le cache du plan ad hoc et préparé pour une réserve de ressources
DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');
5. Videz la totalité du cache du plan pour un pool de ressources
DBCC FREEPROCCACHE ('LimitedIOPool');
6. Supprimer tous les éléments du cache plan pour une base de données (ne fonctionne pas en SQL Azure)
-- 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. Plan clair cache de la base de données actuelle
USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
8. Supprimer un plan de requête du 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);
notez que ni DBCC DROPCLEANBUFFERS;
ni DBCC FREEPROCCACHE;
ne sont pris en charge dans SQL Azure / SQL Data Warehouse.
cependant, si vous avez besoin de réinitialiser le plan cache en SQL Azur, vous pouvez modifier une des tables de la requête (par exemple, il suffit d'Ajouter puis supprimer une colonne), cela aura l'effet secondaire de supprimer le plan du cache.
personnellement, je fais cela comme un moyen de tester la performance de requête sans avoir à traiter avec des plans mis en cache.