本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 查看表中数据量与表占用空间|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商
问题现象
systables系统表中的nrows显示数据量与表中实际数据量不符。
找不到哪里记录表和数据库占用空间大小。
解决方法
systables系统表中存放的只是统计数据,需要执行update statistics(统计更新)后才能显示真实行数。可通过以下方法查看真实行数。
1. 非分片表
非分片表在systables中存储了partnum,使用这个值在sysmaster系统库中的sysptnhdr中的partnum连接,表中当前数据行数。
select t.tabname,t.partnum,p.nrows
from systables t, sysmaster:sysptnhdr p
where t.partnum=p.partnum
and t.tabname="tab1";
2.分片表
分片表在systables中的partnum值为0,每个分片的partnum在sysfragments中的partn里,需要将systables和sysfragments使用tabid连接,再与sysmaster系统库中的sysptnhdr连接查询行数。
select t.tabname,t.partnum,f.partition,p.nrows
from sysfragments f, systables t, sysmaster:sysptnhdr p
where f.tabid = t.tabid
and f.partn = p.partnum
and t.tabname = 'tab2';
3.使用数据库命令查询表信息
也可以使用oncheck -pt命令查询表的更详细信息,每个分片都由一组数据输出,Number of rows就是这个分片中的数据条数
[gbasedbt@test dbs_351]$ oncheck -pt testdb:tab2
Your evaluation license will expire on 2025-01-14 00:00:00
TBLspace Report for testdb:gbasedbt.tab2
Table fragment partition datadbs1 in DBspace datadbs1
Physical Address 6:6032
Creation date 01/18/2024 13:26:25
TBLspace Flags 902 Row Locking
TBLspace contains VARCHARS
TBLspace use 4 bit bit-maps
Maximum row size 26
Number of special columns 1
Number of keys 0
Number of extents 1
Current serial value 1
Current SERIAL8 value 1
Current BIGSERIAL value 1
Current REFID value 1
Pagesize (k) 16
First extent size 4
Next extent size 4
Number of pages allocated 4
Number of pages used 2
Number of data pages 1
Number of rows 4
Partition partnum 6291591
Partition lockid 6291591
Extents
Logical Page Physical Page Size Physical Pages
0 6:1763656 4 32
Table fragment partition datadbs2 in DBspace datadbs2
Physical Address 7:40
Creation date 01/18/2024 13:26:25
TBLspace Flags 902 Row Locking
TBLspace contains VARCHARS
TBLspace use 4 bit bit-maps
Maximum row size 26
Number of special columns 1
Number of keys 0
Number of extents 1
Current serial value 1
Current SERIAL8 value 1
Current BIGSERIAL value 1
Current REFID value 1
Pagesize (k) 16
First extent size 4
Next extent size 4
Number of pages allocated 4
Number of pages used 2
Number of data pages 1
Number of rows 4
Partition partnum 7340034
Partition lockid 6291591
Extents
Logical Page Physical Page Size Physical Pages
0 7:424 4 32
4.查询表占用空间大小
从oncheck -pt输出的信息中,可以看到几个值:
Pagesize (k) 16 页大小(kb)
Number of pages allocated 4 已分配页数
Number of pages used 2 已使用页数
Number of data pages 1 数据页数
我们使用 已分配页数 乘 页大小 就可以算出这一个分片占用了数据库的多少空间
已分配页数是sysptnhdr中的nptotal,页大小是sysptnhdr中的pagesize
所以我们可以改造一下查询行数的SQL,查询表在数据库中占用的空间
select t.tabname,t.partnum,f.partition,p.nptotal*p.pagesize total_size
from systables t ,sysfragments f, sysmaster:sysptnhdr p
where f.tabid = t.tabid
and f.partn = p.partnum
and t.tabname = 'tab2';
5.查询数据库占用空间大小
上面的几种查询都是使用本库的systables作为表的基本数据作查询,一次只能查询一个库的表信息,如果我们需要查询实例中所有库的信息,就不太方便了。并且数据库中不只有表会占用很多空间,索引也会占用不少空间,所以要查数据库占用空间大小就不能再像前面一样使用systables查询了。
这时候我们可以使用sysmaster系统库中的systabnames表与sysptnhdr连接筛选数据库名和表名
按库名、表名统计:
select b.dbsname database,b.tabname,a.pagesize,
sum(a.nptotal)*a.pagesize size_allocated,sum(a.npused)*a.pagesize size_used
from sysmaster:sysptnhdr a,sysmaster:systabnames b
where a.partnum = b.partnum
and b.dbsname='testdb'
group by database,tabname,pagesize
按库名统计:
select b.dbsname database,a.pagesize,
sum(a.nptotal)*a.pagesize size_allocated,sum(a.npused)*a.pagesize size_used
from sysmaster:sysptnhdr a,sysmaster:systabnames b
where a.partnum = b.partnum
and b.dbsname='testdb'
group by database,pagesize
也可以再使用FORMAT_UNITS函数来得到更易读的数值
select b.dbsname database,a.pagesize,
FORMAT_UNITS(sum(a.nptotal)*a.pagesize) size_allocated,FORMAT_UNITS(sum(a.npused)*a.pagesize) size_used
from sysmaster:sysptnhdr a,sysmaster:systabnames b
where a.partnum = b.partnum
and b.dbsname='testdb'
group by database,pagesize