oceanbase如何统计某个table的大小,包含表的行数和表占用的磁盘空间?

【 使用环境 】测试环境
【 OB or 其他组件 】observer
【 使用版本 】4.1 社区版本
【问题描述】oceanbase如何统计某个table的大小,包含表的行数和表占用的磁盘空间?
【复现路径】问题出现前后相关操作
【问题现象及影响】

【附件】

你可以在sys租户中使用以下SQL语句查询特定表占用的空间大小,包括行数和表占用的磁盘空间:

select b.table_name,svr_ip,role,a.data_size/1024/1024/1024, b.row_count from __all_virtual_meta_table a,__all_virtual_table b where a.role=1 and a.table_id=b.table_id and b.table_name='<table_name>';

<table_name>替换为您要查询的表的名称。

表的行数, 可以直接 select count来查询, 比较准确, 后台的统计总是会有一定滞后

对于表占用空间来说, ob的空间统计有比较多的维度, 目前的确没有一个特别好的视图来做最简单直接的查询
由于是分布式数据库, 同时支持分区表, 所以就存在几个问题

  1. 一个表会存在多个副本, 还有只读副本
  2. 一个表的多个分区可能分布在不同机器上
  3. 局部索引和全局索引的分布问题

目前来说, 如果只是想看磁盘占用空间, 可以通过两个组合下
通过 cdb_ob_table_locations 根据table_id找到对应的 ls_id 和 tablet_id
通过 __all_virtual_tablet_sstable_macro_info 可以查看宏块个数, 每个宏块2M可以算出磁盘占用大小, 这个表里的occupy_size 可以看出真实数据大小

1 个赞

4.x的ob可以通过如下语句来查询表大小:

select /*+ query_timeout(30000000) */ a.TENANT_ID, a.DATABASE_NAME, a.TABLE_NAME, a.TABLE_ID,

sum(

case

when b.nested_offset = 0 then IFNULL(b.data_block_count+b.index_block_count+b.linked_block_count, 0) * 2 * 1024 * 1024

else IFNULL(b.size, 0)

end

) /1024/1024/1024 as data_size_in_GB

from CDB_OB_TABLE_LOCATIONS a left join __all_virtual_table_mgr b

on a.svr_ip = b.svr_ip and a.svr_port=b.svr_port and a.tenant_id = b.tenant_id and a.LS_ID = b.LS_ID and a.TABLET_ID = b.TABLET_ID

where a.role = 'LEADER' and a.tenant_id = 'xxxx' and a.DATABASE_NAME= 'xxxx' and a.TABLE_NAME = 'xxxx'

and b.table_type >= 10 and b.size > 0 group by a.TABLE_ID;

其中的xxxx换成你要查的实际信息

2 个赞