【发布时间】:2017-02-01 03:44:44
【问题描述】:
我想知道是什么导致执行计划从 SQL Server 2012 (SP3) 计划缓存中快速删除(
当我在我的代码中运行此脚本时,该计划一开始就存在,但在不到 1 分钟的时间内就过期了,没有发生其他有意义的活动。这是在具有 16G RAM 的开发机器上,在执行时有超过 8G 的空闲空间。 SQL Server 实例的最大内存限制为 2G。
create table Temp923835 (id int);
go
insert into Temp923835 select message_id from sys.messages;
go
select count(*) from Temp923835 a inner join Temp923835 b on (a.id=b.id) where a.id > 3
go
SELECT 'First Pass' as Phase, query_plan, text
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp
where text like 'select count(*) from Temp923835%';
waitfor delay '00:01:00';
SELECT 'Second Pass' as Phase, query_plan, text
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp
where text like 'select count(*) from Temp923835%';
drop table Temp923835;
我希望缓存会停留一段时间。
【问题讨论】:
-
必须快速检查以提醒自己...无论如何听起来像是内存问题。默认情况下,SQL Server 会保留计划一段时间,但由于它存储在内存中,因此如果它的缓存空间有限,则可以替换您的计划。您应该通过系统表了解您的内存消耗量。例如,每个查询在执行前都分配了一定数量的内存,所以如果你发生了一些令人讨厌的事情,你不会/可能看不到 I/O 高,但是你的内存被消耗了。
-
你似乎是对的。在我的本地计算机上将最大内存更新为 4 GB 可以让 1 分钟的测试始终如一地通过。谢谢!
标签: sql-server sql-execution-plan