我正在使用SQL Server 2008 R2。
我知道DBCC FREEPROCCACHE
会清除SQL Server中所有存储过程的缓存。
但是我需要清除仅1个存储过程的缓存。如何做到这一点?
存储过程名称为Rpt_RegionReport
。我不想使用WITH RECOMPILE
选项执行存储过程。
我正在使用SQL Server 2008 R2。
我知道DBCC FREEPROCCACHE
会清除SQL Server中所有存储过程的缓存。
但是我需要清除仅1个存储过程的缓存。如何做到这一点?
存储过程名称为Rpt_RegionReport
。我不想使用WITH RECOMPILE
选项执行存储过程。
DBCC FreeProcCache
有一个可选参数——你想要删除的执行计划的ID。
你可以使用sys.dm_exec_cached_plans
查找要删除的计划,然后只需将其用作:
DBCC FREEPROCCACHE (0x0123456....);
select cp.plan_handle from sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st where OBJECT_NAME(st.objectid, st.dbid) = 'Rpt_RegionReport'
,然后将其存储在一个变量中,并传递给DBCC FREEPROCCACHE
。 - srh以下是另一种仅针对存储过程从缓存中删除计划的方法:
DECLARE @PlanHandle VARBINARY(64);
SELECT @PlanHandle = deps.plan_handle
FROM sys.dm_exec_procedure_stats AS deps
WHERE deps.object_id = OBJECT_ID('dbo.SomeProcedureName') AND deps.database_id = DB_ID();
IF @PlanHandle IS NOT NULL
BEGIN
DBCC FREEPROCCACHE(@PlanHandle);
END
GO
sp_recompile
不会起作用吗?EXEC sp_recompile N'SP_Name';
SELECT [text], cp.size_in_bytes, plan_handle
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE cp.cacheobjtype = N'Compiled Plan'
AND cp.objtype = N'Adhoc'
AND cp.usecounts = 1
ORDER BY cp.size_in_bytes DESC;
DBCCFREEPROCCACHE(0x0600010069AB592540C10089000000000000000000000000)
计划处理
cp.objtype = N'Adhoc' AND cp.usecounts = 1
,因为这可能会过滤掉相关的计划。你不能假设测试人员只从 SSMS 运行存储过程;用户也可能从应用程序代码或测试框架中运行它。而根据sys.dm_exec_cached_plans页面所述,当使用 showplan 时,usecounts
可能会被多次增加。 - Solomon Rutzky--Enter Name of your Procedure. I have used here as 'SP_PrepareCustomers'. You should replace it with the name of your procedure.
DECLARE @NameOfProcedure VARCHAR(255) = 'SP_PrepareCustomers'
DECLARE @planHandle VARBINARY(64) = (SELECT top 1 plan_handle
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE cp.cacheobjtype = N'Compiled Plan'
AND cp.objtype = N'Proc'
AND cp.usecounts = 1
AND TEXT LIKE '%' + @NameOfProcedure + '%')
IF @planHandle IS NOT NULL
BEGIN
PRINT 'Procedure with name like ' + @NameOfProcedure + ' plan handle found with value as given below:'
PRINT @planHandle
DBCC FREEPROCCACHE (@planHandle)
PRINT 'Execution plan cleared for the procedure'
END
ELSE
BEGIN
PRINT 'No Plan was found for the selected procedure '
+ @NameOfProcedure
END