为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 8
【操作系统】:linux
【CPU】: x86
【问题描述】*:
如何通过查询系统表的方式得知指定表的行数与指定表的数据量大小?
关于表的行数,Oracle中,指定表的行数在all_tables的num_rows字段里有维护,但DM8貌似没有维护这张表,里面的数值都是NULL。
关于表的数据量,之前根据客服的回复,我使用select SEGMENT_NAME,BYTES from dba_segments where segment_type='TABLE’语句查出每张表的bytes字段。但是我对于一张空的表,查出的bytes值为524288,这个值应该是不合理的。
将以下SQL查询结果复制到新的窗口,将最后一行的union all改成分号执行,可得到结果
--查看表的行数 select 'select '''|| table_name ||''',count(*) from '||owner||'.'|| table_name ||' union all' from all_tables where owner=upper('sys') order by table_name;
可以使用系统函数 TABLE_USED_SPACE 得到表对象占用空间的大小,函数参数为模式
名和表名,返回值为占用的页的数目。
SQL> select table_used_space('SYSDBA','TEST'); LINEID TABLE_USED_SPACE('SYSDBA','TEST') ---------- --------------------------------- 1 64
也可以这样查询占用的物理空间
select A.TABLE_NAME,A.tablespace_name,B.OWNER ,A.nrows,B.bytes/1024/1024/1024 useG from (select table_name,tablespace_name, num_rows nrows from all_tables group by TABLE_NAME,tablespace_name,num_rows) as A left join (select owner,segment_name,sum(bytes) bytes from dba_segments where segment_type='TABLE'group by owner,segment_name) as B on A.TABLE_NAME=B.SEGMENT_NAME where A.TABLESPACE_NAME='MAIN' --where B.OWNER not in ('SYS','SYSDBA','SYSAUDITOR','SYSSSO','CTISYS') order by useG desc limit 10;