【 使用环境 】测试环境
【 OB or 其他组件 】observer
【 使用版本 】4.1 社区版本
【问题描述】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的空间统计有比较多的维度, 目前的确没有一个特别好的视图来做最简单直接的查询
由于是分布式数据库, 同时支持分区表, 所以就存在几个问题
目前来说, 如果只是想看磁盘占用空间, 可以通过两个组合下
通过 cdb_ob_table_locations 根据table_id找到对应的 ls_id 和 tablet_id
通过 __all_virtual_tablet_sstable_macro_info 可以查看宏块个数, 每个宏块2M可以算出磁盘占用大小, 这个表里的occupy_size 可以看出真实数据大小
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换成你要查的实际信息