暂无图片
mysql中能查看到buffer pool中存放的哪些对象吗?
我来答
分享
暂无图片 匿名用户
mysql中能查看到buffer pool中存放的哪些对象吗?

pg中可以使用pg_buffercache 插件来查看现在里面有哪些表,索引等等


mysql中有什么方法查看到吗?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
shunwahⓂ️

Mysql能否知道是哪个数据库,哪个表,占用了buffer Pool么?”针对这个问题可以使用(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,CASEdatabase_idWHEN 32767 THEN ‘ResourceDb’

ELSE db_name(database_id)END ASDatabase_nameFROMsys.dm_os_buffer_descriptorsGROUP BY db_name(database_id) ,database_idORDER BY cached_pages_kb DESC;

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

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

SELECT count(*)*8 AScached_pages_kb

,obj.name ,obj.index_id,b.type_desc,b.nameFROM sys.dm_os_buffer_descriptors ASbdINNER JOIN(SELECT object_name(object_id) ASname

,index_id ,allocation_unit_id,object_id

FROM sys.allocation_units ASauINNER JOIN sys.partitions ASpON au.container_id =p.hobt_idAND(au.type = 1 OR au.type = 3)UNION ALL

SELECT object_name(object_id) ASname

,index_id, allocation_unit_id,object_id

FROM sys.allocation_units ASauINNER JOIN sys.partitions ASpON au.container_id =p.partition_idAND au.type = 2)ASobjON bd.allocation_unit_id =obj.allocation_unit_idLEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id =obj.index_idWHERE database_id = db_id()GROUP BYobj.name, obj.index_id ,b.name,b.type_descORDER BY cached_pages_kb DESC;

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

SELECT count()8 ascached_pages_kb,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

,CASEdatabase_idWHEN 32767 THEN ‘ResourceDb’

ELSE db_name(database_id)END ASDatabase_nameFROMsys.dm_os_buffer_descriptors aGROUP BY db_name(database_id) ,database_idORDER BY cached_pages_kb DESC;

暂无图片 评论
暂无图片 有用 0
手机用户9375
2022-11-01
这是sql server的吗?
大大刺猬

可以查看INFORMATION_SCHEMA.INNODB_BUFFER_PAGE(不建议在生产环境执行).
比如查看db.sbtest1表的索引占用内存

(root@127.0.0.1) [db1]> SELECT INDEX_NAME, COUNT(*) AS Pages,
    ->        ROUND(SUM(IF(COMPRESSED_SIZE = 0, @@GLOBAL.innodb_page_size, COMPRESSED_SIZE))/1024/1024)
    ->        AS 'Total Data (MB)'
    ->        FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
    ->        WHERE TABLE_NAME = '`db1`.`sbtest1`'
    ->        GROUP BY INDEX_NAME;
+------------+-------+-----------------+
| INDEX_NAME | Pages | Total Data (MB) |
+------------+-------+-----------------+
| PRIMARY    |     3 |               0 |
+------------+-------+-----------------+

暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏