Mysql Oracle DM数据库统计表数据量和条数

2025-10-19 18:55:01

1、一、MYSQL:

select TABLE_SCHEMA, TABLE_NAME,CONCAT(round(DATA_LENGTH/1024/1024,2) ,'MB')as TABLE_VOLUME,TABLE_ROWS 

from information_schema.tables 

where  TABLE_TYPE='BASE TABLE'  

2、二、oracle:

如果不含大字段  直接user_tables /dba_tables ,如果有大字段使用user_segments /dba_segments

通过块数计算数据量:to_char(round(s.blocks*8/1024,2),'fm990.0099')||'MB' ,可能不准,block大小可能会变

 

data block :oracle 11g 标准块:8k,支持2-32k,有block header 、free space 、data 组成

-- 如果是分区表, segment_type = 'TABLE PARTITION'

 

 

通过字节数计算数据量:to_char(round(s.BYTES /1024/1024.0,2),'fm99999999990.00')  

 

 

select t.owner TABLE_SCHEMA,TABLE_NAME, num_rows||'' TABLE_ROWS, to_char(round(s.BYTES /1024/1024.0,2),'fm99999999990.00')  TABLE_VOLUME

from dba_tables  t

left join dba_segments s

on t.table_name=s.segment_name

where s.segment_type like 'TABLE%'   

3、三、DM(达梦数据库):

1、首先使用存储过程执行特定用户的表统计行数,否则NUM_ROWS为null

DBMS_STATS.GATHER_SCHEMA_STATS('ROOT',100,TRUE,'FOR ALL TABLE NUM_ROWS AUTO');    

2、使用和oracle一样的sql统计行数和数据量

select t.owner TABLE_SCHEMA,TABLE_NAME, num_rows||'' TABLE_ROWS,

to_char(round(s.BYTES /1024/1024.0,2),'fm99999999990.00') TABLE_VOLUME 

from dba_tables  t

left join dba_segments s 

on t.table_name=s.segment_name

where s.segment_type like 'TABLE%'  and t.owner='ROOT'  

3、通过内置函数获取表数据量

select 

to_char(TABLE_USED_PAGES(t.owner,TABLE_NAME)*to_number(page())/1024/1024.0,'fm99999999990.00')||'MB',

--TABLE_USED_SPACE占用页的数目 要用to_number(page())否则有可能会报数据溢出

to_char(TABLE_USED_PAGES(t.owner,TABLE_NAME)*to_number(page())/1024/1024.0,'fm99999999990.00')||'MB'  

--TABLE_USED_PAGES实际使用页的数目 

from dual; --M为单位 

select t.owner TABLE_SCHEMA,TABLE_NAME, 

TABLE_USED_PAGES(t.owner,TABLE_NAME)*to_number(page())/1024/1024.0||'MB' SJ_TABLE_VOLUME ,  

--实际占用空间MB

to_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME

--占用空间MB

from dba_tables  t

left join dba_segments s on t.table_name=s.segment_name

where s.segment_type like 'TABLE%' and t.owner='ROOT'  

4、通过自定义函数获取表的记录数

创建获取表记录数的函数

CREATE OR REPLACE FUNCTION ROOT.GET_TABLE_COUNT

(SCHEMA_NAME IN VARCHAR(50),TABLE_NAME IN VARCHAR(50)) 

RETURN INT

AS 

NUM_ROWS INT;

V_SQL VARCHAR2(300);      

BEGIN

    V_SQL := 'select count(*) from '||SCHEMA_NAME||'.'||TABLE_NAME;

    EXECUTE IMMEDIATE V_SQL INTO NUM_ROWS;

    RETURN NUM_ROWS;

END; 

使用函数获取num_rows,注意用户可能没有使用TABLE_SCHEMA的权限,部分系统内置

select t.owner TABLE_SCHEMA,TABLE_NAME, ROOT.GET_TABLE_COUNT(t.owner,TABLE_NAME) TABLE_ROWS ,

--自定义函数ROOT.GET_TABLE_COUNT

to_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME

--占用空间MB

from dba_tables  t

left join dba_segments s on t.table_name=s.segment_name

where s.segment_type like 'TABLE%' 

 

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢