22,207
社区成员
发帖
与我相关
我的任务
分享
select
type,
sum(virtual_memory_reserved_kb) as [VM Reserved], --从buffer pool中保留的大小
sum(virtual_memory_committed_kb) as [VM Committed], --从buffer pool中提交的大小
--是Buffer Pool里的Stolen Memory的大小.在Buffer Pool中通过Stolen分配的,也就是直接Commit分配的内存量.
sum(single_pages_kb) as [SinlgePage Allocator],
--分配的多页内存量(KB),是使用内存节点的多页分配器分配的内存量。此内存在buffer pool外分配,是SQL Server自己的代码使用的MemToLeave大小。
sum(multi_pages_kb) as [MultiPage Allocator],
--内存Clerk使用地址窗口化扩展插件(AWE)分配的内存量。当启用AWE时,只有缓冲池Clerk(MEMORYCLERK_SQLBUFFERPOOL)使用此机制,不可为空值。
--可以由buffer pool使用的内存量
sum(awe_allocated_kb) as [AWE Allocated],
sum(shared_memory_reserved_kb) as [SM Reserved], --内存Clerk保留的共享内存量,保留给共享内存和文件映射使用.
sum(shared_memory_committed_kb) as [SM Committed] --内存Clerk提交的共享内存量,和上面的字段一起可以追踪Shared Memory的大小.
from sys.dm_os_memory_clerks
group by type
order by type
4.接下来,是查询为什么变慢的问题。
向上面说的,可能是由于表经常进行插入,删除,修改,导致了存储碎片,这样会导致查询同样的数据,需要更多的IO,也需要更多的内存,那么效率自然下降,同时内存的效率下降,间接导致需要吃更多的内存,这个可以通过重建表和索引,来完成。
还有,就是随着数据的变化,表的统计信息不够准确,导致查询优化器不能够生成足够优化的执行计划,
那么查询自然会慢,这个主要是通过update statistics 表 ,来更新统计信息就可以。
还有最关键的是,你的查询是否通过索引来访问数据,因为索引的效率更高,否则,用表扫描的话,效率非常差。