查看Buffer Pool使用情况

小灰灰 2022-03-18 07:28 276阅读 0赞
  1. ----源自:微软官方博客论坛
  2. 我的SQL Server buffer pool很大,有办法知道是哪些对象吃掉我的buffer Pool内存么?比方说,能否知道是哪个数据库,哪个表,哪个index占用了buffer Pool么?”针对这个问题可以使用(DMV sys.dm_os_buffer_descriptors。这个DMV非常强大。根据SQL Server 联机丛书,这个视图的作用是 “返回有关 SQL Server 缓冲池中当前所有数据页的信息。可以使用该视图的输出,根据数据库、对象或类型来确定缓冲池内数据库页的分布”。具体点说,这个视图能够返回buffer pool里面一个8K data page的下列属性:
  3. (1)该页属于哪个数据库
  4. (2)该页属于数据库哪个文件
  5. (3)该页的Page_ID
  6. (4)该页的类型。可以根据这个来判断此页时索引页还是数据页
  7. (5)该页内有多少行数据
  8. (6)该页有多少可用空间。
  9. (7)该页从磁盘读取以来是否修改过。
  10. 有了上面的信息,我们就可以很方便的统计出几种很有用的数据,如下。
  11. --1. Buffer Pool的内存主要是由那个数据库占了?
  12. SELECT count(*)*8 as cached_pages_kb,CASE database_id
  13. WHEN 32767 THEN 'ResourceDb'
  14. ELSE db_name(database_id)
  15. END AS Database_name
  16. FROM sys.dm_os_buffer_descriptors
  17. GROUP BY db_name(database_id) ,database_id
  18. ORDER BY cached_pages_kb DESC;
  19. ---注 DMV 并不返回Buffer Pool里面有关非数据页(如执行计划的缓存等)的信息。也就是说这个DMV并没有返回Buffer Pool里面所有页面的信息。
  20. --2. 再具体一点,当前数据库的哪个表或者索引占用Pool缓冲空间最多?
  21. SELECT count(*)*8 AS cached_pages_kb
  22. ,obj.name ,obj.index_id,b.type_desc,b.name
  23. FROM sys.dm_os_buffer_descriptors AS bd
  24. INNER JOIN
  25. (
  26. SELECT object_name(object_id) AS name
  27. ,index_id ,allocation_unit_id,object_id
  28. FROM sys.allocation_units AS au
  29. INNER JOIN sys.partitions AS p
  30. ON au.container_id = p.hobt_id
  31. AND(au.type = 1 OR au.type = 3)
  32. UNION ALL
  33. SELECT object_name(object_id) AS name
  34. ,index_id, allocation_unit_id,object_id
  35. FROM sys.allocation_units AS au
  36. INNER JOIN sys.partitions AS p
  37. ON au.container_id = p.partition_id
  38. AND au.type = 2
  39. ) AS obj
  40. ON bd.allocation_unit_id = obj.allocation_unit_id
  41. LEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id = obj.index_id
  42. WHERE database_id = db_id()
  43. GROUP BY obj.name, obj.index_id ,b.name,b.type_desc
  44. ORDER BY cached_pages_kb DESC;
  45. --3. Buffer Pool缓冲池里面修改过的页总数大小。这个比较容易:
  46. SELECT count(*)*8 as cached_pages_kb,
  47. convert(varchar(5),convert(decimal(5,2),(100-1.0*(select count(*) from sys.dm_os_buffer_descriptors b where b.database_id=a.database_id and is_modified=0)/count(*)*100.0)))+'%' modified_percentage
  48. ,CASE database_id
  49. WHEN 32767 THEN 'ResourceDb'
  50. ELSE db_name(database_id)
  51. END AS Database_name
  52. FROM sys.dm_os_buffer_descriptors a
  53. GROUP BY db_name(database_id) ,database_id
  54. ORDER BY cached_pages_kb DESC;

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL - Buffer Pool

    Buffer Pool 主要用于缓存数据库表的数据页,以提高数据库的读取性能: 1. 缓存数据页:Buffer Pool 是 MySQL 中用于缓存数据页的内存区域。数据页

    相关 InnoDB之Buffer Pool

    对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只不过是Inn

    相关 Mysql Buffer Pool

    Buffer Pool 简介:Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中。Buffer Pool可以用来加速数据的读写,如果Bu