Как очистить кеш из 1 хранимой процедуры на сервере sql
Я использую SQL Server 2008 R2.
Я знаю, что DBCC FREEPROCCACHE
очистит кэш всех хранимых процедур в SQL Server.
Но мне нужно очистить кеш только из 1 хранимой процедуры. Как я могу это сделать?
Имя хранимой процедуры - Rpt_RegionReport
. Я не хочу выполнять хранимую процедуру с опцией WITH RECOMPILE
.
Ответы
Ответ 1
DBCC FreeProcCache
имеет один необязательный аргумент - идентификатор плана выполнения, который вы хотите удалить.
Вы можете найти план, который хотите удалить, используя sys.dm_exec_cached_plans
, а затем вы можете просто использовать его как
DBCC FREEPROCCACHE (0x0123456....);
Ответ 2
просто найдите план, используя этот запрос, и очистите plan_handle
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)
Plan_handle
Ответ 3
Вот еще один способ удалить план из кэша только для хранимой процедуры:
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
Ответ 4
Запрос, данный @mohan, может иметь некоторые проблемы, так как он фильтрует только objtype как Adhoc, что означает, что здесь будут отображаться все другие запросы, исключая процедуру.
Поэтому, пожалуйста, выполните следующий набор инструкций, чтобы выборочно очистить только выбранный план выполнения процедуры.
--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
Ответ 5
Не хотите выполнить sp_recompile для хранимых процедур?
EXEC sp_recompile N'SP_Name ';