【问题标题】:What causes execution plans to be removed from plan cache quickly?是什么导致执行计划快速从计划缓存中删除?
【发布时间】: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


【解决方案1】:

正如@clifton_h 在上面的评论中指出的那样,它与内存有关。我将实例最大内存从 2GB 更改为 4GB,现在测试脚本始终通过。

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 2012-06-19
    • 2012-02-18
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2014-06-20
    相关资源
    最近更新 更多