为了调查查询计划的使用情况,我试图了解内存中存储了哪种查询计划。
使用此查询:
SELECT objtype AS 'Cached Object Type',
COUNT(*) AS 'Numberof Plans',
SUM(CAST(size_in_bytes AS BIGINT))/1048576 AS 'Plan Cache SIze (MB)',
AVG(usecounts) AS 'Avg Use Counts'
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY objtype
服务器上有128Gb的RAM,大约20%是免费的。 SQL Server实例不受内存约束。
是的,基本上我有Adhoc查询(没有参数化,没有存储过程)。 但是为什么SQL Server会频繁清空查询计划缓存呢?我有什么问题?
答案 0 :(得分:2)
如果服务器没有内存压力,那么plan caching white paper的其他一些可能性就在下面。
是否经常安排这些行动?你有自动关闭功能吗?
以下操作会刷新整个计划缓存,因此, 导致第一次提交的批次的新编辑 算账:
- 分离数据库
- 将数据库升级到SQL Server 2005
- 将数据库升级到SQL Server 2008
- 恢复数据库
- DBCC FREEPROCCACHE命令
- RECONFIGURE命令
- ALTER DATABASE ,,, MODIFY FILEGROUP命令
- 使用ALTER DATABASE ... COLLATE命令
修改排序规则 醇>以下操作会刷新引用a的计划缓存条目 特定的数据库,并在之后引起新的编辑。
- DBCC FLUSHPROCINDB命令
- ALTER DATABASE ... MODIFY NAME = command
- ALTER DATABASE ... SET ONLINE命令
- ALTER DATABASE ... SET OFFLINE命令
- ALTER DATABASE ... SET EMERGENCY命令
- DROP DATABASE命令
- 数据库自动关闭时
- 使用CHECK OPTION创建视图时,将刷新创建视图的数据库的计划缓存条目。
- 运行DBCC CHECKDB时,将创建指定数据库的副本。作为DBCC CHECKDB的执行的一部分,一些查询反对 副本被执行,他们的计划被缓存。在DBCC结束时 CHECKDB的执行,副本被删除,查询计划也被删除 副本上提出的查询。
醇>
以下sp_configure
/ reconfigure
操作also clear the procedure cache:
- 访问检查缓存桶数
- 访问检查缓存配额
- clr enabled
- 并行成本阈值
- 跨数据库所有权链接
- index create memory
- 最大并行度
- 最大服务器内存
- max text repl size
- max worker threads
每个查询- 最小内存
- min server memory
- 查询州长费用限额
- 查询等待
- 远程查询超时
- 用户选项
答案 1 :(得分:2)
最后,只有实例重启解决了我的问题。现在计划缓存看起来更健康。
答案 2 :(得分:0)
大约一周前我遇到了同样的问题,并发布了几个问题。虽然我实际上没有找到问题的答案,但我对这个过程有了一些了解。并且愚蠢,因为它听起来SQL Server服务重启帮助但引发了另一个问题 - 恢复过程持续了4个小时。看起来像一个非常大的交易已经到位......