大家好,
我有一个包含数千个触发器和数据库的数据库。存储过程。 所以我的客户有一个大问题,每天都有一些对象从缓存中清除,然后我的应用程序的一些流程在他们第一次执行时需要一些时间(30,40秒),下次不到一秒钟。但是,如果他们等待2-3小时,那么物体就会被清除,我的流动也会很慢。
所以我的问题是:是否有办法强制SQL Server缓存某些对象,因为他很长时间才能重新加载这些对象。我有很多内存(30 Giga可用,所以我认为我可以缓存很多对象)
先谢谢您的帮助
答案 0 :(得分:0)
有一种方法可以强制SQL Server缓存某个对象,因为他很长时间才能重新加载这些对象
在摘要中,但是如果您使用的是SQLServer 2012,则可以使用InMemory OLTP对象
希望以下帮助您处理内存问题
我有很多内存(30 Giga可用,所以我认为我可以缓存很多对象)
即使你有足够的RAM,缓冲池可以使用的缓存量将取决于MAX服务器内存配置,所以我假设你已经正确设置
一旦你正确设置了这个值,你必须要知道,这个Cache将用于很多东西,但下面是主要的
1.Pages
2.执行计划缓存
如果该服务器中有很多数据库并且运行了很多查询,那么30GB可能还不够......
使用以下查询,您可以识别哪个数据库正在使用更多内存
SELECT COUNT(*) *8 AS memoryusedKB
,CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(database_id)
END AS database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) ,database_id
ORDER BY memoryused DESC;
如果你想按对象隔离,你也可以这样做
SELECT COUNT(*)AS cached_pages_count
,name ,index_id
FROM sys.dm_os_buffer_descriptors AS bd
INNER JOIN
(
SELECT object_name(object_id) AS name
,index_id ,allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.hobt_id
AND (au.type = 1 OR au.type = 3)
UNION ALL
SELECT object_name(object_id) AS name
,index_id, allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.partition_id
AND au.type = 2
) AS obj
ON bd.allocation_unit_id = obj.allocation_unit_id
WHERE database_id = DB_ID()
GROUP BY name, index_id
ORDER BY cached_pages_count DESC;
现在您知道,哪个数据库消耗更多内存,您可以查看哪个内存池消耗更多内存
select type,sum(pages_kb)*128 as memoryusedMB
from sys.dm_os_memory_clerks
group by type
此时,您已完全了解服务器中的内存使用情况
因此您可以尝试进一步消除Kimberely Tripp下面脚本中的浪费,该脚本从Adhoc计划的数据库中删除缓存条目:Plan cache and optimizing for adhoc workloads
下面的脚本为您提供单个对象计划的内存使用情况,您可以查看是否可以接受。检查相同的链接,您将有一个脚本来删除这些条目
SELECT objtype AS [CacheType],
COUNT_BIG(*) AS [Total Plans],
SUM(CAST(size_in_bytes AS DECIMAL(18, 2))) / 1024 / 1024 AS [Total MBs],
AVG(usecounts) AS [Avg Use Count],
SUM(CAST((CASE WHEN usecounts = 1 THEN size_in_bytes
ELSE 0
END) AS DECIMAL(18, 2))) / 1024 / 1024 AS [Total MBs – USE Count 1],
SUM(CASE WHEN usecounts = 1 THEN 1
ELSE 0
END) AS [Total Plans – USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs – USE Count 1] DESC
此外,您可以在内存中使用锁定页面,这会强制sql server将页面保留在内存中。但我不会使用它。您可以在此处阅读以获取更多信息