ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE не удаляется кеш? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть база данных Azure PaaS, и я хотел бы очистить кеш для проверки некоторых SP.Итак, я нашел несколько сценариев из Интернета:

-- run this script against a user database, not master

-- count number of plans currently in cache

select count(*) from sys.dm_exec_cached_plans;

-- Executing this statement will clear the procedure cache in the current database, which means that all queries will have to recompile.

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

-- count number of plans in cache now, after they were cleared from cache

select count(*) from sys.dm_exec_cached_plans;

-- list available plans

select * from sys.dm_exec_cached_plans;

select * from sys.dm_exec_procedure_stats 

Однако объем кэша всегда составляет около 600-800, так что почему-то он не сбрасывается.

Я не получил ни одногоошибка (нет доступа запрещен и т.д.), так как эта команда не очищает кеш?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я связался со службой поддержки Microsoft и понял это сейчас.

Попробуйте запустить следующий T-SQL в базе данных AdventureWorks.

-- create test procedure
create or alter procedure pTest1
as begin 
  select * from salesLT.product where ProductCategoryID =27
end
go


-- exec the procedure once.
exec pTest1


-- check for cached plan for this specific procedure - cached plan exists
select * from sys.dm_exec_cached_plans p 
cross apply sys.dm_exec_sql_text(p.plan_handle) st
where p.objtype = 'proc' and st.objectid = OBJECT_ID('pTest1')


-- clear plan cache
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

-- check for cached plan for this specific procedure - not exists anymore
select * from sys.dm_exec_cached_plans p 
cross apply sys.dm_exec_sql_text(p.plan_handle) st
where p.objtype = 'proc' and st.objectid = OBJECT_ID('pTest1')


-- cleanup
drop procedure pTest1
select 'cleanup complete' 

на этом примере мы можем подтвердить, что кэш плана являетсяоднако очищено для базы данных, sys.dm_exec_cached_plans распространяется на весь сервер и дает результаты других баз данных (внутренних системных баз данных) о том, что для них кэш не был очищен командой CLEAR PROCEDURE_CACHE.

0 голосов
/ 21 октября 2018

У меня не было времени на отладку кода, чтобы быть на 100% уверенным, но исходя из моего понимания системы, вполне вероятно, что простое изменение версии схемы базы данных (что происходит при любой команде alter database) сделает недействительнымзаписи в кеше при следующем использовании.Поскольку кэш процедуры является широким экземпляром, любая попытка очистить записи, связанные с базой данных, должна обходить все записи по одной, а не просто освобождать весь кэш.

Таким образом, вы можете думать об этом как об аннулировании всего кэша, но ленивом удалении записей из кэша по мере их перекомпиляции или если память освобождается другими частями системы посредством последующих действий.

Конор Каннингем Архитектор, SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...