Как очистить кеш из 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 ';