我有一个蔚蓝的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左右,因此以某种方式不会下降。
我没有收到任何错误(没有任何权限被拒绝等),那么该命令如何不清除缓存?
答案 0 :(得分:1)
我没有时间调试代码以100%保证,但是根据我对系统的了解,很可能仅仅修改数据库模式版本(发生在任何alter database命令上)都会使代码失效。下次使用时缓存中的条目。由于过程高速缓存是实例范围的,因此清除与数据库关联的条目的任何尝试都需要将所有条目一一遍历,而不仅仅是释放整个高速缓存。
因此,您可以认为这会使整个缓存无效,但是在重新编译条目时或者在系统其他部分通过后续操作回收内存时,会从缓存中延迟删除条目。
康纳·坎宁安(Conor Cunningham) SQL架构师
答案 1 :(得分:0)
我联系了Microsoft支持并立即了解了它。
尝试在AdventureWorks数据库上运行以下T-SQL。
-- 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命令。