一、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'
二、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_VOLUMEfrom dba_tables tleft join dba_segments son t.table_name=s.segment_namewhere s.segment_type like 'TABLE%'
三、DM(达梦数据库):1、首先使用存储过程执行特定用户的表统计行数,否则NUM_ROWS为nullDBMS_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 tleft join dba_segments s on t.table_name=s.segment_namewhere 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 , --实际占用空间MBto_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME--占用空间MBfrom dba_tables tleft join dba_segments s on t.table_name=s.segment_namewhere 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 INTAS 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_COUNTto_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME--占用空间MBfrom dba_tables tleft join dba_segments s on t.table_name=s.segment_namewhere s.segment_type like 'TABLE%'
oracle通过块数计算数据量可能不准确,块大小可以人为改变
oracle的块blocks*8可能超出整型表示的最大范围,用to_number(blocks*8)处理
达梦使用存储过程执行特定用户的表统计行数,再使用num_rows
达梦注意用户可能没有使用TABLE_SCHEMA的权限,部分系统内置模式不在列表范围