原文:谁占用了我的Buffer Pool

转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/11/buffer-pool.aspx

我在做SQL Server 7.0技术支持的时候有客户问我,“我的SQL Server buffer pool很大,有办法知道是哪些对象吃掉我的buffer Pool内存么?比方说,能否知道是哪个数据库,哪个表,哪个index占用了buffer Pool么?”当时我没有找到这个问题的答案,但是我一直记着这个问题。直到SQL server 2005 版本出现,这个问题迎刃而解。答案就是使用动态视图(DMV)sys.dm_os_buffer_descriptors。

这个DMV非常强大。根据SQL Server 联机丛书,这个视图的作用是 “返回有关 SQL Server 缓冲池中当前所有数据页的信息。可以使用该视图的输出,根据数据库、对象或类型来确定缓冲池内数据库页的分布”。具体点说,这个视图能够返回buffer pool里面一个8K 的data page的下列属性:

(1)该页属于哪个数据库

(2)该页属于数据库哪个文件

(3)该页的Page_ID

(4)该页的类型。可以根据这个来判断此页时索引页还是数据页

(5)该页内有多少行数据

(6)该页有多少可用空间。

(7)该页从磁盘读取以来是否修改过。

有了上面的信息,我们就可以很方便的统计出几种很有用的数据,如下。

1.       Buffer Pool的内存主要是由那个数据库占了?

SELECT count(*)*8  as cached_pages_kb,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 cached_pages_kb DESC;

结果如下:

从上面的结果可以看到数据库AdventureWorks占用了大概30MB左右的缓冲池空间。

注意该DMV 并不返回Buffer Pool里面有关非数据页(如执行计划的缓存等)的信息。也就是说这个DMV并没有返回Buffer Pool里面所有页面的信息。

2.       再具体一点,当前数据库的哪个表或者索引占用Pool缓冲空间最多?

SELECT count(*)*8 AS cached_pages_kb

,obj.name ,obj.index_id,b.type_desc,b.name

FROM sys.dm_os_buffer_descriptors AS bd

INNER JOIN

(

SELECT object_name(object_id) AS name

,index_id ,allocation_unit_id,object_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,object_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

LEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id =obj.index_id

WHERE database_id = db_id()

GROUP BY obj.name, obj.index_id ,b.name,b.type_desc

ORDER BY cached_pages_kb DESC;

输出结果如下 (部分):

从上面的结果可以看到表Individual 在Pool内存里面缓冲最多,可能这个就是经常访问的热表,或者是比较大的表。注意Pool里面的缓冲页是经常变化的。 你如果再跑一次语句,出现在头条的可能是另外一个表了。

3.       Buffer Pool缓冲池里面修改过的页总数大小。这个比较容易:

SELECT count(*)*8  as cached_pages_kb,

convert(varchar(5),convert(decimal(5,2),(100-1.0*(select count(*) fromsys.dm_os_buffer_descriptors b where b.database_id=a.database_id andis_modified=0)/count(*)*100.0)))+'%' modified_percentage

,CASE database_id

WHEN 32767 THEN 'ResourceDb'

ELSE db_name(database_id)

END AS Database_name

FROM sys.dm_os_buffer_descriptors a

GROUP BY db_name(database_id) ,database_id

ORDER BY cached_pages_kb DESC;

结果:

从上面的结果可以看到,AdventureWorks数据库大概有13.84%的数据是修改过的。如果一个数据库的大部分(超过80%) 是修改过的,那么这个数据库写操作非常多。反之如果这个比例接近0,那么该数据库的活动几乎是只读的。读写的比例对磁盘的安排是很重要的。当然还有其他性能数据来获得数据库读写的大概比例,这里限于篇幅就不多谈了。

谁占用了我的Buffer Pool相关推荐

  1. 谁占用了我的Buffer Pool?

     我在做SQL Server 7.0技术支持的时候有客户问我,"我的SQL Server buffer pool很大,有办法知道是哪些对象吃掉我的buffer Pool内存么?比方说,能 ...

  2. 分页缓冲池占用很高怎么解决_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理...

    缓冲池的用处 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只是 InnoDB 对文件系统上一个或几个实际 ...

  3. mysql分页缓冲池占用很高怎么解决_缓冲池(buffer pool),这次彻底懂了!!!

    https://blog.csdn.net/weixin_40009393/article/details/111103350 应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cac ...

  4. mysql 哈希缓存_MySQL Buffer Pool

    1.简介 buffer pool 就是一个缓存,将磁盘中的数据缓存到内存中,对数据的操作改为通过内存进行操作,然后刷盘的操作,提升性能. innodb_buffer_pool_size 控制缓存池的大 ...

  5. Innodb Buffer Pool的三种Page和链表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 王航威 来源 | 公众号「yangyidba」 ...

  6. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  7. 缓冲多少数据_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理

    缓冲池的用处 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引,还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只是 InnoDB 对文件系统上一个或几个实际 ...

  8. mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool

    缓存的重要性 我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中.将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起来 ...

  9. 《DBNotes: Buffer Pool对于缓冲页的链表式管理》

    目录 Buffer Pool回顾 Buffer Pool内部组成 freelist flushlist LRU链表管理以及改进 Buffer Pool回顾 我们知道针对数据库的增删改删操作都是在Buf ...

最新文章

  1. PHP学习笔记-文件操作1
  2. geth bootnodes
  3. 40亿条/秒!Flink流批一体在阿里双11首次落地的背后
  4. 乡镇银行和信用社哪个正规?
  5. Spring Cloud Gateway去掉url前缀
  6. vim配置之snippets代码块
  7. 大数据 挑战 机会_大数据可视化面临哪些挑战
  8. 阿里云服务器安装docker开发环境
  9. 【BERT】BERT的嵌入层是如何实现的?看完你就明白了
  10. adb shell 命令详解
  11. HTML5浏览器测试网站汇总
  12. 使用Bitvise SSH Server的一些设定
  13. 【摄影测量】利用经度L、纬度B、大地高h及heading pitch roll飞行姿态角将IMU惯导坐标系转换到WGS84坐标系
  14. 使用观察者模式进行短信通知、预警日志记录
  15. ISP Pipeline
  16. 星际迷航-发现号-第三季最后一集
  17. 别在找提高C++晦涩难懂的知识了。提高效率!这里有C++STL——全面总结详细教程(附案例解析)(持续更新中)
  18. Rasa 文档 中英文翻译版本 3 - Tutorial: Building Assistants
  19. 14、jmeter+badboy 录制脚本方式(2)
  20. 有MDF文件和LDF文件之后怎么创建数据库

热门文章

  1. Linux下双线双ip访问内网服务器之另类解决办法
  2. vs.net2003在代理下的一个奇怪小问题
  3. springboot配置log4j
  4. mysql-表完成性约束
  5. JQuery Highcharts图表控件使用说明
  6. 如何进行职业生涯规划
  7. Burpsuite中宏的使用
  8. JS----JavaScript中防抖和节流知识概述
  9. Angular2 - [innerHTML] pipe(把字符串里的 /n 替换成 <br/>)
  10. uniapp h5 页面 解决 ios 长按无法保存图片问题(安卓支持此功能)--实现移动端长按保存图片